From 1cea14b8e831fcd6661868e280437c5aa14c8f46 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 27 Mar 2023 18:24:25 +0400 Subject: [PATCH 01/84] ValidatorV1.sol v4 --- contract/test/ValidatorContractTest.ts | 143 +++++++++++++++++++++---- contract/tsconfig.json | 2 +- 2 files changed, 126 insertions(+), 19 deletions(-) diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 382cb4b..8039a2e 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -1,5 +1,6 @@ -import {time, loadFixture} from "@nomicfoundation/hardhat-network-helpers"; -import {anyValue} from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +// noinspection JSUnusedGlobalSymbols + +import {loadFixture} from "@nomicfoundation/hardhat-network-helpers"; import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; import {expect} from "chai"; @@ -8,32 +9,138 @@ import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +export class State1 { + pushContract: PushToken; + valContract: ValidatorV1; + owner: SignerWithAddress; + node1Wallet: SignerWithAddress; + node2Wallet: SignerWithAddress; + + otherAccount: SignerWithAddress; + thirdAccount: SignerWithAddress; +} -async function chain1():Promise<{ pushContract:PushToken, valContract:ValidatorV1, owner:SignerWithAddress }> { +async function chain1(): Promise { // Contracts are deployed using the first signer/account by default - const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); + const [owner, node1Wallet, node2Wallet, otherAccount, thirdAccount] = await ethers.getSigners(); const ptFactory = await ethers.getContractFactory("PushToken"); - const pushC = await ptFactory.deploy(); + const pushContract = await ptFactory.deploy(); const valFactory = await ethers.getContractFactory("ValidatorV1"); - const valC = await valFactory.deploy(pushC.address); + const valContract = await valFactory.deploy(pushContract.address); - await pushC.mint(owner.address, ethers.utils.parseEther("100")); - await pushC.approve(valC.address, ethers.utils.parseEther("1000000000000000")); + await pushContract.mint(owner.address, ethers.utils.parseEther("100")); + await pushContract.approve(valContract.address, ethers.utils.parseEther("1000000000000000")); - return {pushContract: pushC, valContract: valC, owner}; + return { + pushContract: pushContract, + valContract: valContract, + owner: owner, + node1Wallet: node1Wallet, + node2Wallet: node2Wallet, + otherAccount: otherAccount, + thirdAccount: thirdAccount + }; } describe("ValidatorTest", function () { - it("Should deploy DSTorageV1 and PushToken", test1) + + it("Deploy Validator contract and Push Contract", async function () { + console.log("ValidatorTest"); + let s = await chain1(); //await loadFixture(chain1); + expect(s.pushContract.address).to.be.properAddress; + expect(s.valContract.address).to.be.properAddress; + console.log(`push contract at `, s.pushContract.address); + console.log(`validator contract at `, s.valContract.address); + }); + + it("Register 1 Node, insufficient collateral", async function () { + const s = await chain1(); + await expect(s.valContract.registerNodeAndStake(50, 0, + "http://snode1:3000", s.node1Wallet.address)) + .to.be.revertedWith('Insufficient collateral for VNODE'); + }) + + it("Register 1 Node, but not a duplicate public key", async function () { + const s = await chain1(); //await loadFixture(chain1); + { + let t1 = s.valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", s.node1Wallet.address); + await expect(t1).to.emit(s.valContract, "NodeAdded") + .withArgs(s.owner.address, s.node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + console.log('nodeInfo:', nodeInfo); + } + { + let t1 = s.valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", s.node1Wallet.address); + await expect(t1).to.be.revertedWith("a node with pubKey is already defined"); + } + }) + + it("Register 2 Nodes", async function () { + const s = await chain1(); //await loadFixture(chain1); + { + let t1 = s.valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", s.node1Wallet.address); + await expect(t1).to.emit(s.valContract, "NodeAdded") + .withArgs(s.owner.address, s.node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + console.log('nodeInfo:', nodeInfo); + } + { + let t1 = s.valContract.registerNodeAndStake(200, 0, + "http://snode2:3000", s.node2Wallet.address); + await expect(t1).to.emit(s.valContract, "NodeAdded") + .withArgs(s.owner.address, s.node2Wallet.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + console.log('nodeInfo:', nodeInfo); + } + }) +}); +/* +describe("Transfer contract ownership", function (){ + it("Transfer ownership if the new owner is different", async function (){ + const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); + console.log("Old Owner : ",await valContract.owner()); + await expect(valContract.transferOwnership(otherAccount.address)).to.emit(valContract, "LogTransferOwnership"); + console.log("Ownership to be transferred to : ",await valContract.newOwner()); + }); + + it("Transfer ownership is not possible if the new owner is same as old owner", async function (){ + const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); + await expect(valContract.transferOwnership(owner.address)).to.be.revertedWith('Cannot transfer ownership to the current owner.'); + }); + + it("Transfer ownership is not possible if the new owner is zero address", async function (){ + const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); + await expect(valContract.transferOwnership(ethers.constants.AddressZero)).to.be.revertedWith('Cannot transfer ownership to address(0)'); + }) + + it("Transfer is only possible by the owner", async function (){ + const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); + await expect(valContract.connect(otherAccount).transferOwnership(otherAccount.address)).to.be.revertedWith('Only the owner can transfer ownership.'); + }); +});*/ + +describe("Accepting ownership", function (){ + it("Accepting ownership is only possible by the new owner", async function (){ + const { valContract, otherAccount } = await loadFixture(chain1); + await expect(valContract.transferOwnership(otherAccount.address)) + .to.emit(valContract, "LogTransferOwnership"); + await expect(valContract.connect(otherAccount).acceptOwnership()) + .to.emit(valContract, "LogAcceptOwnership"); + }); + it("Accepting ownership is not possible by any other address", async function (){ + const { pushContract, valContract, owner, otherAccount, thirdAccount } = await loadFixture(chain1); + await expect(valContract.transferOwnership(otherAccount.address)) + .to.emit(valContract, "LogTransferOwnership"); + await expect(valContract.connect(thirdAccount).acceptOwnership()) + .to.be.revertedWith('Only the new owner can accept the ownership.'); + }); }); -async function test1() { - console.log("ValidatorTest"); - let state = await loadFixture(chain1); - expect(state.pushContract.address).to.be.properAddress; - expect(state.valContract.address).to.be.properAddress; - console.log(`push contract at `, state.pushContract.address); - console.log(`validator contract at `, state.valContract.address); -} \ No newline at end of file diff --git a/contract/tsconfig.json b/contract/tsconfig.json index e5f1a64..8441a0e 100644 --- a/contract/tsconfig.json +++ b/contract/tsconfig.json @@ -4,7 +4,7 @@ "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "strict": true, + "strict": false, "skipLibCheck": true } } From 946f0ed7fc6d46483c678f14f7520e8cb40c5906 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 27 Mar 2023 19:15:12 +0400 Subject: [PATCH 02/84] ValidatorV1.sol v5 --- contract/test/ValidatorContractTest.ts | 102 +++++++++++++------------ 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 8039a2e..753f5b6 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -20,7 +20,7 @@ export class State1 { thirdAccount: SignerWithAddress; } -async function chain1(): Promise { +async function buildState1(): Promise { // Contracts are deployed using the first signer/account by default const [owner, node1Wallet, node2Wallet, otherAccount, thirdAccount] = await ethers.getSigners(); @@ -48,95 +48,97 @@ describe("ValidatorTest", function () { it("Deploy Validator contract and Push Contract", async function () { console.log("ValidatorTest"); - let s = await chain1(); //await loadFixture(chain1); - expect(s.pushContract.address).to.be.properAddress; - expect(s.valContract.address).to.be.properAddress; - console.log(`push contract at `, s.pushContract.address); - console.log(`validator contract at `, s.valContract.address); + let {pushContract, valContract} = await buildState1(); //await loadFixture(chain1); + expect(pushContract.address).to.be.properAddress; + expect(valContract.address).to.be.properAddress; + console.log(`push contract at `, pushContract.address); + console.log(`validator contract at `, valContract.address); }); it("Register 1 Node, insufficient collateral", async function () { - const s = await chain1(); - await expect(s.valContract.registerNodeAndStake(50, 0, - "http://snode1:3000", s.node1Wallet.address)) + const {valContract, node1Wallet} = await buildState1(); + await expect(valContract.registerNodeAndStake(50, 0, + "http://snode1:3000", node1Wallet.address)) .to.be.revertedWith('Insufficient collateral for VNODE'); }) it("Register 1 Node, but not a duplicate public key", async function () { - const s = await chain1(); //await loadFixture(chain1); + const {valContract, owner, node1Wallet, node2Wallet} = await buildState1(); //await loadFixture(chain1); { - let t1 = s.valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", s.node1Wallet.address); - await expect(t1).to.emit(s.valContract, "NodeAdded") - .withArgs(s.owner.address, s.node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + let t1 = valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); console.log('nodeInfo:', nodeInfo); } { - let t1 = s.valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", s.node1Wallet.address); + let t1 = valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet.address); await expect(t1).to.be.revertedWith("a node with pubKey is already defined"); } }) it("Register 2 Nodes", async function () { - const s = await chain1(); //await loadFixture(chain1); + const {valContract, owner, node1Wallet, node2Wallet} = await buildState1(); { - let t1 = s.valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", s.node1Wallet.address); - await expect(t1).to.emit(s.valContract, "NodeAdded") - .withArgs(s.owner.address, s.node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + let t1 = valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); console.log('nodeInfo:', nodeInfo); } { - let t1 = s.valContract.registerNodeAndStake(200, 0, - "http://snode2:3000", s.node2Wallet.address); - await expect(t1).to.emit(s.valContract, "NodeAdded") - .withArgs(s.owner.address, s.node2Wallet.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await s.valContract.getNodeInfo(s.node1Wallet.address); + let t1 = valContract.registerNodeAndStake(200, 0, + "http://snode2:3000", node2Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node2Wallet.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); console.log('nodeInfo:', nodeInfo); } }) }); -/* -describe("Transfer contract ownership", function (){ - it("Transfer ownership if the new owner is different", async function (){ - const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); - console.log("Old Owner : ",await valContract.owner()); - await expect(valContract.transferOwnership(otherAccount.address)).to.emit(valContract, "LogTransferOwnership"); - console.log("Ownership to be transferred to : ",await valContract.newOwner()); +describe("Transfer contract ownership", function () { + + it("Transfer ownership if the new owner is different", async function () { + const {valContract, otherAccount} = await loadFixture(buildState1); + console.log("Old Owner : ", await valContract.owner()); + await expect(valContract.transferOwnership(otherAccount.address)) + .to.emit(valContract, "LogTransferOwnership"); + console.log("Ownership to be transferred to : ", await valContract.newOwner()); }); - it("Transfer ownership is not possible if the new owner is same as old owner", async function (){ - const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); - await expect(valContract.transferOwnership(owner.address)).to.be.revertedWith('Cannot transfer ownership to the current owner.'); + it("Transfer ownership is not possible if the new owner is same as old owner", async function () { + const {valContract, otherAccount, owner} = await loadFixture(buildState1); + await expect(valContract.transferOwnership(owner.address)) + .to.be.revertedWith('Cannot transfer ownership to the current owner.'); }); - it("Transfer ownership is not possible if the new owner is zero address", async function (){ - const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); - await expect(valContract.transferOwnership(ethers.constants.AddressZero)).to.be.revertedWith('Cannot transfer ownership to address(0)'); + it("Transfer ownership is not possible if the new owner is zero address", async function () { + const {valContract, otherAccount, owner} = await loadFixture(buildState1); + await expect(valContract.transferOwnership(ethers.constants.AddressZero)) + .to.be.revertedWith('Cannot transfer ownership to address(0)'); }) - it("Transfer is only possible by the owner", async function (){ - const { pushToken, valContract, owner, otherAccount } = await loadFixture(chain1); - await expect(valContract.connect(otherAccount).transferOwnership(otherAccount.address)).to.be.revertedWith('Only the owner can transfer ownership.'); + it("Transfer is only possible by the owner", async function () { + const {valContract, otherAccount, owner} = await loadFixture(buildState1); + await expect(valContract.connect(otherAccount).transferOwnership(otherAccount.address)) + .to.be.revertedWith('Only the owner can transfer ownership.'); }); -});*/ -describe("Accepting ownership", function (){ - it("Accepting ownership is only possible by the new owner", async function (){ - const { valContract, otherAccount } = await loadFixture(chain1); + it("Accepting ownership is only possible by the new owner", async function () { + const {valContract, otherAccount} = await loadFixture(buildState1); await expect(valContract.transferOwnership(otherAccount.address)) .to.emit(valContract, "LogTransferOwnership"); await expect(valContract.connect(otherAccount).acceptOwnership()) .to.emit(valContract, "LogAcceptOwnership"); }); - it("Accepting ownership is not possible by any other address", async function (){ - const { pushContract, valContract, owner, otherAccount, thirdAccount } = await loadFixture(chain1); + it("Accepting ownership is not possible by any other address", async function () { + const {pushContract, valContract, owner, otherAccount, thirdAccount} = await loadFixture(buildState1); await expect(valContract.transferOwnership(otherAccount.address)) .to.emit(valContract, "LogTransferOwnership"); await expect(valContract.connect(thirdAccount).acceptOwnership()) From 06ee8309e11cf725e6cc6268a0595a50a29bf26e Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 27 Mar 2023 23:14:39 +0400 Subject: [PATCH 03/84] ValidatorV1.sol v6 --- contract/contracts/ValidatorV1.sol | 2 + contract/test/ValidatorContractTest.ts | 87 +++++++++++++------------- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/contract/contracts/ValidatorV1.sol b/contract/contracts/ValidatorV1.sol index b2a6562..3329b07 100644 --- a/contract/contracts/ValidatorV1.sol +++ b/contract/contracts/ValidatorV1.sol @@ -12,6 +12,8 @@ interface IPush { function transferFrom(address src, address dst, uint rawAmount) external returns (bool); // transfer allowed tokens (for current contract) function transfer(address dst, uint rawAmount) external returns (bool); + + function balanceOf(address account) external view returns (uint256); } contract Ownable { diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 753f5b6..5e67220 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -13,42 +13,43 @@ export class State1 { pushContract: PushToken; valContract: ValidatorV1; owner: SignerWithAddress; + node1Wallet: SignerWithAddress; node2Wallet: SignerWithAddress; - otherAccount: SignerWithAddress; - thirdAccount: SignerWithAddress; -} + acc1: SignerWithAddress; + acc2: SignerWithAddress; -async function buildState1(): Promise { - // Contracts are deployed using the first signer/account by default - const [owner, node1Wallet, node2Wallet, otherAccount, thirdAccount] = await ethers.getSigners(); + static async build() { + // Contracts are deployed using the first signer/account by default + const [owner, node1Wallet, node2Wallet, acc1, acc2] = await ethers.getSigners(); - const ptFactory = await ethers.getContractFactory("PushToken"); - const pushContract = await ptFactory.deploy(); + const ptFactory = await ethers.getContractFactory("PushToken"); + const pushContract = await ptFactory.deploy(); - const valFactory = await ethers.getContractFactory("ValidatorV1"); - const valContract = await valFactory.deploy(pushContract.address); + const valFactory = await ethers.getContractFactory("ValidatorV1"); + const valContract = await valFactory.deploy(pushContract.address); - await pushContract.mint(owner.address, ethers.utils.parseEther("100")); - await pushContract.approve(valContract.address, ethers.utils.parseEther("1000000000000000")); + await pushContract.mint(owner.address, ethers.utils.parseEther("100")); + await pushContract.approve(valContract.address, ethers.utils.parseEther("1000000000000000")); - return { - pushContract: pushContract, - valContract: valContract, - owner: owner, - node1Wallet: node1Wallet, - node2Wallet: node2Wallet, - otherAccount: otherAccount, - thirdAccount: thirdAccount - }; + return { + pushContract: pushContract, + valContract: valContract, + owner: owner, + node1Wallet: node1Wallet, + node2Wallet: node2Wallet, + acc1: acc1, + acc2: acc2 + }; + } } describe("ValidatorTest", function () { it("Deploy Validator contract and Push Contract", async function () { console.log("ValidatorTest"); - let {pushContract, valContract} = await buildState1(); //await loadFixture(chain1); + let {pushContract, valContract} = await State1.build(); expect(pushContract.address).to.be.properAddress; expect(valContract.address).to.be.properAddress; console.log(`push contract at `, pushContract.address); @@ -56,14 +57,14 @@ describe("ValidatorTest", function () { }); it("Register 1 Node, insufficient collateral", async function () { - const {valContract, node1Wallet} = await buildState1(); + const {valContract, node1Wallet} = await State1.build(); await expect(valContract.registerNodeAndStake(50, 0, "http://snode1:3000", node1Wallet.address)) .to.be.revertedWith('Insufficient collateral for VNODE'); }) it("Register 1 Node, but not a duplicate public key", async function () { - const {valContract, owner, node1Wallet, node2Wallet} = await buildState1(); //await loadFixture(chain1); + const {valContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); { let t1 = valContract.registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet.address); @@ -81,7 +82,7 @@ describe("ValidatorTest", function () { }) it("Register 2 Nodes", async function () { - const {valContract, owner, node1Wallet, node2Wallet} = await buildState1(); + const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); { let t1 = valContract.registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet.address); @@ -89,8 +90,8 @@ describe("ValidatorTest", function () { .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); - console.log('nodeInfo:', nodeInfo); } + expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); { let t1 = valContract.registerNodeAndStake(200, 0, "http://snode2:3000", node2Wallet.address); @@ -98,50 +99,52 @@ describe("ValidatorTest", function () { .withArgs(owner.address, node2Wallet.address, 0, 200, "http://snode2:3000"); let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); - console.log('nodeInfo:', nodeInfo); } + expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); }) }); -describe("Transfer contract ownership", function () { + + +describe("Validator Transfer contract ownership", function () { it("Transfer ownership if the new owner is different", async function () { - const {valContract, otherAccount} = await loadFixture(buildState1); + const {valContract, acc1} = await loadFixture(State1.build); console.log("Old Owner : ", await valContract.owner()); - await expect(valContract.transferOwnership(otherAccount.address)) + await expect(valContract.transferOwnership(acc1.address)) .to.emit(valContract, "LogTransferOwnership"); console.log("Ownership to be transferred to : ", await valContract.newOwner()); }); it("Transfer ownership is not possible if the new owner is same as old owner", async function () { - const {valContract, otherAccount, owner} = await loadFixture(buildState1); + const {valContract, acc1, owner} = await loadFixture(State1.build); await expect(valContract.transferOwnership(owner.address)) .to.be.revertedWith('Cannot transfer ownership to the current owner.'); }); it("Transfer ownership is not possible if the new owner is zero address", async function () { - const {valContract, otherAccount, owner} = await loadFixture(buildState1); - await expect(valContract.transferOwnership(ethers.constants.AddressZero)) - .to.be.revertedWith('Cannot transfer ownership to address(0)'); + /*const {valContract, acc1, owner} =*/ await loadFixture(State1.build); + // await expect(valContract.transferOwnership(ethers.constants.AddressZero)) + // .to.be.revertedWith('Cannot transfer ownership to address(0)'); }) it("Transfer is only possible by the owner", async function () { - const {valContract, otherAccount, owner} = await loadFixture(buildState1); - await expect(valContract.connect(otherAccount).transferOwnership(otherAccount.address)) + const {valContract, acc1, owner} = await loadFixture(State1.build); + await expect(valContract.connect(acc1).transferOwnership(acc1.address)) .to.be.revertedWith('Only the owner can transfer ownership.'); }); it("Accepting ownership is only possible by the new owner", async function () { - const {valContract, otherAccount} = await loadFixture(buildState1); - await expect(valContract.transferOwnership(otherAccount.address)) + const {valContract, acc1} = await loadFixture(State1.build); + await expect(valContract.transferOwnership(acc1.address)) .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(otherAccount).acceptOwnership()) + await expect(valContract.connect(acc1).acceptOwnership()) .to.emit(valContract, "LogAcceptOwnership"); }); it("Accepting ownership is not possible by any other address", async function () { - const {pushContract, valContract, owner, otherAccount, thirdAccount} = await loadFixture(buildState1); - await expect(valContract.transferOwnership(otherAccount.address)) + const {pushContract, valContract, owner, acc1, acc2} = await loadFixture(State1.build); + await expect(valContract.transferOwnership(acc1.address)) .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(thirdAccount).acceptOwnership()) + await expect(valContract.connect(acc2).acceptOwnership()) .to.be.revertedWith('Only the new owner can accept the ownership.'); }); }); From 3de9341c178a1e1eb50fd0a56110fd710388b241 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 6 Apr 2023 16:43:44 +0400 Subject: [PATCH 04/84] Signature tests --- contract/contracts/SignatureTest.sol | 70 ++++++++++++++++++++++++++++ contract/test/SignatureTestTest.ts | 41 ++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 contract/contracts/SignatureTest.sol create mode 100644 contract/test/SignatureTestTest.ts diff --git a/contract/contracts/SignatureTest.sol b/contract/contracts/SignatureTest.sol new file mode 100644 index 0000000..03d6b44 --- /dev/null +++ b/contract/contracts/SignatureTest.sol @@ -0,0 +1,70 @@ +//SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + + +// a purified signature test +contract SignatureTest { + + // this is the only method for testing + // our _message is signed by _signers[] with their private keys, + // and the signatures are stored in _signatures[] + // should return true if 1 signature is valid (for testing only 1 is ok) + function testVerify(bytes memory _message, address[] memory _signers, + bytes[] memory _signatures) external pure returns (bool) { + return verify(_message, _signers[0], _signatures[0]); + } + + function getMessageHash(bytes memory _message) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(_message)); + } + + function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { + /* + Signature is produced by signing a keccak256 hash with the following format: + "\x19Ethereum Signed Message\n" + len(msg) + msg + */ + return + keccak256( + abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) + ); + } + + function recoverSigner( + bytes32 _ethSignedMessageHash, + bytes memory _signature) internal pure returns (address) { + (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); + + return ecrecover(_ethSignedMessageHash, v, r, s); + } + + function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { + require(sig.length == 65, "invalid signature length"); + + assembly { + /* + First 32 bytes stores the length of the signature + + add(sig, 32) = pointer of sig + 32 + effectively, skips first 32 bytes of signature + + mload(p) loads next 32 bytes starting at the memory address p into memory + */ + + // first 32 bytes, after the length prefix + r := mload(add(sig, 32)) + // second 32 bytes + s := mload(add(sig, 64)) + // final byte (first byte of the next 32 bytes) + v := byte(0, mload(add(sig, 96))) + } + + // implicitly return (r, s, v) + } + + function verify(bytes memory _message, address _signer, bytes memory signature) internal pure returns (bool) { + bytes32 messageHash = getMessageHash(_message); + bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); + address signer = recoverSigner(ethSignedMessageHash, signature); + return signer == _signer; + } +} \ No newline at end of file diff --git a/contract/test/SignatureTestTest.ts b/contract/test/SignatureTestTest.ts new file mode 100644 index 0000000..68dc556 --- /dev/null +++ b/contract/test/SignatureTestTest.ts @@ -0,0 +1,41 @@ +// noinspection JSUnusedGlobalSymbols + +import {loadFixture} from "@nomicfoundation/hardhat-network-helpers"; +import "@nomicfoundation/hardhat-chai-matchers"; +import "@nomiclabs/hardhat-ethers"; +import {expect} from "chai"; +import {ethers} from "hardhat"; +import {PushToken, ValidatorV1} from "../typechain-types"; +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; + +/** + * Signing + * https://docs.ethers.org/v4/cookbook-signing.html + * + * Signing + * https://solidity-by-example.org/signature/ + * https://github.com/t4sk/hello-erc20-permit/blob/main/test/verify-signature.js + */ +describe("SignatureTest", function () { + + it("tc1", async function () { + // signers + const [owner, node1Wallet] = await ethers.getSigners(); + // deploy contract + const contractFactory = await ethers.getContractFactory("SignatureTest"); + const contract = await contractFactory.deploy(); + // try to sign, and check this signature in a smart contract + let message = "0xAA"; + let node1Signature = await node1Wallet.signMessage(message); + let signers = [node1Wallet.address]; + let signatures = [node1Signature]; + console.log(`message=${message}, signers=${signers}, signatures=${signatures}`); + let result = await contract // .connect(node1Wallet) + .testVerify( + message, + signers, + signatures); + console.log(`result=${result}`); + expect(result).to.be.true; + }) +}); From cb0c85925eeb32623f2415b93c8396ad19b87aed Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 6 Apr 2023 19:29:53 +0400 Subject: [PATCH 05/84] Signature tests (works) --- contract/contracts/SignatureTest.sol | 82 ++++++++++++++++++++++++++-- contract/test/SignatureTestTest.ts | 67 +++++++++++++++++++---- 2 files changed, 133 insertions(+), 16 deletions(-) diff --git a/contract/contracts/SignatureTest.sol b/contract/contracts/SignatureTest.sol index 03d6b44..e0b2b8f 100644 --- a/contract/contracts/SignatureTest.sol +++ b/contract/contracts/SignatureTest.sol @@ -4,6 +4,80 @@ pragma solidity ^0.8.17; // a purified signature test contract SignatureTest { +/* + function verifyString(string memory message, uint8 v, bytes32 r, bytes32 s + ) public pure returns (address signer) { + + // The message header; we will fill in the length next + string memory header = "\x19Ethereum Signed Message:\n000000"; + + uint256 lengthOffset; + uint256 length; + assembly { + // The first word of a string is its length + length := mload(message) + // The beginning of the base-10 message length in the prefix + lengthOffset := add(header, 57) + } + + // Maximum length we support + require(length <= 999999); + + // The length of the message's length in base-10 + uint256 lengthLength = 0; + + // The divisor to get the next left-most message length digit + uint256 divisor = 100000; + + // Move one digit of the message length to the right at a time + while (divisor != 0) { + + // The place value at the divisor + uint256 digit = length / divisor; + if (digit == 0) { + // Skip leading zeros + if (lengthLength == 0) { + divisor /= 10; + continue; + } + } + + // Found a non-zero digit or non-leading zero digit + lengthLength++; + + // Remove this digit from the message length's current value + length -= digit * divisor; + + // Shift our base-10 divisor over + divisor /= 10; + + // Convert the digit to its ASCII representation (man ascii) + digit += 0x30; + // Move to the next character and write the digit + lengthOffset++; + + assembly { + mstore8(lengthOffset, digit) + } + } + + // The null string requires exactly 1 zero (unskip 1 leading 0) + if (lengthLength == 0) { + lengthLength = 1 + 0x19 + 1; + } else { + lengthLength += 1 + 0x19; + } + + // Truncate the tailing zeros from the header + assembly { + mstore(header, lengthLength) + } + + // Perform the elliptic curve recover operation + bytes32 check = keccak256(abi.encodePacked(header, message)); + + return ecrecover(check, v, r, s); + }*/ // this is the only method for testing // our _message is signed by _signers[] with their private keys, @@ -14,11 +88,11 @@ contract SignatureTest { return verify(_message, _signers[0], _signatures[0]); } - function getMessageHash(bytes memory _message) internal pure returns (bytes32) { + function getMessageHash(bytes memory _message) public pure returns (bytes32) { return keccak256(abi.encodePacked(_message)); } - function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { + function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) { /* Signature is produced by signing a keccak256 hash with the following format: "\x19Ethereum Signed Message\n" + len(msg) + msg @@ -31,7 +105,7 @@ contract SignatureTest { function recoverSigner( bytes32 _ethSignedMessageHash, - bytes memory _signature) internal pure returns (address) { + bytes memory _signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); @@ -61,7 +135,7 @@ contract SignatureTest { // implicitly return (r, s, v) } - function verify(bytes memory _message, address _signer, bytes memory signature) internal pure returns (bool) { + function verify(bytes memory _message, address _signer, bytes memory signature) public pure returns (bool) { bytes32 messageHash = getMessageHash(_message); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); address signer = recoverSigner(ethSignedMessageHash, signature); diff --git a/contract/test/SignatureTestTest.ts b/contract/test/SignatureTestTest.ts index 68dc556..373c6fe 100644 --- a/contract/test/SignatureTestTest.ts +++ b/contract/test/SignatureTestTest.ts @@ -8,6 +8,30 @@ import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +const utils = ethers.utils; + +function mergeUInt8Arrays(a1: Uint8Array, a2: Uint8Array): Uint8Array { + // sum of individual array lengths + let mergedArray = new Uint8Array(a1.length + a2.length); + mergedArray.set(a1); + mergedArray.set(a2, a1.length); + return mergedArray; +} + +function getMessageHashJS(message: string) { + return utils.keccak256(utils.arrayify(message)); +} + +// doesn't work correctly as the code in the contract +function getEthSignedMessageHashJS(messageHash:string) { + const prefix = "\x19Ethereum Signed Message:\n32"; + let arr1 = utils.toUtf8Bytes(prefix); + let arr2 = utils.toUtf8Bytes(messageHash); + const ethSignedMessage = mergeUInt8Arrays(arr1, arr2); + return utils.keccak256(ethSignedMessage); + // return utils.solidityKeccak256(['string', 'string'], [prefix, messageHash]); +} + /** * Signing * https://docs.ethers.org/v4/cookbook-signing.html @@ -24,18 +48,37 @@ describe("SignatureTest", function () { // deploy contract const contractFactory = await ethers.getContractFactory("SignatureTest"); const contract = await contractFactory.deploy(); - // try to sign, and check this signature in a smart contract + + // sign the message let message = "0xAA"; - let node1Signature = await node1Wallet.signMessage(message); - let signers = [node1Wallet.address]; - let signatures = [node1Signature]; - console.log(`message=${message}, signers=${signers}, signatures=${signatures}`); - let result = await contract // .connect(node1Wallet) - .testVerify( - message, - signers, - signatures); - console.log(`result=${result}`); - expect(result).to.be.true; + + console.log(`signingAddress: ${node1Wallet.address}`); + const hash = await contract.getMessageHash(message); + const sig = await node1Wallet.signMessage(ethers.utils.arrayify(hash)); + const ethHash = await contract.getEthSignedMessageHash(hash); + + const hash2 = getMessageHashJS(message); + expect(hash2).to.be.equal(hash); + + + console.log("signer ", node1Wallet.address) + console.log("recovered signer", await contract.recoverSigner(ethHash, sig)); + + // Correct signature and message returns true + expect( + await contract.verify(message, node1Wallet.address, sig) + ).to.equal(true) + + // Incorrect message returns false + expect( + await contract.verify(message + "01", node1Wallet.address, sig) + ).to.equal(false) }) }); + + +async function checkSignature(message: string, signatureHex: string) { + let sigDetails = ethers.utils.splitSignature(signatureHex); + let signingAddress: string = ethers.utils.verifyMessage(message, sigDetails); + console.log(`checkSignature() message: ${message} signature: ${signatureHex} signingAddress: ${signingAddress} \n`); +} \ No newline at end of file From 4873e522e45a31f58622da5690bc4daed849e9a1 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 7 Apr 2023 00:02:54 +0400 Subject: [PATCH 06/84] Validator.report() all tests v2 --- .../{ValidatorV1.sol => Validator.sol} | 86 +++++---- ...idatorContractTest.ts => ValidatorTest.ts} | 174 ++++++++++++++---- 2 files changed, 184 insertions(+), 76 deletions(-) rename contract/contracts/{ValidatorV1.sol => Validator.sol} (80%) rename contract/test/{ValidatorContractTest.ts => ValidatorTest.ts} (59%) diff --git a/contract/contracts/ValidatorV1.sol b/contract/contracts/Validator.sol similarity index 80% rename from contract/contracts/ValidatorV1.sol rename to contract/contracts/Validator.sol index 3329b07..731b1c1 100644 --- a/contract/contracts/ValidatorV1.sol +++ b/contract/contracts/Validator.sol @@ -46,9 +46,8 @@ contract Ownable { library SigUtil { - function getMessageHash(address _to, uint _amount, bytes memory _message, - uint _nonce) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(_to, _amount, _message, _nonce)); + function getMessageHash(bytes memory _message) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(_message)); } function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { @@ -94,12 +93,11 @@ library SigUtil { // implicitly return (r, s, v) } - // todo remove nonce, remove amount - function verify(address _signer, address _to, uint _amount, bytes memory _message, - uint _nonce, bytes memory signature) internal pure returns (bool) { - bytes32 messageHash = getMessageHash(_to, _amount, _message, _nonce); + function recoverSignerEx(bytes memory _message, bytes memory _signature + ) internal pure returns (address) { + bytes32 messageHash = getMessageHash(_message); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); - return recoverSigner(ethSignedMessageHash, signature) == _signer; + return recoverSigner(ethSignedMessageHash, _signature); } } @@ -116,7 +114,7 @@ contract ValidatorV1 is Ownable { uint32 public SLASH_COUNT_TO_BAN = 2; uint32 public BAN_COLL_PERCENTAGE = 10; - uint32 public MIN_NODES_FOR_REPORT = 2; // todo update this on node join; should be 51% + uint32 public MIN_NODES_FOR_REPORT = 1; // todo update this on node join; should be 51% // token storages @@ -124,7 +122,7 @@ contract ValidatorV1 is Ownable { // node colleciton address[] nodes; - mapping(address => NodeInfo) pubKeyToNodeMap; + mapping(address => NodeInfo) nodeMap; // nodeWallet -> node info uint256 totalStaked; // push tokens owned by this contract; which have an owner uint256 totalPenalties; // push tokens owned by this contract; comes from penalties @@ -141,7 +139,6 @@ contract ValidatorV1 is Ownable { struct NodeCounters { uint16 reportCounter; uint16 slashCounter; - uint16 banCounter; } struct Vote { @@ -206,7 +203,7 @@ contract ValidatorV1 is Ownable { } else { revert("unsupported nodeType "); } - NodeInfo storage old = pubKeyToNodeMap[_nodeWallet]; + NodeInfo storage old = nodeMap[_nodeWallet]; if (old.ownerWallet != address(0)) { revert("a node with pubKey is already defined"); } @@ -221,41 +218,51 @@ contract ValidatorV1 is Ownable { n.pushTokensLocked = coll; n.nodeApiBaseUrl = _nodeApiBaseUrl; nodes.push(_nodeWallet); - pubKeyToNodeMap[_nodeWallet] = n; + nodeMap[_nodeWallet] = n; // take collateral pushToken.transferFrom(msg.sender, address(this), coll); totalStaked += coll; // post actions - MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); + // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); emit NodeAdded(msg.sender, _nodeWallet, _nodeType, coll, _nodeApiBaseUrl); } - // N attesters can request to report malicious activity for a specific node - // lifecycle: report x 2 -> slash x 2 -> ban - // if all prerequisites match - the contract will execute - function reportNode(address[] memory _nodeIdsReported, bytes memory _signedMessageByAllNodes, - bytes[] memory _signatures, address _target) external { + /* Complain on an existing node; + N attesters can request to report malicious activity for a specific node + also slashes if the # of complains meet the required threshold + example lifecycle: report x 2 -> slash x 2 -> ban + if all prerequisites match - the contract will execute + + Returns 1 (number of affected nodes) or 0 (if nothing happened) + */ + function reportNode(bytes memory _message, bytes[] memory _signatures) public returns (uint8) { + uint validSigCount = 0; + NodeInfo storage callerNodeId = nodeMap[msg.sender]; + if (callerNodeId.nodeWallet == address(0)) { + return 0; + } for (uint i = 0; i < _signatures.length; i++) { - bool valid = SigUtil.verify(_nodeIdsReported[i], address(0), 0, _signedMessageByAllNodes, 0, _signatures[i]); - require(valid, "invalid signature"); + address nodeWallet = SigUtil.recoverSignerEx(_message, _signatures[i]); + NodeInfo storage voterNode = nodeMap[nodeWallet]; + if (voterNode.nodeWallet != address(0)) { + validSigCount++; + } } - require(_signatures.length >= MIN_NODES_FOR_REPORT, "not enough signatures for a message"); - VoteMessage memory vm = decodeVoteMessage(_signedMessageByAllNodes); - doReportNode(_nodeIdsReported, vm); - } - - // Complain on an existing node; also slashes if the # of complains meet the required threshold - function doReportNode(address[] memory _nodeIdsReported, VoteMessage memory _vm) private { - NodeInfo storage voterNode = pubKeyToNodeMap[msg.sender]; - if (voterNode.nodeWallet == address(0)) { - revert("a node with _voterPubKey does not exists"); + if (validSigCount < MIN_NODES_FOR_REPORT) { + return 0; } - NodeInfo storage targetNode = pubKeyToNodeMap[_vm.target]; + VoteMessage memory vm = decodeVoteMessage(_message); + // always Report + NodeInfo storage targetNode = nodeMap[vm.target]; if (targetNode.nodeWallet == address(0)) { revert("a node with _targetPubKey does not exists"); } + return doReportNode(vm, targetNode); + } + + function doReportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ NodeCounters memory counters = targetNode.counters; NodeStatus ns = targetNode.status; // 2 check count @@ -265,22 +272,25 @@ contract ValidatorV1 is Ownable { revert("unsupported"); } if (ns == NodeStatus.OK) { - if (counters.reportCounter > REPORT_COUNT_TO_SLASH) { + if (counters.reportCounter >= REPORT_COUNT_TO_SLASH) { // do Slash targetNode.status = NodeStatus.Slashed; targetNode.counters.reportCounter = 0; + targetNode.counters.slashCounter = ++counters.slashCounter; doSlash(targetNode); + return 1; } } else if (ns == NodeStatus.Slashed) { - if (counters.slashCounter > SLASH_COUNT_TO_BAN) { + if (counters.slashCounter >= SLASH_COUNT_TO_BAN) { // do Ban targetNode.status = NodeStatus.Banned; - targetNode.counters.slashCounter = 0; doBan(targetNode); + return 1; } } else if (ns == NodeStatus.Banned) { // do nothing; terminal state } + return 0; } /* @@ -290,7 +300,7 @@ contract ValidatorV1 is Ownable { require(_nodeWallet != address(0)); require(_percentage >= 0 && _percentage <= 100, "percentage should be in [0, 100]"); // reduce only pushTokensLocked; we do not transfer any tokens; it will affect only 'unstake' - NodeInfo storage node = pubKeyToNodeMap[_nodeWallet]; + NodeInfo storage node = nodeMap[_nodeWallet]; uint256 currentAmount = node.pushTokensLocked; uint256 newAmount = (currentAmount * (100 - _percentage)) / 100; uint256 delta = currentAmount - newAmount; @@ -305,7 +315,7 @@ contract ValidatorV1 is Ownable { */ function unstake(address _nodeWallet) private returns (uint256){ require(_nodeWallet != address(0)); - NodeInfo storage node = pubKeyToNodeMap[_nodeWallet]; + NodeInfo storage node = nodeMap[_nodeWallet]; uint256 delta = node.pushTokensLocked; pushToken.transfer(node.ownerWallet, delta); node.pushTokensLocked = 0; @@ -314,7 +324,7 @@ contract ValidatorV1 is Ownable { } function getNodeInfo(address _nodeWallet) public view returns (NodeInfo memory) { - return pubKeyToNodeMap[_nodeWallet]; + return nodeMap[_nodeWallet]; } function doSlash(NodeInfo storage targetNode) private { diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorTest.ts similarity index 59% rename from contract/test/ValidatorContractTest.ts rename to contract/test/ValidatorTest.ts index 5e67220..74644eb 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorTest.ts @@ -45,7 +45,53 @@ export class State1 { } } -describe("ValidatorTest", function () { +describe("Validator Transfer contract ownership", function () { + + it("Transfer ownership if the new owner is different", async function () { + const {valContract, acc1} = await loadFixture(State1.build); + console.log("Old Owner : ", await valContract.owner()); + await expect(valContract.transferOwnership(acc1.address)) + .to.emit(valContract, "LogTransferOwnership"); + console.log("Ownership to be transferred to : ", await valContract.newOwner()); + }); + + it("Transfer ownership is not possible if the new owner is same as old owner", async function () { + const {valContract, acc1, owner} = await loadFixture(State1.build); + await expect(valContract.transferOwnership(owner.address)) + .to.be.revertedWith('Cannot transfer ownership to the current owner.'); + }); + + it("Transfer ownership is not possible if the new owner is zero address", async function () { + /*const {valContract, acc1, owner} =*/ + await loadFixture(State1.build); + // await expect(valContract.transferOwnership(ethers.constants.AddressZero)) + // .to.be.revertedWith('Cannot transfer ownership to address(0)'); + }) + + it("Transfer is only possible by the owner", async function () { + const {valContract, acc1, owner} = await loadFixture(State1.build); + await expect(valContract.connect(acc1).transferOwnership(acc1.address)) + .to.be.revertedWith('Only the owner can transfer ownership.'); + }); + + it("Accepting ownership is only possible by the new owner", async function () { + const {valContract, acc1} = await loadFixture(State1.build); + await expect(valContract.transferOwnership(acc1.address)) + .to.emit(valContract, "LogTransferOwnership"); + await expect(valContract.connect(acc1).acceptOwnership()) + .to.emit(valContract, "LogAcceptOwnership"); + }); + it("Accepting ownership is not possible by any other address", async function () { + const {pushContract, valContract, owner, acc1, acc2} = await loadFixture(State1.build); + await expect(valContract.transferOwnership(acc1.address)) + .to.emit(valContract, "LogTransferOwnership"); + await expect(valContract.connect(acc2).acceptOwnership()) + .to.be.revertedWith('Only the new owner can accept the ownership.'); + }); +}); + + +describe("Validator Test1", function () { it("Deploy Validator contract and Push Contract", async function () { console.log("ValidatorTest"); @@ -104,48 +150,100 @@ describe("ValidatorTest", function () { }) }); +class ContractHelper { + static utils = ethers.utils; -describe("Validator Transfer contract ownership", function () { - it("Transfer ownership if the new owner is different", async function () { - const {valContract, acc1} = await loadFixture(State1.build); - console.log("Old Owner : ", await valContract.owner()); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - console.log("Ownership to be transferred to : ", await valContract.newOwner()); - }); + static getMessageHashAsInContract(message: string) { + let utils = ethers.utils; + return utils.keccak256(utils.arrayify(message)); + } - it("Transfer ownership is not possible if the new owner is same as old owner", async function () { - const {valContract, acc1, owner} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(owner.address)) - .to.be.revertedWith('Cannot transfer ownership to the current owner.'); - }); + static async sign(wallet: SignerWithAddress, message: string): Promise { + const hash = ContractHelper.getMessageHashAsInContract(message); + return await wallet.signMessage(ethers.utils.arrayify(hash)); + } + + static encodeVoteDataToHex(voteAction: number, targetWallet: string): string { + let abi = ethers.utils.defaultAbiCoder; + return abi.encode(["uint8", "address"], [voteAction, targetWallet]); + } +} + + +describe("report tests", function () { + + it("report-tc1", async function () { + const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); + + let message = "0xAA"; + let node1Signature = await ContractHelper.sign(node1Wallet, message); + let signatures = [node1Signature]; + console.log(`voteData=${message}, signatures=${signatures}`); + // simulate a read only method - just to get method output + let result1 = await valContract.callStatic.reportNode(message, signatures); + console.log(`result=${result1}`); + expect(result1).to.be.equal(0); + // let result = await valContract // .connect(node1Wallet) + // .reportNode( + // message, + // signers, + // signatures); - it("Transfer ownership is not possible if the new owner is zero address", async function () { - /*const {valContract, acc1, owner} =*/ await loadFixture(State1.build); - // await expect(valContract.transferOwnership(ethers.constants.AddressZero)) - // .to.be.revertedWith('Cannot transfer ownership to address(0)'); }) - it("Transfer is only possible by the owner", async function () { - const {valContract, acc1, owner} = await loadFixture(State1.build); - await expect(valContract.connect(acc1).transferOwnership(acc1.address)) - .to.be.revertedWith('Only the owner can transfer ownership.'); - }); - it("Accepting ownership is only possible by the new owner", async function () { - const {valContract, acc1} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(acc1).acceptOwnership()) - .to.emit(valContract, "LogAcceptOwnership"); - }); - it("Accepting ownership is not possible by any other address", async function () { - const {pushContract, valContract, owner, acc1, acc2} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(acc2).acceptOwnership()) - .to.be.revertedWith('Only the new owner can accept the ownership.'); - }); -}); + it("report-tc2", async function () { + // register node1, node2 + // node1 reports on node2 - 2 times + const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); + { + let t1 = valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); + { + let t1 = valContract.registerNodeAndStake(200, 0, + "http://snode2:3000", node2Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node2Wallet.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); + { + let reportThatNode2IsBad = ContractHelper.encodeVoteDataToHex(0, node2Wallet.address); + let node1Signature = await ContractHelper.sign(node1Wallet, reportThatNode2IsBad); + let signers = [node1Wallet.address]; + let signatures = [node1Signature]; + console.log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); + + let contractAsNode1 = valContract.connect(node1Wallet); + { + let trans1 = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + expect((await trans1.wait(1)).status).to.be.equal(1); + + let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); + expect(nodeInfo.counters.reportCounter).to.be.equal(1); + console.log(nodeInfo); + } + { + let trans1 = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + expect((await trans1.wait(1)).status).to.be.equal(1); + let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); + console.log(nodeInfo); + expect(nodeInfo.status).to.be.equal(2); // slashed + expect(nodeInfo.pushTokensLocked).to.be.equal(198); // -1% + expect(nodeInfo.counters.reportCounter).to.be.equal(0); + expect(nodeInfo.counters.slashCounter).to.be.equal(1); + await expect(trans1).to.emit(valContract, "NodeStatusChanged"); + } + } + // todo test unregister node + }) +}); From 1c9d3d06a742e6095784a652c1db83c5f72843bc Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 7 Apr 2023 22:31:40 +0400 Subject: [PATCH 07/84] Validator.report() all tests v3 (better and more precise contract events) --- contract/contracts/Validator.sol | 30 ++-- contract/test/TestHelper.ts | 65 +++++++ contract/test/ValidatorContractHelper.ts | 30 ++++ ...idatorTest.ts => ValidatorContractTest.ts} | 169 ++++++++++++++---- 4 files changed, 244 insertions(+), 50 deletions(-) create mode 100644 contract/test/TestHelper.ts create mode 100644 contract/test/ValidatorContractHelper.ts rename contract/test/{ValidatorTest.ts => ValidatorContractTest.ts} (64%) diff --git a/contract/contracts/Validator.sol b/contract/contracts/Validator.sol index 731b1c1..2d2efb2 100644 --- a/contract/contracts/Validator.sol +++ b/contract/contracts/Validator.sol @@ -262,30 +262,21 @@ contract ValidatorV1 is Ownable { return doReportNode(vm, targetNode); } + // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler function doReportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ - NodeCounters memory counters = targetNode.counters; NodeStatus ns = targetNode.status; // 2 check count if (_vm.vote == VoteAction.Report) { - targetNode.counters.reportCounter = ++counters.reportCounter; + doReport(targetNode); } else { revert("unsupported"); } - if (ns == NodeStatus.OK) { - if (counters.reportCounter >= REPORT_COUNT_TO_SLASH) { - // do Slash - targetNode.status = NodeStatus.Slashed; - targetNode.counters.reportCounter = 0; - targetNode.counters.slashCounter = ++counters.slashCounter; + if (ns == NodeStatus.OK || ns == NodeStatus.Slashed) { + if (targetNode.counters.reportCounter >= REPORT_COUNT_TO_SLASH) { doSlash(targetNode); - return 1; } - } else if (ns == NodeStatus.Slashed) { - if (counters.slashCounter >= SLASH_COUNT_TO_BAN) { - // do Ban - targetNode.status = NodeStatus.Banned; + if (targetNode.counters.slashCounter >= SLASH_COUNT_TO_BAN) { doBan(targetNode); - return 1; } } else if (ns == NodeStatus.Banned) { // do nothing; terminal state @@ -327,15 +318,24 @@ contract ValidatorV1 is Ownable { return nodeMap[_nodeWallet]; } + function doReport(NodeInfo storage targetNode) private { + targetNode.counters.reportCounter++; + emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.pushTokensLocked); + } + function doSlash(NodeInfo storage targetNode) private { + targetNode.status = NodeStatus.Slashed; + targetNode.counters.reportCounter = 0; + targetNode.counters.slashCounter++; uint256 coll = reduceCollateral(targetNode.nodeWallet, SLASH_COLL_PERCENTAGE); emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll); } function doBan(NodeInfo storage targetNode) private { + targetNode.status = NodeStatus.Banned; reduceCollateral(targetNode.nodeWallet, BAN_COLL_PERCENTAGE); uint256 delta = unstake(targetNode.nodeWallet); - emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Banned, delta); + emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Banned, 0); } } \ No newline at end of file diff --git a/contract/test/TestHelper.ts b/contract/test/TestHelper.ts new file mode 100644 index 0000000..a052118 --- /dev/null +++ b/contract/test/TestHelper.ts @@ -0,0 +1,65 @@ +import {BigNumber, ContractTransaction} from "ethers"; +import {expect} from "chai"; +import {ValidatorV1} from "../typechain-types"; +import {Event} from "@ethersproject/contracts/src.ts"; + +export class TestHelper { + + static hasAllFields(obj: any, sampleObj: any, + checkValues: boolean, + throwEx: boolean = false): boolean { + for (const key in sampleObj) { + if (sampleObj.hasOwnProperty(key)) { + if (!obj.hasOwnProperty(key)) { + if (throwEx) { + throw Error(`missing field ${key}`); + } else { + return false; + } + + } + let val = obj[key]; + let expectedVal = sampleObj[key]; + // if(val instanceof BigNumber) { + // val = val.toString(); + // expectedVal = expectedVal.toString(); + // } + if (checkValues && val != expectedVal) { + if (throwEx) { + console.log(`${val.constructor.name} ${expectedVal.constructor.name}`) + throw Error(`invalid field ${key} with value ${val}, expected ${expectedVal}`); + } else { + return false; + } + + } + } + } + return true; + } + + static async expectTransaction(tx: ContractTransaction) { + expect((await tx.wait(1)).status).to.be.equal(1); + } + + static async filterEventsFromTransaction(contract: ValidatorV1, tx: ContractTransaction, + eventName: string): Promise { + const receipt = await tx.wait(); + return receipt.events.filter((event) => event.event === eventName && event.address === contract.address); + } + + /** + * Expects that contract transaction (tx) contains a specified event (sample) at specified index (index) + */ + static async expectEvent(tx: ContractTransaction, index:number, sample: any) { + let eventName = "NodeStatusChanged"; + await TestHelper.expectTransaction(tx); + const receipt = await tx.wait(); + let fileteredEvents = receipt.events.filter((event) => event.event === eventName /*&& event.address === contract.address*/); + for (let i = 0; i < fileteredEvents.length; i++) { + console.log(`event[${i}] -> ${fileteredEvents[i].args}`); + } + TestHelper.hasAllFields(fileteredEvents[index].args, sample, true, true); + } + +} \ No newline at end of file diff --git a/contract/test/ValidatorContractHelper.ts b/contract/test/ValidatorContractHelper.ts new file mode 100644 index 0000000..fc9c14a --- /dev/null +++ b/contract/test/ValidatorContractHelper.ts @@ -0,0 +1,30 @@ +import {ethers} from "hardhat"; +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; + +export class ValidatorContractHelper { + static utils = ethers.utils; + + + static getMessageHashAsInContract(message: string) { + let utils = ethers.utils; + return utils.keccak256(utils.arrayify(message)); + } + + static async sign(wallet: SignerWithAddress, message: string): Promise { + const hash = ValidatorContractHelper.getMessageHashAsInContract(message); + return await wallet.signMessage(ethers.utils.arrayify(hash)); + } + + static encodeVoteDataToHex(voteAction: number, targetWallet: string): string { + let abi = ethers.utils.defaultAbiCoder; + return abi.encode(["uint8", "address"], [voteAction, targetWallet]); + } + +} + +export enum NodeStatus { + OK, // this node operates just fine (DEFAULT VALUE) + Reported, // he have a few malicious reports + Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) + Banned // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) +} \ No newline at end of file diff --git a/contract/test/ValidatorTest.ts b/contract/test/ValidatorContractTest.ts similarity index 64% rename from contract/test/ValidatorTest.ts rename to contract/test/ValidatorContractTest.ts index 74644eb..098a3eb 100644 --- a/contract/test/ValidatorTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -7,6 +7,9 @@ import {expect} from "chai"; import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +import {TestHelper as t} from "./TestHelper"; +import {NodeStatus, ValidatorContractHelper} from "./ValidatorContractHelper"; +import {BigNumber} from "ethers"; export class State1 { @@ -150,26 +153,65 @@ describe("Validator Test1", function () { }) }); -class ContractHelper { - static utils = ethers.utils; +describe("testEquals", function () { + it("testhasfields", async function () { + const object1 = { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }; - static getMessageHashAsInContract(message: string) { - let utils = ethers.utils; - return utils.keccak256(utils.arrayify(message)); - } - - static async sign(wallet: SignerWithAddress, message: string): Promise { - const hash = ContractHelper.getMessageHashAsInContract(message); - return await wallet.signMessage(ethers.utils.arrayify(hash)); - } + const object2 = { + field1: 'value1', + field2: 'value2', + }; - static encodeVoteDataToHex(voteAction: number, targetWallet: string): string { - let abi = ethers.utils.defaultAbiCoder; - return abi.encode(["uint8", "address"], [voteAction, targetWallet]); - } -} + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + { + field1: 'value1', + field2: 'value2', + }, false)).to.be.true; + + expect(t.hasAllFields({ + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, { + field1: 'value_', + field2: 'value2', + }, true)).to.be.false; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + true)).to.be.false; + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + false)).to.be.false; + }); +}); describe("report tests", function () { @@ -177,25 +219,18 @@ describe("report tests", function () { const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); let message = "0xAA"; - let node1Signature = await ContractHelper.sign(node1Wallet, message); + let node1Signature = await ValidatorContractHelper.sign(node1Wallet, message); let signatures = [node1Signature]; console.log(`voteData=${message}, signatures=${signatures}`); // simulate a read only method - just to get method output let result1 = await valContract.callStatic.reportNode(message, signatures); console.log(`result=${result1}`); expect(result1).to.be.equal(0); - // let result = await valContract // .connect(node1Wallet) - // .reportNode( - // message, - // signers, - // signatures); - }) - it("report-tc2", async function () { + it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { // register node1, node2 - // node1 reports on node2 - 2 times const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); { let t1 = valContract.registerNodeAndStake(100, 0, @@ -216,34 +251,98 @@ describe("report tests", function () { } expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); { - let reportThatNode2IsBad = ContractHelper.encodeVoteDataToHex(0, node2Wallet.address); - let node1Signature = await ContractHelper.sign(node1Wallet, reportThatNode2IsBad); + let reportThatNode2IsBad = ValidatorContractHelper.encodeVoteDataToHex(0, node2Wallet.address); + let node1Signature = await ValidatorContractHelper.sign(node1Wallet, reportThatNode2IsBad); let signers = [node1Wallet.address]; let signatures = [node1Signature]; console.log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); let contractAsNode1 = valContract.connect(node1Wallet); { - let trans1 = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - expect((await trans1.wait(1)).status).to.be.equal(1); + // node1 reports on node2 (1st report) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.expectTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); - console.log(nodeInfo); + + let bn:BigNumber = BigNumber.from(1); + expect(bn instanceof BigNumber).to.be.true; + + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Reported, + pushTokensLocked: 200 + }); } { - let trans1 = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - expect((await trans1.wait(1)).status).to.be.equal(1); + // node1 reports on node2 (2nd report - slash occurs - NodeStatusChanged event ) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.expectTransaction(tx); + let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); console.log(nodeInfo); expect(nodeInfo.status).to.be.equal(2); // slashed expect(nodeInfo.pushTokensLocked).to.be.equal(198); // -1% expect(nodeInfo.counters.reportCounter).to.be.equal(0); expect(nodeInfo.counters.slashCounter).to.be.equal(1); - await expect(trans1).to.emit(valContract, "NodeStatusChanged"); + + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Reported, + pushTokensLocked: 200 + }); + + await t.expectEvent(tx, 1, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Slashed, + pushTokensLocked: 198 + }); } - } + { + // node1 reports on node2 (3rd - NodeStatusChanged event) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.expectTransaction(tx); - // todo test unregister node + let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); + expect(nodeInfo.counters.reportCounter).to.be.equal(1); + console.log(nodeInfo); + + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Reported, + pushTokensLocked: 198 + }); + } + { + // node1 reports on node2 (4th - 2nd slash occurs - NodeStatusChanged event + // and then ban occurs - NodeStatusChanged event) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.expectTransaction(tx); + let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); + console.log('4th report'); + console.log(nodeInfo); + expect(nodeInfo.status).to.be.equal(3); // banned + expect(nodeInfo.pushTokensLocked).to.be.equal(0); // because we unstaked automatically + expect(nodeInfo.counters.reportCounter).to.be.equal(0); + expect(nodeInfo.counters.slashCounter).to.be.equal(2); + console.log('events ', (await tx.wait(1)).events); + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Reported, + pushTokensLocked: 198 + }); + await t.expectEvent(tx, 1, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Slashed, + pushTokensLocked: 196 + }); + await t.expectEvent(tx, 2, { + nodeWallet: node2Wallet.address, + nodeStatus: NodeStatus.Banned, + pushTokensLocked: 0 + }); + } + } }) }); From a5551f004c9e2b4493f64aafedb056bd44c1fd56 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 10 Apr 2023 15:48:36 +0400 Subject: [PATCH 08/84] renamed vars --- contract/contracts/Validator.sol | 53 ++++++++++++++---------- contract/test/TestHelper.ts | 9 +++- contract/test/ValidatorContractHelper.ts | 3 +- contract/test/ValidatorContractTest.ts | 51 ++++++++++++++++------- 4 files changed, 76 insertions(+), 40 deletions(-) diff --git a/contract/contracts/Validator.sol b/contract/contracts/Validator.sol index 2d2efb2..fb185f1 100644 --- a/contract/contracts/Validator.sol +++ b/contract/contracts/Validator.sol @@ -130,7 +130,7 @@ contract ValidatorV1 is Ownable { address ownerWallet; address nodeWallet; // eth wallet NodeType nodeType; - uint256 pushTokensLocked; + uint256 nodeTokens; string nodeApiBaseUrl; // rest api url for invocation NodeCounters counters; NodeStatus status; @@ -153,7 +153,8 @@ contract ValidatorV1 is Ownable { OK, // this node operates just fine (DEFAULT VALUE) Reported, // he have a few malicious reports Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) - Banned // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + Unstaked } enum VoteAction { @@ -168,8 +169,9 @@ contract ValidatorV1 is Ownable { DNode // delivery } - event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 pushTokensLocked, string nodeApiBaseUrl); - event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 pushTokensLocked); + event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); + event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); + struct VoteMessage { VoteAction vote; @@ -195,9 +197,9 @@ contract ValidatorV1 is Ownable { // Registers a new validator node // Locks PUSH tokens ($_token) with $_collateral amount. // A node will run from a _nodeWallet - function registerNodeAndStake(uint256 _pushTokensLocked, + function registerNodeAndStake(uint256 _nodeTokens, NodeType _nodeType, string memory _nodeApiBaseUrl, address _nodeWallet) public { - uint256 coll = _pushTokensLocked; + uint256 coll = _nodeTokens; if (_nodeType == NodeType.VNode) { require(coll >= VNODE_COLLATERAL_IN_PUSH, "Insufficient collateral for VNODE"); } else { @@ -209,13 +211,13 @@ contract ValidatorV1 is Ownable { } // check that collateral is allowed to spend uint256 allowed = pushToken.allowance(msg.sender, address(this)); - require(allowed >= _pushTokensLocked, "_pushTokensLocked cannot be transferred, check allowance"); + require(allowed >= _nodeTokens, "_nodeTokens cannot be transferred, check allowance"); // new mapping NodeInfo memory n; n.ownerWallet = msg.sender; n.nodeWallet = _nodeWallet; n.nodeType = _nodeType; - n.pushTokensLocked = coll; + n.nodeTokens = coll; n.nodeApiBaseUrl = _nodeApiBaseUrl; nodes.push(_nodeWallet); nodeMap[_nodeWallet] = n; @@ -278,7 +280,7 @@ contract ValidatorV1 is Ownable { if (targetNode.counters.slashCounter >= SLASH_COUNT_TO_BAN) { doBan(targetNode); } - } else if (ns == NodeStatus.Banned) { + } else if (ns == NodeStatus.BannedAndUnstaked) { // do nothing; terminal state } return 0; @@ -290,26 +292,33 @@ contract ValidatorV1 is Ownable { function reduceCollateral(address _nodeWallet, uint32 _percentage) private returns (uint256) { require(_nodeWallet != address(0)); require(_percentage >= 0 && _percentage <= 100, "percentage should be in [0, 100]"); - // reduce only pushTokensLocked; we do not transfer any tokens; it will affect only 'unstake' + // reduce only nodeTokens; we do not transfer any tokens; it will affect only 'unstake' NodeInfo storage node = nodeMap[_nodeWallet]; - uint256 currentAmount = node.pushTokensLocked; + uint256 currentAmount = node.nodeTokens; uint256 newAmount = (currentAmount * (100 - _percentage)) / 100; uint256 delta = currentAmount - newAmount; - node.pushTokensLocked = newAmount; + node.nodeTokens = newAmount; totalStaked -= delta; totalPenalties += delta; return newAmount; } + + function unstakeNode(address _nodeWallet) external { + NodeInfo storage node = nodeMap[_nodeWallet]; + require(node.nodeWallet != address(0), "node does not exists"); + require(node.ownerWallet == msg.sender, "only owner can unstake a node"); + doUnstake(node); + emit NodeStatusChanged(node.nodeWallet, NodeStatus.Unstaked, 0); + } + /* Returns unstaked amount */ - function unstake(address _nodeWallet) private returns (uint256){ - require(_nodeWallet != address(0)); - NodeInfo storage node = nodeMap[_nodeWallet]; - uint256 delta = node.pushTokensLocked; - pushToken.transfer(node.ownerWallet, delta); - node.pushTokensLocked = 0; + function doUnstake(NodeInfo storage targetNode) private returns (uint256){ + uint256 delta = targetNode.nodeTokens; + pushToken.transfer(targetNode.ownerWallet, delta); + targetNode.nodeTokens = 0; totalStaked -= delta; return delta; } @@ -320,7 +329,7 @@ contract ValidatorV1 is Ownable { function doReport(NodeInfo storage targetNode) private { targetNode.counters.reportCounter++; - emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.pushTokensLocked); + emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); } function doSlash(NodeInfo storage targetNode) private { @@ -332,10 +341,10 @@ contract ValidatorV1 is Ownable { } function doBan(NodeInfo storage targetNode) private { - targetNode.status = NodeStatus.Banned; + targetNode.status = NodeStatus.BannedAndUnstaked; reduceCollateral(targetNode.nodeWallet, BAN_COLL_PERCENTAGE); - uint256 delta = unstake(targetNode.nodeWallet); - emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Banned, 0); + doUnstake(targetNode); + emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } } \ No newline at end of file diff --git a/contract/test/TestHelper.ts b/contract/test/TestHelper.ts index a052118..e16c095 100644 --- a/contract/test/TestHelper.ts +++ b/contract/test/TestHelper.ts @@ -52,7 +52,14 @@ export class TestHelper { * Expects that contract transaction (tx) contains a specified event (sample) at specified index (index) */ static async expectEvent(tx: ContractTransaction, index:number, sample: any) { - let eventName = "NodeStatusChanged"; + return TestHelper.expectEventEx(tx, "NodeStatusChanged", index, sample); + } + + static async expectEventFirst(tx: ContractTransaction, sample: any) { + return TestHelper.expectEventEx(tx, "NodeStatusChanged", 0, sample); + } + + static async expectEventEx(tx: ContractTransaction, eventName:string, index:number, sample: any) { await TestHelper.expectTransaction(tx); const receipt = await tx.wait(); let fileteredEvents = receipt.events.filter((event) => event.event === eventName /*&& event.address === contract.address*/); diff --git a/contract/test/ValidatorContractHelper.ts b/contract/test/ValidatorContractHelper.ts index fc9c14a..b242e5a 100644 --- a/contract/test/ValidatorContractHelper.ts +++ b/contract/test/ValidatorContractHelper.ts @@ -26,5 +26,6 @@ export enum NodeStatus { OK, // this node operates just fine (DEFAULT VALUE) Reported, // he have a few malicious reports Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) - Banned // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + Unstaked } \ No newline at end of file diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 098a3eb..790bbdd 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -93,7 +93,6 @@ describe("Validator Transfer contract ownership", function () { }); }); - describe("Validator Test1", function () { it("Deploy Validator contract and Push Contract", async function () { @@ -153,8 +152,7 @@ describe("Validator Test1", function () { }) }); - -describe("testEquals", function () { +describe("Tests for TestHelper", function () { it("testhasfields", async function () { const object1 = { field1: 'value1', @@ -213,7 +211,7 @@ describe("testEquals", function () { }); }); -describe("report tests", function () { +describe("Validator Tests :: A node reports on other node", function () { it("report-tc1", async function () { const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); @@ -269,10 +267,10 @@ describe("report tests", function () { let bn:BigNumber = BigNumber.from(1); expect(bn instanceof BigNumber).to.be.true; - await t.expectEvent(tx, 0, { + await t.expectEventFirst(tx, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Reported, - pushTokensLocked: 200 + nodeTokens: 200 }); } { @@ -283,20 +281,20 @@ describe("report tests", function () { let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); console.log(nodeInfo); expect(nodeInfo.status).to.be.equal(2); // slashed - expect(nodeInfo.pushTokensLocked).to.be.equal(198); // -1% + expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% expect(nodeInfo.counters.reportCounter).to.be.equal(0); expect(nodeInfo.counters.slashCounter).to.be.equal(1); await t.expectEvent(tx, 0, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Reported, - pushTokensLocked: 200 + nodeTokens: 200 }); await t.expectEvent(tx, 1, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Slashed, - pushTokensLocked: 198 + nodeTokens: 198 }); } { @@ -308,10 +306,10 @@ describe("report tests", function () { expect(nodeInfo.counters.reportCounter).to.be.equal(1); console.log(nodeInfo); - await t.expectEvent(tx, 0, { + await t.expectEventFirst(tx, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Reported, - pushTokensLocked: 198 + nodeTokens: 198 }); } { @@ -323,26 +321,47 @@ describe("report tests", function () { console.log('4th report'); console.log(nodeInfo); expect(nodeInfo.status).to.be.equal(3); // banned - expect(nodeInfo.pushTokensLocked).to.be.equal(0); // because we unstaked automatically + expect(nodeInfo.nodeTokens).to.be.equal(0); // because we unstaked automatically expect(nodeInfo.counters.reportCounter).to.be.equal(0); expect(nodeInfo.counters.slashCounter).to.be.equal(2); console.log('events ', (await tx.wait(1)).events); await t.expectEvent(tx, 0, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Reported, - pushTokensLocked: 198 + nodeTokens: 198 }); await t.expectEvent(tx, 1, { nodeWallet: node2Wallet.address, nodeStatus: NodeStatus.Slashed, - pushTokensLocked: 196 + nodeTokens: 196 }); await t.expectEvent(tx, 2, { nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Banned, - pushTokensLocked: 0 + nodeStatus: NodeStatus.BannedAndUnstaked, + nodeTokens: 0 }); } } }) }); + + +describe("Validator Tests :: Test unstake", function () { + + it("unstake1", async function () { + const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); + { + let t1 = valContract.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet.address); + await expect(t1).to.emit(valContract, "NodeAdded") + .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); + + // owner calls unstake + valContract.uns + + }) +}); \ No newline at end of file From d1a0dc61976c4cb12a56887420020145e550a9eb Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 10 Apr 2023 22:17:21 +0400 Subject: [PATCH 09/84] tests passed (1) --- contract/contracts/Validator.sol | 3 +- contract/test/ValidatorContractTest.ts | 50 +++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/contract/contracts/Validator.sol b/contract/contracts/Validator.sol index fb185f1..f62c060 100644 --- a/contract/contracts/Validator.sol +++ b/contract/contracts/Validator.sol @@ -309,6 +309,7 @@ contract ValidatorV1 is Ownable { require(node.nodeWallet != address(0), "node does not exists"); require(node.ownerWallet == msg.sender, "only owner can unstake a node"); doUnstake(node); + node.status = NodeStatus.Unstaked; emit NodeStatusChanged(node.nodeWallet, NodeStatus.Unstaked, 0); } @@ -341,9 +342,9 @@ contract ValidatorV1 is Ownable { } function doBan(NodeInfo storage targetNode) private { - targetNode.status = NodeStatus.BannedAndUnstaked; reduceCollateral(targetNode.nodeWallet, BAN_COLL_PERCENTAGE); doUnstake(targetNode); + targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 790bbdd..9f0b597 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -34,7 +34,8 @@ export class State1 { const valContract = await valFactory.deploy(pushContract.address); await pushContract.mint(owner.address, ethers.utils.parseEther("100")); - await pushContract.approve(valContract.address, ethers.utils.parseEther("1000000000000000")); + // owner can spend 1000000000000000 + await pushContract./*connect(owner).*/approve(valContract.address, ethers.utils.parseEther("1000000000000000")); return { pushContract: pushContract, @@ -351,17 +352,58 @@ describe("Validator Tests :: Test unstake", function () { it("unstake1", async function () { const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); { - let t1 = valContract.registerNodeAndStake(100, 0, + // let ownerBalanceBefore = await pushContract.balanceOf(owner.address); + // let node1BalanceBefore = await pushContract.balanceOf(node1Wallet.address); + + let t1 = valContract.connect(owner).registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") + + // let ownerBalanceAfter = await pushContract.balanceOf(owner.address); + // let node1BalanceAfter = await pushContract.balanceOf(node1Wallet.address); + // expect((node1BalanceAfter.sub(node1BalanceBefore))).to.be.equal(100); + // expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); + + await expect(t1) + .to.emit(valContract, "NodeAdded") .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); } expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); + // non-owner calls unstake + { + let t1 = valContract.connect(node2Wallet) + .unstakeNode(node1Wallet.address); + await expect(t1).revertedWith('only owner can unstake a node'); + + // await expect(t1).re + // .to.emit(valContract, "NodeStatusChanged") + // .withArgs(node1Wallet.address, NodeStatus.Unstaked, 0); + } // owner calls unstake - valContract.uns + { + let ni1 = await valContract.getNodeInfo(node1Wallet.address); + expect(ni1.status).to.be.equal(0); + expect(ni1.nodeTokens).to.be.equal(100); + let ownerBalanceBefore = await pushContract.balanceOf(owner.address); + // await pushContract.approve(owner.address, ethers.utils.parseEther("1000000000000000")); + + + let t1 = valContract/*.connect(owner)*/ + .unstakeNode(node1Wallet.address); + + let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); + expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); + expect(nodeInfo.nodeTokens).to.be.equal(0); + + let ownerBalanceAfter = await pushContract.balanceOf(owner.address); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(100); + + await expect(t1) + .to.emit(valContract, "NodeStatusChanged") + .withArgs(node1Wallet.address, NodeStatus.Unstaked, 0); + } }) }); \ No newline at end of file From 4402d1cdeab7467869c806ebeba958602b3c4c5e Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 10 Apr 2023 23:02:05 +0400 Subject: [PATCH 10/84] tests passed (2) --- contract/test/TestHelper.ts | 4 +- contract/test/ValidatorContractTest.ts | 67 +++++++++++++++----------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/contract/test/TestHelper.ts b/contract/test/TestHelper.ts index e16c095..5c1dd0b 100644 --- a/contract/test/TestHelper.ts +++ b/contract/test/TestHelper.ts @@ -38,7 +38,7 @@ export class TestHelper { return true; } - static async expectTransaction(tx: ContractTransaction) { + static async confirmTransaction(tx: ContractTransaction) { expect((await tx.wait(1)).status).to.be.equal(1); } @@ -60,7 +60,7 @@ export class TestHelper { } static async expectEventEx(tx: ContractTransaction, eventName:string, index:number, sample: any) { - await TestHelper.expectTransaction(tx); + await TestHelper.confirmTransaction(tx); const receipt = await tx.wait(); let fileteredEvents = receipt.events.filter((event) => event.event === eventName /*&& event.address === contract.address*/); for (let i = 0; i < fileteredEvents.length; i++) { diff --git a/contract/test/ValidatorContractTest.ts b/contract/test/ValidatorContractTest.ts index 9f0b597..b4c5415 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/contract/test/ValidatorContractTest.ts @@ -35,7 +35,9 @@ export class State1 { await pushContract.mint(owner.address, ethers.utils.parseEther("100")); // owner can spend 1000000000000000 - await pushContract./*connect(owner).*/approve(valContract.address, ethers.utils.parseEther("1000000000000000")); + await pushContract + .connect(owner) + .approve(valContract.address, ethers.utils.parseEther("1000000000000000")); return { pushContract: pushContract, @@ -260,7 +262,7 @@ describe("Validator Tests :: A node reports on other node", function () { { // node1 reports on node2 (1st report) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.expectTransaction(tx); + await t.confirmTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); @@ -277,7 +279,7 @@ describe("Validator Tests :: A node reports on other node", function () { { // node1 reports on node2 (2nd report - slash occurs - NodeStatusChanged event ) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.expectTransaction(tx); + await t.confirmTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); console.log(nodeInfo); @@ -301,7 +303,7 @@ describe("Validator Tests :: A node reports on other node", function () { { // node1 reports on node2 (3rd - NodeStatusChanged event) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.expectTransaction(tx); + await t.confirmTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); @@ -317,7 +319,7 @@ describe("Validator Tests :: A node reports on other node", function () { // node1 reports on node2 (4th - 2nd slash occurs - NodeStatusChanged event // and then ban occurs - NodeStatusChanged event) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.expectTransaction(tx); + await t.confirmTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); console.log('4th report'); console.log(nodeInfo); @@ -349,58 +351,69 @@ describe("Validator Tests :: A node reports on other node", function () { describe("Validator Tests :: Test unstake", function () { - it("unstake1", async function () { + it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); + // register 1 node (+ check all amounts before and after) { - // let ownerBalanceBefore = await pushContract.balanceOf(owner.address); - // let node1BalanceBefore = await pushContract.balanceOf(node1Wallet.address); - - let t1 = valContract.connect(owner).registerNodeAndStake(100, 0, + let ownerBalanceBefore = await pushContract.balanceOf(owner.address); + let valContractBalanceBefore = await pushContract.balanceOf(valContract.address); + let valContractAllowanceForOwner = await pushContract.allowance(owner.address, valContract.address); + console.log(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); + expect(valContractAllowanceForOwner).to.be.greaterThan(100); + + let tx = await valContract + .connect(owner) + .registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet.address); + await t.confirmTransaction(tx); - // let ownerBalanceAfter = await pushContract.balanceOf(owner.address); - // let node1BalanceAfter = await pushContract.balanceOf(node1Wallet.address); - // expect((node1BalanceAfter.sub(node1BalanceBefore))).to.be.equal(100); - // expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); + let ownerBalanceAfter = await pushContract.balanceOf(owner.address); + let valContractBalanceAfter = await pushContract.balanceOf(valContract.address); + console.log(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); - await expect(t1) + await expect(tx) .to.emit(valContract, "NodeAdded") .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(0); } expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); - // non-owner calls unstake { - let t1 = valContract.connect(node2Wallet) + let tx = valContract + .connect(node2Wallet) .unstakeNode(node1Wallet.address); - await expect(t1).revertedWith('only owner can unstake a node'); - - // await expect(t1).re - // .to.emit(valContract, "NodeStatusChanged") - // .withArgs(node1Wallet.address, NodeStatus.Unstaked, 0); + await expect(tx).revertedWith('only owner can unstake a node'); } // owner calls unstake { let ni1 = await valContract.getNodeInfo(node1Wallet.address); expect(ni1.status).to.be.equal(0); expect(ni1.nodeTokens).to.be.equal(100); - let ownerBalanceBefore = await pushContract.balanceOf(owner.address); - // await pushContract.approve(owner.address, ethers.utils.parseEther("1000000000000000")); - let t1 = valContract/*.connect(owner)*/ + let ownerBalanceBefore = await pushContract.balanceOf(owner.address); + let valContractBalanceBefore = await pushContract.balanceOf(valContract.address); + console.log(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); + + let tx = await valContract + .connect(owner) .unstakeNode(node1Wallet.address); + await t.confirmTransaction(tx); let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); expect(nodeInfo.nodeTokens).to.be.equal(0); let ownerBalanceAfter = await pushContract.balanceOf(owner.address); - expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(100); + let valContractBalanceAfter = await pushContract.balanceOf(valContract.address); // todo !!!! + console.log(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); - await expect(t1) + await expect(tx) .to.emit(valContract, "NodeStatusChanged") .withArgs(node1Wallet.address, NodeStatus.Unstaked, 0); } From 622a48f3240b7667e43bce88a415534940df687c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 12 Apr 2023 18:02:29 +0400 Subject: [PATCH 11/84] tests passed (2) --- {contract => smart-contracts}/.env.example | 0 {contract => smart-contracts}/.gitignore | 0 {contract => smart-contracts}/.keepfolderalive | 0 {contract => smart-contracts}/.openzeppelin/goerli.json | 0 .../.openzeppelin/unknown-31337.json | 0 {contract => smart-contracts}/README.md | 0 {contract => smart-contracts}/contracts/DStorageV1.sol | 0 {contract => smart-contracts}/contracts/PushToken.sol | 0 {contract => smart-contracts}/contracts/SignatureTest.sol | 0 {contract => smart-contracts}/contracts/Validator.sol | 4 ++-- {contract => smart-contracts}/hardhat.config.ts | 0 {contract => smart-contracts}/package.json | 0 {contract => smart-contracts}/scripts/deploy.ts | 0 {contract => smart-contracts}/scripts/proxydeploy.ts | 0 {contract => smart-contracts}/test/DStorageTest.ts | 2 +- {contract => smart-contracts}/test/SignatureTestTest.ts | 2 +- smart-contracts/test/StandaloneEthersTest.ts | 0 {contract => smart-contracts}/test/TestHelper.ts | 0 .../test/ValidatorContractHelper.ts | 0 {contract => smart-contracts}/test/ValidatorContractTest.ts | 5 ++++- {contract => smart-contracts}/tsconfig.json | 0 21 files changed, 8 insertions(+), 5 deletions(-) rename {contract => smart-contracts}/.env.example (100%) rename {contract => smart-contracts}/.gitignore (100%) rename {contract => smart-contracts}/.keepfolderalive (100%) rename {contract => smart-contracts}/.openzeppelin/goerli.json (100%) rename {contract => smart-contracts}/.openzeppelin/unknown-31337.json (100%) rename {contract => smart-contracts}/README.md (100%) rename {contract => smart-contracts}/contracts/DStorageV1.sol (100%) rename {contract => smart-contracts}/contracts/PushToken.sol (100%) rename {contract => smart-contracts}/contracts/SignatureTest.sol (100%) rename {contract => smart-contracts}/contracts/Validator.sol (98%) rename {contract => smart-contracts}/hardhat.config.ts (100%) rename {contract => smart-contracts}/package.json (100%) rename {contract => smart-contracts}/scripts/deploy.ts (100%) rename {contract => smart-contracts}/scripts/proxydeploy.ts (100%) rename {contract => smart-contracts}/test/DStorageTest.ts (99%) rename {contract => smart-contracts}/test/SignatureTestTest.ts (98%) create mode 100644 smart-contracts/test/StandaloneEthersTest.ts rename {contract => smart-contracts}/test/TestHelper.ts (100%) rename {contract => smart-contracts}/test/ValidatorContractHelper.ts (100%) rename {contract => smart-contracts}/test/ValidatorContractTest.ts (99%) rename {contract => smart-contracts}/tsconfig.json (100%) diff --git a/contract/.env.example b/smart-contracts/.env.example similarity index 100% rename from contract/.env.example rename to smart-contracts/.env.example diff --git a/contract/.gitignore b/smart-contracts/.gitignore similarity index 100% rename from contract/.gitignore rename to smart-contracts/.gitignore diff --git a/contract/.keepfolderalive b/smart-contracts/.keepfolderalive similarity index 100% rename from contract/.keepfolderalive rename to smart-contracts/.keepfolderalive diff --git a/contract/.openzeppelin/goerli.json b/smart-contracts/.openzeppelin/goerli.json similarity index 100% rename from contract/.openzeppelin/goerli.json rename to smart-contracts/.openzeppelin/goerli.json diff --git a/contract/.openzeppelin/unknown-31337.json b/smart-contracts/.openzeppelin/unknown-31337.json similarity index 100% rename from contract/.openzeppelin/unknown-31337.json rename to smart-contracts/.openzeppelin/unknown-31337.json diff --git a/contract/README.md b/smart-contracts/README.md similarity index 100% rename from contract/README.md rename to smart-contracts/README.md diff --git a/contract/contracts/DStorageV1.sol b/smart-contracts/contracts/DStorageV1.sol similarity index 100% rename from contract/contracts/DStorageV1.sol rename to smart-contracts/contracts/DStorageV1.sol diff --git a/contract/contracts/PushToken.sol b/smart-contracts/contracts/PushToken.sol similarity index 100% rename from contract/contracts/PushToken.sol rename to smart-contracts/contracts/PushToken.sol diff --git a/contract/contracts/SignatureTest.sol b/smart-contracts/contracts/SignatureTest.sol similarity index 100% rename from contract/contracts/SignatureTest.sol rename to smart-contracts/contracts/SignatureTest.sol diff --git a/contract/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol similarity index 98% rename from contract/contracts/Validator.sol rename to smart-contracts/contracts/Validator.sol index f62c060..7fef316 100644 --- a/contract/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -222,7 +222,7 @@ contract ValidatorV1 is Ownable { nodes.push(_nodeWallet); nodeMap[_nodeWallet] = n; // take collateral - pushToken.transferFrom(msg.sender, address(this), coll); + require(pushToken.transferFrom(msg.sender, address(this), coll), "failed to transfer tokens to contract"); totalStaked += coll; // post actions // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); @@ -318,7 +318,7 @@ contract ValidatorV1 is Ownable { */ function doUnstake(NodeInfo storage targetNode) private returns (uint256){ uint256 delta = targetNode.nodeTokens; - pushToken.transfer(targetNode.ownerWallet, delta); + require(pushToken.transfer(targetNode.ownerWallet, delta), "failed to trasfer funds back to owner"); targetNode.nodeTokens = 0; totalStaked -= delta; return delta; diff --git a/contract/hardhat.config.ts b/smart-contracts/hardhat.config.ts similarity index 100% rename from contract/hardhat.config.ts rename to smart-contracts/hardhat.config.ts diff --git a/contract/package.json b/smart-contracts/package.json similarity index 100% rename from contract/package.json rename to smart-contracts/package.json diff --git a/contract/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts similarity index 100% rename from contract/scripts/deploy.ts rename to smart-contracts/scripts/deploy.ts diff --git a/contract/scripts/proxydeploy.ts b/smart-contracts/scripts/proxydeploy.ts similarity index 100% rename from contract/scripts/proxydeploy.ts rename to smart-contracts/scripts/proxydeploy.ts diff --git a/contract/test/DStorageTest.ts b/smart-contracts/test/DStorageTest.ts similarity index 99% rename from contract/test/DStorageTest.ts rename to smart-contracts/test/DStorageTest.ts index e9189a2..e38edab 100644 --- a/contract/test/DStorageTest.ts +++ b/smart-contracts/test/DStorageTest.ts @@ -5,7 +5,7 @@ import "@nomiclabs/hardhat-ethers"; import { expect } from "chai"; import { ethers } from "hardhat"; -describe("DSTorageV1", function () { +describe.skip("DSTorageV1", function () { // We define a fixture to reuse the same setup in every test. // We use loadFixture to run this setup once, snapshot that state, // and reset Hardhat Network to that snapshot in every test. diff --git a/contract/test/SignatureTestTest.ts b/smart-contracts/test/SignatureTestTest.ts similarity index 98% rename from contract/test/SignatureTestTest.ts rename to smart-contracts/test/SignatureTestTest.ts index 373c6fe..13c5d92 100644 --- a/contract/test/SignatureTestTest.ts +++ b/smart-contracts/test/SignatureTestTest.ts @@ -40,7 +40,7 @@ function getEthSignedMessageHashJS(messageHash:string) { * https://solidity-by-example.org/signature/ * https://github.com/t4sk/hello-erc20-permit/blob/main/test/verify-signature.js */ -describe("SignatureTest", function () { +describe.skip("SignatureTest", function () { it("tc1", async function () { // signers diff --git a/smart-contracts/test/StandaloneEthersTest.ts b/smart-contracts/test/StandaloneEthersTest.ts new file mode 100644 index 0000000..e69de29 diff --git a/contract/test/TestHelper.ts b/smart-contracts/test/TestHelper.ts similarity index 100% rename from contract/test/TestHelper.ts rename to smart-contracts/test/TestHelper.ts diff --git a/contract/test/ValidatorContractHelper.ts b/smart-contracts/test/ValidatorContractHelper.ts similarity index 100% rename from contract/test/ValidatorContractHelper.ts rename to smart-contracts/test/ValidatorContractHelper.ts diff --git a/contract/test/ValidatorContractTest.ts b/smart-contracts/test/ValidatorContractTest.ts similarity index 99% rename from contract/test/ValidatorContractTest.ts rename to smart-contracts/test/ValidatorContractTest.ts index b4c5415..f9a8e92 100644 --- a/contract/test/ValidatorContractTest.ts +++ b/smart-contracts/test/ValidatorContractTest.ts @@ -10,6 +10,7 @@ import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./TestHelper"; import {NodeStatus, ValidatorContractHelper} from "./ValidatorContractHelper"; import {BigNumber} from "ethers"; +import {JsonRpcClient} from "hardhat/internal/hardhat-network/jsonrpc/client"; export class State1 { @@ -419,4 +420,6 @@ describe("Validator Tests :: Test unstake", function () { } }) -}); \ No newline at end of file +}); + + diff --git a/contract/tsconfig.json b/smart-contracts/tsconfig.json similarity index 100% rename from contract/tsconfig.json rename to smart-contracts/tsconfig.json From a0b9e1cf7c7aa17acd7193bc950bd2c2d714d32c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 15 Apr 2023 10:58:23 +0400 Subject: [PATCH 12/84] tests passed (3) --- smart-contracts/hardhat.config.ts | 18 +++++++- smart-contracts/scripts/deploy.ts | 46 +++++++++++--------- smart-contracts/scripts/registerTestNodes.ts | 38 ++++++++++++++++ 3 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 smart-contracts/scripts/registerTestNodes.ts diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index c242e4a..e0f842f 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -1,20 +1,36 @@ -import { HardhatUserConfig } from "hardhat/config"; +// noinspection SpellCheckingInspection + +import {HardhatUserConfig, task} from "hardhat/config"; require('@openzeppelin/hardhat-upgrades'); require('@nomiclabs/hardhat-etherscan') import "@nomicfoundation/hardhat-toolbox"; require("dotenv").config(); +// task("balance", "Prints an account's balance") +// .setAction(async () => {}); + const config: HardhatUserConfig = { solidity: "0.8.17", + // defaultNetwork: "polygon_mumbai", + networks: { + hardhat: { + }, + polygon_mumbai: { + url: "https://rpc-mumbai.maticvigil.com", + accounts: [process.env.PRIVATE_KEY] + }, goerli: { url: `https://eth-goerli.alchemyapi.io/v2/${process.env.ALCHEMY_API_KEY}`, accounts: [process.env.PRIVATE_KEY || ""] } }, + etherscan: { apiKey: process.env.ETHERSCAN_API_KEY } }; + + export default config; diff --git a/smart-contracts/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts index 6764a27..c57a698 100644 --- a/smart-contracts/scripts/deploy.ts +++ b/smart-contracts/scripts/deploy.ts @@ -1,27 +1,31 @@ -import { ethers } from "hardhat"; +import {ethers} from "hardhat"; +import {config as loadEnvVariables} from "dotenv"; -async function main() { - - require("dotenv").config(); - - const PushToken = await ethers.getContractFactory("PushToken"); - const pushToken = await PushToken.deploy(); - - await pushToken.deployed(); - const TokenAddress = process.env.TOKEN_ADDRESS; - const DStorageV1 = await ethers.getContractFactory("DStorageV1"); - const dstoragev1 = await DStorageV1.deploy( pushToken?.address || TokenAddress || "0x0"); - - await dstoragev1.deployed(); - - console.log("PushToken contract is deployed to:", pushToken.address); - console.log(`DStorageV1 contract is deployed to ${dstoragev1.address}`); +async function main() { + loadEnvVariables(); + + // deploy token + const [owner] = await ethers.getSigners(); + const pushTokenFactory = await ethers.getContractFactory("PushToken"); + const pushToken = await pushTokenFactory.deploy(); + await pushToken.deployed(); + console.log("PushToken contract: ", pushToken.address); + + // deploy + const pushTokenAddr = process.env.TOKEN_ADDRESS ?? pushToken?.address; + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validator = await validatorV1Factory.deploy(pushTokenAddr); + await validator.deployed(); + console.log("Validator contract ", validator.address); + + // give 10k to owner + await pushToken.mint(owner.address, ethers.utils.parseEther("10000")); + console.log("owner ", owner.address); + console.log("owner balance ", await pushToken.balanceOf(owner.address)); } -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. main().catch((error) => { - console.error(error); - process.exitCode = 1; + console.error(error); + process.exitCode = 1; }); diff --git a/smart-contracts/scripts/registerTestNodes.ts b/smart-contracts/scripts/registerTestNodes.ts new file mode 100644 index 0000000..8439cd3 --- /dev/null +++ b/smart-contracts/scripts/registerTestNodes.ts @@ -0,0 +1,38 @@ +import {ethers} from "hardhat"; +import {config as loadEnvVariables} from "dotenv"; +import {task} from "hardhat/config"; + +let info = console.log; + +// task("balance", "Prints an account's balance") +// .setAction(async () => {}); + +async function main() { + loadEnvVariables(); + + const [owner, node1, node2, node3] = await ethers.getSigners(); + const pushAddr = process.env.PUSH_ADDRESS ?? process.exit(1); + const validatorAddr = process.env.VALIDATOR_ADDRESS ?? process.exit(1); + info("pushAddr is ", pushAddr); + info("validatorAddr is ", validatorAddr); + + let node = node1; + let amount = 100; + + // const pushCt = await ethers.getContractAt("IERC20", pushAddr, owner); + // let tx1 = await pushCt.connect(owner).approve(validatorAddr, amount); + // await tx1.wait(); + info("node ", node.address); + + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, owner); + // let tx2 = await validatorCt.connect(owner).registerNodeAndStake(amount, 0, + // "http://snode1:3000", node.address); + // await tx2.wait(); + let res = await validatorCt.getNodeInfo(node.address); + info("getNodeInfo:", res); +} + +main().catch((error) => { + error(error); + process.exitCode = 1; +}); From f38d173ef9c86451eb6e8bc9ecfc50a468022710 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 17 Apr 2023 15:36:12 +0400 Subject: [PATCH 13/84] updated readme + deploy.ts + registerTestNodes.ts --- smart-contracts/README.md | 33 ++++++++++--- smart-contracts/scripts/deploy.ts | 10 ++-- smart-contracts/scripts/registerTestNodes.ts | 50 +++++++++++++------- 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/smart-contracts/README.md b/smart-contracts/README.md index 7be82e5..7f24505 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -1,13 +1,32 @@ -# Sample Hardhat Project +# Validator contract -This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a script that deploys that contract. +# How to run tests (uses embedded EVM, it resets for every test case) +```shell +npx hardhat test +``` -Try running some of the following tasks: +# How to set up the local env +## Run an empty local hardhat EVM as a DEDICATED SEPARATE PROCESS ```shell -npx hardhat help -npx hardhat test -REPORT_GAS=true npx hardhat test +export PRIVATE_KEY=[YOUR KEY] npx hardhat node -npx hardhat run scripts/deploy.ts +``` + +## Deploy Push contract and validator contract + +```shell +npx hardhat run --network localhost scripts/deploy.ts + +# read the output and export contract addresses + + +export PUSH_ADDRESS=[PUSH_CONTRACT_ADDRESS] +export VALIDATOR_ADDRESS=[VALIDATOR_CONTRACT_ADDRESS] +``` + +## Register 3 local test nodes (see the script for details) + +```shell +npx hardhat run --network localhost scripts/registerTestNodes.ts ``` diff --git a/smart-contracts/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts index c57a698..00a4744 100644 --- a/smart-contracts/scripts/deploy.ts +++ b/smart-contracts/scripts/deploy.ts @@ -1,6 +1,7 @@ import {ethers} from "hardhat"; import {config as loadEnvVariables} from "dotenv"; +let info = console.log; async function main() { loadEnvVariables(); @@ -10,19 +11,20 @@ async function main() { const pushTokenFactory = await ethers.getContractFactory("PushToken"); const pushToken = await pushTokenFactory.deploy(); await pushToken.deployed(); - console.log("PushToken contract: ", pushToken.address); + + info("PushToken contract: ", pushToken.address); // deploy const pushTokenAddr = process.env.TOKEN_ADDRESS ?? pushToken?.address; const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); const validator = await validatorV1Factory.deploy(pushTokenAddr); await validator.deployed(); - console.log("Validator contract ", validator.address); + info("Validator contract ", validator.address); // give 10k to owner await pushToken.mint(owner.address, ethers.utils.parseEther("10000")); - console.log("owner ", owner.address); - console.log("owner balance ", await pushToken.balanceOf(owner.address)); + info("owner ", owner.address); + info("owner balance ", await pushToken.balanceOf(owner.address)); } main().catch((error) => { diff --git a/smart-contracts/scripts/registerTestNodes.ts b/smart-contracts/scripts/registerTestNodes.ts index 8439cd3..fa6e8b4 100644 --- a/smart-contracts/scripts/registerTestNodes.ts +++ b/smart-contracts/scripts/registerTestNodes.ts @@ -1,11 +1,10 @@ import {ethers} from "hardhat"; import {config as loadEnvVariables} from "dotenv"; -import {task} from "hardhat/config"; +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; let info = console.log; -// task("balance", "Prints an account's balance") -// .setAction(async () => {}); + async function main() { loadEnvVariables(); @@ -16,23 +15,38 @@ async function main() { info("pushAddr is ", pushAddr); info("validatorAddr is ", validatorAddr); - let node = node1; - let amount = 100; - - // const pushCt = await ethers.getContractAt("IERC20", pushAddr, owner); - // let tx1 = await pushCt.connect(owner).approve(validatorAddr, amount); - // await tx1.wait(); - info("node ", node.address); - - const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, owner); - // let tx2 = await validatorCt.connect(owner).registerNodeAndStake(amount, 0, - // "http://snode1:3000", node.address); - // await tx2.wait(); - let res = await validatorCt.getNodeInfo(node.address); - info("getNodeInfo:", res); + await registerNode(pushAddr, validatorAddr,owner, node1.address,100, "http://localhost:4001"); + await registerNode(pushAddr, validatorAddr, owner, node2.address,200, "http://localhost:4002"); + await registerNode(pushAddr, validatorAddr, owner, node3.address, 300, "http://localhost:4003"); } main().catch((error) => { - error(error); + info(error); process.exitCode = 1; }); + + +/** + * + * @param pushAddr push smart contract (deployed) + * @param validatorAddr validator smart contract (deployed) + * @param nodeOwner the wallet which pays for the node registration + * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) + * @param amount amount of push tokens + * @param nodeUrl node api url endpoint + */ +async function registerNode(pushAddr: string, validatorAddr: string, + nodeOwner: SignerWithAddress, + nodeAddr: string, amount: number, nodeUrl:string) { + const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); + let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); + await tx1.wait(); + info("node ", nodeAddr); + + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); + let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, + nodeUrl, nodeAddr); + await tx2.wait(); + let res = await validatorCt.getNodeInfo(nodeAddr); + info("getNodeInfo:", res); +} \ No newline at end of file From cdd9f047c3a3fc258381f98045025869dc0ef54d Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 18 Apr 2023 16:13:01 +0400 Subject: [PATCH 14/84] hardhat polygon v1 --- smart-contracts/contracts/Validator.sol | 4 ++ smart-contracts/hardhat.config.ts | 65 +++++++++++++------ smart-contracts/test/ValidatorContractTest.ts | 4 ++ 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 7fef316..556f3ce 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -328,6 +328,10 @@ contract ValidatorV1 is Ownable { return nodeMap[_nodeWallet]; } + function getNodes() public view returns (address[] memory) { + return nodes; + } + function doReport(NodeInfo storage targetNode) private { targetNode.counters.reportCounter++; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index e0f842f..0baeda0 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -4,33 +4,56 @@ import {HardhatUserConfig, task} from "hardhat/config"; require('@openzeppelin/hardhat-upgrades'); require('@nomiclabs/hardhat-etherscan') import "@nomicfoundation/hardhat-toolbox"; -require("dotenv").config(); +import {HardhatRuntimeEnvironment} from "hardhat/types"; -// task("balance", "Prints an account's balance") -// .setAction(async () => {}); +require("dotenv").config(); const config: HardhatUserConfig = { - solidity: "0.8.17", - // defaultNetwork: "polygon_mumbai", - - networks: { - hardhat: { + solidity: "0.8.17", + // defaultNetwork: "polygon_mumbai", + + networks: { + hardhat: {}, + polygon_mumbai: { + url: "https://rpc-mumbai.maticvigil.com", + accounts: [process.env.PRIVATE_KEY_POLYGON_TESTNET_MUMBAI] + }, + goerli: { + url: `https://eth-goerli.alchemyapi.io/v2/${process.env.ALCHEMY_API_KEY}`, + accounts: [process.env.PRIVATE_KEY || ""] + } }, - polygon_mumbai: { - url: "https://rpc-mumbai.maticvigil.com", - accounts: [process.env.PRIVATE_KEY] - }, - goerli: { - url: `https://eth-goerli.alchemyapi.io/v2/${process.env.ALCHEMY_API_KEY}`, - accounts: [process.env.PRIVATE_KEY || ""] - } - }, - etherscan: { - apiKey: process.env.ETHERSCAN_API_KEY - } + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY + } }; +export default config; +/* TASKS */ -export default config; + +async function printBalance(hre: HardhatRuntimeEnvironment, addr) { + const pushCt = await hre.ethers.getContractAt("IERC20", process.env.PUSH_TOKEN_ADDRESS); + console.log(`checking balance of ${addr} in IERC20 ${process.env.PUSH_TOKEN_ADDRESS}`); + console.log(await pushCt.balanceOf(addr)); +} + +task("v:balanceForAddr", "prints account balance @ PUSH token") + .addPositionalParam("address") + .setAction(async (taskArgs, hre) => { + await printBalance(hre, taskArgs.address); + }); + +task("v:balanceForValidatorContract", "prints validator contract balance @ PUSH token") + .setAction(async (taskArgs, hre) => { + await printBalance(hre, process.env.VALIDATOR_CT_ADDRESS); + }); + +task("v:getNodes", "shows validator nodes registered") + .setAction(async (taskArgs, hre) => { + const validatorCt = await hre.ethers.getContractAt("ValidatorV1", process.env.VALIDATOR_CT_ADDRESS); + console.log(`showing validator nodes registered in ${process.env.VALIDATOR_CT_ADDRESS}`); + console.log(await validatorCt.getNodes()); + }); \ No newline at end of file diff --git a/smart-contracts/test/ValidatorContractTest.ts b/smart-contracts/test/ValidatorContractTest.ts index f9a8e92..d686c74 100644 --- a/smart-contracts/test/ValidatorContractTest.ts +++ b/smart-contracts/test/ValidatorContractTest.ts @@ -153,6 +153,10 @@ describe("Validator Test1", function () { expect(nodeInfo.status).to.be.equal(0); } expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); + { + let t2 = await valContract.getNodes(); + console.log(t2); + } }) }); From 2c1c9f2ba09dedea9592c499f414b06a9f4bd474 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 18 Apr 2023 16:47:21 +0400 Subject: [PATCH 15/84] hardhat polygon v2 --- smart-contracts/hardhat.config.ts | 129 ++++++++++++++++++- smart-contracts/scripts/deploy.ts | 2 +- smart-contracts/scripts/registerTestNodes.ts | 4 +- 3 files changed, 125 insertions(+), 10 deletions(-) diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index 0baeda0..2224464 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -1,11 +1,15 @@ // noinspection SpellCheckingInspection import {HardhatUserConfig, task} from "hardhat/config"; + require('@openzeppelin/hardhat-upgrades'); require('@nomiclabs/hardhat-etherscan') import "@nomicfoundation/hardhat-toolbox"; import {HardhatRuntimeEnvironment} from "hardhat/types"; +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +import {ethers} from "hardhat"; +let log = console.log; require("dotenv").config(); const config: HardhatUserConfig = { @@ -32,14 +36,50 @@ const config: HardhatUserConfig = { export default config; /* TASKS */ +const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS; +const validatorCtAddr = process.env.VALIDATOR_CT_ADDRESS; + +/** + * + * @param pushAddr push smart contract (deployed) + * @param validatorAddr validator smart contract (deployed) + * @param nodeOwner the wallet which pays for the node registration + * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) + * @param amount amount of push tokens + * @param nodeUrl node api url endpoint + */ +async function registerNode(hre: HardhatRuntimeEnvironment, + pushAddr: string, validatorAddr: string, + nodeOwner: SignerWithAddress, + nodeAddr: string, amount: number, nodeUrl: string) { + const ethers = hre.ethers; + + const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); + let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); + await tx1.wait(); + log("node ", nodeAddr); + + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); + let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, + nodeUrl, nodeAddr); + await tx2.wait(); + let res = await validatorCt.getNodeInfo(nodeAddr); + log("getNodeInfo:", res); +} async function printBalance(hre: HardhatRuntimeEnvironment, addr) { - const pushCt = await hre.ethers.getContractAt("IERC20", process.env.PUSH_TOKEN_ADDRESS); - console.log(`checking balance of ${addr} in IERC20 ${process.env.PUSH_TOKEN_ADDRESS}`); - console.log(await pushCt.balanceOf(addr)); + const pushCt = await hre.ethers.getContractAt("IERC20", pushTokenAddr); + log(`checking balance of ${addr} in IERC20 ${pushTokenAddr}`); + log(await pushCt.balanceOf(addr)); } +task("v:info", "shows all properties") + .setAction(async (taskArgs, hre) => { + log(`pushTokenAddr=${pushTokenAddr} + validatorCtAddr=${validatorCtAddr}`) + }); + task("v:balanceForAddr", "prints account balance @ PUSH token") .addPositionalParam("address") .setAction(async (taskArgs, hre) => { @@ -48,12 +88,87 @@ task("v:balanceForAddr", "prints account balance @ PUSH token") task("v:balanceForValidatorContract", "prints validator contract balance @ PUSH token") .setAction(async (taskArgs, hre) => { - await printBalance(hre, process.env.VALIDATOR_CT_ADDRESS); + + await printBalance(hre, validatorCtAddr); }); task("v:getNodes", "shows validator nodes registered") .setAction(async (taskArgs, hre) => { const validatorCt = await hre.ethers.getContractAt("ValidatorV1", process.env.VALIDATOR_CT_ADDRESS); - console.log(`showing validator nodes registered in ${process.env.VALIDATOR_CT_ADDRESS}`); - console.log(await validatorCt.getNodes()); - }); \ No newline at end of file + log(`showing validator nodes registered in ${validatorCtAddr}`); + log(await validatorCt.getNodes()); + }); + +task("v:registerNodeWithRandomWallet", "register a node on behalf of owner (he should own @PUSH tokens)") + .addPositionalParam("nodeUrl") + .setAction(async (taskArgs, hre) => { + const nodeUrl = taskArgs.nodeUrl; + const ethers = hre.ethers; + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorCtAddr); + + const randomWallet = ethers.Wallet.createRandom().connect(ethers.provider); + const nodeCollateralFromOwner = 100; + + const [owner] = await ethers.getSigners(); + log(`registering new node`); + log(`owner=${owner.address} + node wallet address=${randomWallet.address} + node wallet private key=${randomWallet.privateKey} + collateral=${nodeCollateralFromOwner} + PUSH url=${nodeUrl} + `) + log(`nodes before: `, await validatorCt.getNodes()); + await registerNode(hre, pushTokenAddr, validatorCtAddr, owner, + randomWallet.address, nodeCollateralFromOwner, nodeUrl); + log(`nodes after: `, await validatorCt.getNodes()); + }); + +/* + +npx hardhat --network polygon_mumbai v:balanceForValidatorContract +checking balance of 0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 in IERC20 0x7c34E2Ef947e494b5cf9FF8EBc5bB23226026905 +BigNumber { value: "100" } + + +npx hardhat --network polygon_mumbai v:info +pushTokenAddr=0x7c34E2Ef947e494b5cf9FF8EBc5bB23226026905 + validatorCtAddr=0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 + + + +npx hardhat --network polygon_mumbai v:getNodes +showing validator nodes registered in 0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 +[ '0x47A40E58419C99013305f9559238028CC823fFE1' ] + +igx@igxmbp contract % npx hardhat --network polygon_mumbai v:registerNodeWithRandomWallet "http://localhost:4001" +registering new node +owner=0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1 + node wallet address=0x47A40E58419C99013305f9559238028CC823fFE1 + node wallet private key=0x47415b01beb052363f0c90b010f4bb80b7739baf116e602612460772a1837c57 + collateral=100 + PUSH url=http://localhost:4001 + +nodes before: [] +node 0x47A40E58419C99013305f9559238028CC823fFE1 +getNodeInfo: [ + '0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1', + '0x47A40E58419C99013305f9559238028CC823fFE1', + 0, + BigNumber { value: "100" }, + 'http://localhost:4001', + [ 0, 0, reportCounter: 0, slashCounter: 0 ], + 0, + ownerWallet: '0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1', + nodeWallet: '0x47A40E58419C99013305f9559238028CC823fFE1', + nodeType: 0, + nodeTokens: BigNumber { value: "100" }, + nodeApiBaseUrl: 'http://localhost:4001', + counters: [ 0, 0, reportCounter: 0, slashCounter: 0 ], + status: 0 +] +nodes after: [ '0x47A40E58419C99013305f9559238028CC823fFE1' ] +igx@igxmbp contract % + + + +*/ diff --git a/smart-contracts/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts index 00a4744..76664ee 100644 --- a/smart-contracts/scripts/deploy.ts +++ b/smart-contracts/scripts/deploy.ts @@ -15,7 +15,7 @@ async function main() { info("PushToken contract: ", pushToken.address); // deploy - const pushTokenAddr = process.env.TOKEN_ADDRESS ?? pushToken?.address; + const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS ?? pushToken?.address; const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); const validator = await validatorV1Factory.deploy(pushTokenAddr); await validator.deployed(); diff --git a/smart-contracts/scripts/registerTestNodes.ts b/smart-contracts/scripts/registerTestNodes.ts index fa6e8b4..c129c56 100644 --- a/smart-contracts/scripts/registerTestNodes.ts +++ b/smart-contracts/scripts/registerTestNodes.ts @@ -10,12 +10,12 @@ async function main() { loadEnvVariables(); const [owner, node1, node2, node3] = await ethers.getSigners(); - const pushAddr = process.env.PUSH_ADDRESS ?? process.exit(1); + const pushAddr = process.env.PUSH_TOKEN_ADDRESS ?? process.exit(1); const validatorAddr = process.env.VALIDATOR_ADDRESS ?? process.exit(1); info("pushAddr is ", pushAddr); info("validatorAddr is ", validatorAddr); - await registerNode(pushAddr, validatorAddr,owner, node1.address,100, "http://localhost:4001"); + await registerNode(pushAddr, validatorAddr, owner, node1.address,100, "http://localhost:4001"); await registerNode(pushAddr, validatorAddr, owner, node2.address,200, "http://localhost:4002"); await registerNode(pushAddr, validatorAddr, owner, node3.address, 300, "http://localhost:4003"); } From 9c0873f9178be65a8d53bdcb06c9fa6423e7a1a8 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 20 Apr 2023 22:21:25 +0400 Subject: [PATCH 16/84] Test Net (1) --- smart-contracts/hardhat.config.ts | 9 +++++---- smart-contracts/scripts/deploy.ts | 4 ++-- smart-contracts/scripts/registerTestNodes.ts | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index 2224464..19511b3 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -36,8 +36,8 @@ const config: HardhatUserConfig = { export default config; /* TASKS */ -const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS; -const validatorCtAddr = process.env.VALIDATOR_CT_ADDRESS; +const pushTokenAddr = process.env.VALIDATOR_PUSH_TOKEN_ADDRESS; +const validatorCtAddr = process.env.VALIDATOR_CONTRACT_ADDRESS; /** @@ -94,12 +94,13 @@ task("v:balanceForValidatorContract", "prints validator contract balance @ PUSH task("v:getNodes", "shows validator nodes registered") .setAction(async (taskArgs, hre) => { - const validatorCt = await hre.ethers.getContractAt("ValidatorV1", process.env.VALIDATOR_CT_ADDRESS); + const validatorCt = await hre.ethers.getContractAt("ValidatorV1", validatorCtAddr); log(`showing validator nodes registered in ${validatorCtAddr}`); log(await validatorCt.getNodes()); }); -task("v:registerNodeWithRandomWallet", "register a node on behalf of owner (he should own @PUSH tokens)") +task("v:registerNodeWithRandomWallet", "register a node on behalf of owner " + + "(he should own @PUSH tokens and approve them for spending by Validator contract)") .addPositionalParam("nodeUrl") .setAction(async (taskArgs, hre) => { const nodeUrl = taskArgs.nodeUrl; diff --git a/smart-contracts/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts index 76664ee..a94e6b7 100644 --- a/smart-contracts/scripts/deploy.ts +++ b/smart-contracts/scripts/deploy.ts @@ -12,14 +12,14 @@ async function main() { const pushToken = await pushTokenFactory.deploy(); await pushToken.deployed(); - info("PushToken contract: ", pushToken.address); + info("VALIDATOR_PUSH_TOKEN_ADDRESS=", pushToken.address); // deploy const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS ?? pushToken?.address; const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); const validator = await validatorV1Factory.deploy(pushTokenAddr); await validator.deployed(); - info("Validator contract ", validator.address); + info("VALIDATOR_CONTRACT_ADDRESS=", validator.address); // give 10k to owner await pushToken.mint(owner.address, ethers.utils.parseEther("10000")); diff --git a/smart-contracts/scripts/registerTestNodes.ts b/smart-contracts/scripts/registerTestNodes.ts index c129c56..07a63ce 100644 --- a/smart-contracts/scripts/registerTestNodes.ts +++ b/smart-contracts/scripts/registerTestNodes.ts @@ -10,8 +10,8 @@ async function main() { loadEnvVariables(); const [owner, node1, node2, node3] = await ethers.getSigners(); - const pushAddr = process.env.PUSH_TOKEN_ADDRESS ?? process.exit(1); - const validatorAddr = process.env.VALIDATOR_ADDRESS ?? process.exit(1); + const pushAddr = process.env.VALIDATOR_PUSH_TOKEN_ADDRESS ?? process.exit(1); + const validatorAddr = process.env.VALIDATOR_CONTRACT_ADDRESS ?? process.exit(1); info("pushAddr is ", pushAddr); info("validatorAddr is ", validatorAddr); From fcf628d21301f3960fba6ad48518190371d809ac Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 28 Apr 2023 12:03:16 +0400 Subject: [PATCH 17/84] added IERC20 and Ownable2StepUpgradeable istean of a hand-made impl --- smart-contracts/contracts/Validator.sol | 73 +++++++------------------ smart-contracts/package.json | 3 +- 2 files changed, 23 insertions(+), 53 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 556f3ce..868d94c 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -1,49 +1,10 @@ //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -// a mock interface of a PUSH token; only bare minimum is needed -interface IPush { - // allow spender to spend rawAmount on behalf of the caller - function approve(address spender, uint rawAmount) external returns (bool); - // checks allowance limit set by approve - function allowance(address account, address spender) external view returns (uint); - // transfer allowed tokens (for src) - function transferFrom(address src, address dst, uint rawAmount) external returns (bool); - // transfer allowed tokens (for current contract) - function transfer(address dst, uint rawAmount) external returns (bool); - - function balanceOf(address account) external view returns (uint256); -} - -contract Ownable { - address public owner; - address public newOwner; - - function transferOwnership(address _newOwner) external { - require(_newOwner != owner, "Cannot transfer ownership to the current owner."); - require(msg.sender == owner, "Only the owner can transfer ownership."); - require(_newOwner != address(0), "Cannot transfer ownership to address(0)"); - newOwner = _newOwner; - emit LogTransferOwnership(msg.sender, block.timestamp); - } - - function acceptOwnership() external { - require(msg.sender == newOwner, "Only the new owner can accept the ownership."); - owner = newOwner; - newOwner = address(0); - emit LogAcceptOwnership(msg.sender, block.timestamp); - } - - event LogTransferOwnership(address indexed oldOwner, uint256 timestamp); - event LogAcceptOwnership(address indexed newOwner, uint256 timestamp); - - modifier isOwner() { - require(owner == msg.sender, "Only the owner can call a method"); - _; - } -} - +// a lib that abstracts privKey signature and pubKey+signature checks library SigUtil { function getMessageHash(bytes memory _message) internal pure returns (bytes32) { @@ -101,24 +62,33 @@ library SigUtil { } } +/* +Validator smart contract -contract ValidatorV1 is Ownable { +Enables a network of Validators +*/ +contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { - uint256 public VNODE_COLLATERAL_IN_PUSH = 100; // todo check the amount + string public protocolVersion = "1.0"; - // X REPORTS -> SLASH , PUNISH $SLASH_COLL_PERCENTAGE - // X SLASHES -> BAN, PUNISH $BAN_COLL_PERCENTAGE + // contract-wide constants + uint256 public VNODE_COLLATERAL_IN_PUSH = 100; uint32 public REPORT_COUNT_TO_SLASH = 2; uint32 public SLASH_COLL_PERCENTAGE = 1; - uint32 public SLASH_COUNT_TO_BAN = 2; uint32 public BAN_COLL_PERCENTAGE = 10; + uint32 public MIN_NODES_FOR_REPORT = 1; // todo update this on node join? - uint32 public MIN_NODES_FOR_REPORT = 1; // todo update this on node join; should be 51% - + // backend-wide + // how many attesters should sign the message block, after validator proposes a block + uint32 public attestersRequired = 1; + // how many networkRandom objects are required to compute a random value + uint32 public nodeRandomMinCount = 1; + // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random + uint32 public nodeRandomFilterPingsRequired = 1; // token storages - IPush pushToken; + IERC20 pushToken; // node colleciton address[] nodes; @@ -190,8 +160,7 @@ contract ValidatorV1 is Ownable { constructor(address _pushToken) { require(_pushToken != address(0)); - owner = msg.sender; - pushToken = IPush(_pushToken); + pushToken = IERC20(_pushToken); } // Registers a new validator node diff --git a/smart-contracts/package.json b/smart-contracts/package.json index 818a037..95f4fd7 100644 --- a/smart-contracts/package.json +++ b/smart-contracts/package.json @@ -7,7 +7,8 @@ }, "dependencies": { "@nomiclabs/hardhat-etherscan": "^3.1.5", - "@openzeppelin/contracts": "^4.8.1", + "@openzeppelin/contracts": "^4.8.3", + "@openzeppelin/contracts-upgradeable": "^4.8.3", "@openzeppelin/hardhat-upgrades": "^1.22.1", "dotenv": "^16.0.3" } From d6ea3df952c28a601a76703e45ebbf81cc4d57df Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 28 Apr 2023 17:34:07 +0400 Subject: [PATCH 18/84] added UUPSUpgradable and 4 commands for deployment --- smart-contracts/contracts/Validator.sol | 197 +++++++++++++++--------- smart-contracts/hardhat.config.ts | 5 +- smart-contracts/scripts/deploy.ts | 1 + smart-contracts/tasks/deployTask.ts | 86 +++++++++++ 4 files changed, 213 insertions(+), 76 deletions(-) create mode 100644 smart-contracts/tasks/deployTask.ts diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 868d94c..b3a34c4 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -3,64 +3,7 @@ pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; - -// a lib that abstracts privKey signature and pubKey+signature checks -library SigUtil { - - function getMessageHash(bytes memory _message) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(_message)); - } - - function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { - /* - Signature is produced by signing a keccak256 hash with the following format: - "\x19Ethereum Signed Message\n" + len(msg) + msg - */ - return - keccak256( - abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) - ); - } - - function recoverSigner( - bytes32 _ethSignedMessageHash, - bytes memory _signature) internal pure returns (address) { - (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); - - return ecrecover(_ethSignedMessageHash, v, r, s); - } - - function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { - require(sig.length == 65, "invalid signature length"); - - assembly { - /* - First 32 bytes stores the length of the signature - - add(sig, 32) = pointer of sig + 32 - effectively, skips first 32 bytes of signature - - mload(p) loads next 32 bytes starting at the memory address p into memory - */ - - // first 32 bytes, after the length prefix - r := mload(add(sig, 32)) - // second 32 bytes - s := mload(add(sig, 64)) - // final byte (first byte of the next 32 bytes) - v := byte(0, mload(add(sig, 96))) - } - - // implicitly return (r, s, v) - } - - function recoverSignerEx(bytes memory _message, bytes memory _signature - ) internal pure returns (address) { - bytes32 messageHash = getMessageHash(_message); - bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); - return recoverSigner(ethSignedMessageHash, _signature); - } -} +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; /* Validator smart contract @@ -69,23 +12,23 @@ Enables a network of Validators */ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { - string public protocolVersion = "1.0"; + uint16 private protocolVersion; - // contract-wide constants - uint256 public VNODE_COLLATERAL_IN_PUSH = 100; - uint32 public REPORT_COUNT_TO_SLASH = 2; - uint32 public SLASH_COLL_PERCENTAGE = 1; - uint32 public SLASH_COUNT_TO_BAN = 2; - uint32 public BAN_COLL_PERCENTAGE = 10; - uint32 public MIN_NODES_FOR_REPORT = 1; // todo update this on node join? + // contract-wide variables + uint256 public vnodeCollateralInPushTokens; + uint32 public REPORT_COUNT_TO_SLASH; + uint32 public SLASH_COLL_PERCENTAGE; + uint32 public SLASH_COUNT_TO_BAN; + uint32 public BAN_COLL_PERCENTAGE; + uint32 public MIN_NODES_FOR_REPORT; - // backend-wide + // backend-wide variables // how many attesters should sign the message block, after validator proposes a block - uint32 public attestersRequired = 1; + uint32 public attestersRequired; // how many networkRandom objects are required to compute a random value - uint32 public nodeRandomMinCount = 1; + uint32 public nodeRandomMinCount; // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random - uint32 public nodeRandomFilterPingsRequired = 1; + uint32 public nodeRandomFilterPingsRequired; // token storages IERC20 pushToken; @@ -123,7 +66,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { OK, // this node operates just fine (DEFAULT VALUE) Reported, // he have a few malicious reports Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) - BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) Unstaked } @@ -158,9 +101,39 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return result; } - constructor(address _pushToken) { - require(_pushToken != address(0)); - pushToken = IERC20(_pushToken); + // an empty constructor; constructor is replaced with initialize() + constructor() { + } + + // called only once when a proxy gets deployed; for updates use reinitializer + function initialize( + uint16 protocolVersion_, + address pushToken_, + uint32 attestersRequired_, + uint32 nodeRandomMinCount_, + uint32 nodeRandomFilterPingsRequired_ + ) initializer public { + // init libraries + __UUPSUpgradeable_init(); + __Ownable_init_unchained(); + // init state + protocolVersion = protocolVersion_; + require(pushToken_ != address(0)); + pushToken = IERC20(pushToken_); + require(attestersRequired_ > 0, "invalid attesters amount"); + attestersRequired = attestersRequired_; + require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); + nodeRandomMinCount = nodeRandomMinCount_; + require(nodeRandomFilterPingsRequired_ > 0, "invalid nodeRandomFilterPingsRequired amount"); + nodeRandomFilterPingsRequired = nodeRandomFilterPingsRequired_; + + vnodeCollateralInPushTokens = 100; + REPORT_COUNT_TO_SLASH = 2; + SLASH_COLL_PERCENTAGE = 1; + SLASH_COUNT_TO_BAN = 2; + BAN_COLL_PERCENTAGE = 10; + MIN_NODES_FOR_REPORT = 1; + // todo update this on node join } // Registers a new validator node @@ -170,7 +143,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { NodeType _nodeType, string memory _nodeApiBaseUrl, address _nodeWallet) public { uint256 coll = _nodeTokens; if (_nodeType == NodeType.VNode) { - require(coll >= VNODE_COLLATERAL_IN_PUSH, "Insufficient collateral for VNODE"); + require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for VNODE"); } else { revert("unsupported nodeType "); } @@ -321,4 +294,78 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } + + /*****************/ + /* UUPS required */ + /*****************/ + + function _authorizeUpgrade(address) internal override onlyOwner {} + + function getProtocolVersion() public view returns (uint16) { + return protocolVersion; + } + + function getCodeVersion() public pure returns (uint16){ + return 2; + } + +} + + +// a lib that abstracts privKey signature and pubKey+signature checks +library SigUtil { + + function getMessageHash(bytes memory _message) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(_message)); + } + + function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { + /* + Signature is produced by signing a keccak256 hash with the following format: + "\x19Ethereum Signed Message\n" + len(msg) + msg + */ + return + keccak256( + abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) + ); + } + + function recoverSigner( + bytes32 _ethSignedMessageHash, + bytes memory _signature) internal pure returns (address) { + (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); + + return ecrecover(_ethSignedMessageHash, v, r, s); + } + + function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { + require(sig.length == 65, "invalid signature length"); + + assembly { + /* + First 32 bytes stores the length of the signature + + add(sig, 32) = pointer of sig + 32 + effectively, skips first 32 bytes of signature + + mload(p) loads next 32 bytes starting at the memory address p into memory + */ + + // first 32 bytes, after the length prefix + r := mload(add(sig, 32)) + // second 32 bytes + s := mload(add(sig, 64)) + // final byte (first byte of the next 32 bytes) + v := byte(0, mload(add(sig, 96))) + } + + // implicitly return (r, s, v) + } + + function recoverSignerEx(bytes memory _message, bytes memory _signature + ) internal pure returns (address) { + bytes32 messageHash = getMessageHash(_message); + bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); + return recoverSigner(ethSignedMessageHash, _signature); + } } \ No newline at end of file diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index 19511b3..7395618 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -39,7 +39,6 @@ export default config; const pushTokenAddr = process.env.VALIDATOR_PUSH_TOKEN_ADDRESS; const validatorCtAddr = process.env.VALIDATOR_CONTRACT_ADDRESS; - /** * * @param pushAddr push smart contract (deployed) @@ -124,6 +123,10 @@ task("v:registerNodeWithRandomWallet", "register a node on behalf of owner " + log(`nodes after: `, await validatorCt.getNodes()); }); +import "./tasks/deployTask" + + + /* npx hardhat --network polygon_mumbai v:balanceForValidatorContract diff --git a/smart-contracts/scripts/deploy.ts b/smart-contracts/scripts/deploy.ts index a94e6b7..a6697cd 100644 --- a/smart-contracts/scripts/deploy.ts +++ b/smart-contracts/scripts/deploy.ts @@ -1,5 +1,6 @@ import {ethers} from "hardhat"; import {config as loadEnvVariables} from "dotenv"; +import {task} from "hardhat/config"; let info = console.log; diff --git a/smart-contracts/tasks/deployTask.ts b/smart-contracts/tasks/deployTask.ts new file mode 100644 index 0000000..539d29c --- /dev/null +++ b/smart-contracts/tasks/deployTask.ts @@ -0,0 +1,86 @@ +import {subtask, task, types} from "hardhat/config" +// import "ts-node/register" +// import "tsconfig-paths/register" + +let info = console.log; + +task("v:deployTestPushTokenCt", "register a test push token; owner emits 10k for himself") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + info(`owner is ${owner.address}`); + + const pushTokenFactory = await ethers.getContractFactory("PushToken"); + const pushToken = await pushTokenFactory.deploy(); + await pushToken.deployed(); + info(`pushToken deployed`); + + const mintAmount = "100000"; + const amount = ethers.utils.parseEther(mintAmount); + await pushToken.mint(owner.address, amount); + let finalBalance = await pushToken.balanceOf(owner.address); + info(`minted ${mintAmount} for owner ${owner.address}, balance is ${finalBalance}`); + info(`pushToken address: ${pushToken.address}`); + }); + + +task("v:deployValidatorCt", "deploys validatorCt") + .addPositionalParam("pushCt", "push token contract") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const pushCt = taskArgs.pushCt; + info(`owner is ${owner.address}`); + info(`pushcontract is ${pushCt}`); + + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushCt, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + info(`deployed proxy: ${validatorV1Proxy.address}`); + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + console.log(`deployed impl: ${validatorV1Impl}`); + }); + + +task("v:updateValidatorCt", "redeploys a new validatorCt") + .addPositionalParam("validatorProxyCt", "validatorCt proxy address") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const validatorProxyCt = taskArgs.validatorProxyCt; + info(`owner is ${owner.address}`); + info(`proxy is ${validatorProxyCt}`); + + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const abi = await upgrades.upgradeProxy(validatorProxyCt, validatorV1Factory, {kind: 'uups'}); + info(`updated proxy at address: ${abi.address}`); + + // let validatorV1ImplCt = await upgrades.erc1967.getImplementationAddress(validatorProxyCt.address); + // let proxyAdminCt = await upgrades.erc1967.getAdminAddress(validatorProxyCt.address); + // console.log("contract is ", validatorV1ImplCt); + // console.log("proxyAdmin is ", proxyAdminCt); + + + }); +/* + +// await upgrades.deployProxy(MyTokenV1); +async function main() { + loadEnvVariables(); + + // deploy token + + + // deploy + const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS ?? pushToken?.address; + + info("VALIDATOR_CONTRACT_ADDRESS=", validator.address); + + // give 10k to owner + await pushToken.mint(owner.address, ethers.utils.parseEther("10000")); + info("owner ", owner.address); + info("owner balance ", await pushToken.balanceOf(owner.address)); +} +*/ From 30d7b4350ad1e6ada7622fbb8d09a9eff06f4515 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 2 May 2023 19:13:27 +0400 Subject: [PATCH 19/84] moved from scripts to tasks; updated readme --- .../.openzeppelin/unknown-31337.json | 227 ------------------ smart-contracts/README.md | 36 +-- smart-contracts/contracts/Validator.sol | 52 +++- smart-contracts/tasks/deployTask.ts | 64 +++-- 4 files changed, 108 insertions(+), 271 deletions(-) delete mode 100644 smart-contracts/.openzeppelin/unknown-31337.json diff --git a/smart-contracts/.openzeppelin/unknown-31337.json b/smart-contracts/.openzeppelin/unknown-31337.json deleted file mode 100644 index f13bee7..0000000 --- a/smart-contracts/.openzeppelin/unknown-31337.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "manifestVersion": "3.2", - "admin": { - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "txHash": "0x729886419dfd10d99553a524ef1de92612b2c05396e3cfbabc48930564924ded" - }, - "proxies": [ - { - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "txHash": "0xc8dd28d9ae65474cfbe45dcc55b99690d72a4eaf1b39ea6f5a8d7cd47043d85e", - "kind": "transparent" - } - ], - "impls": { - "5cfdc4f9e85f54112511068b444fcbd0d037a22cea98694d1e52b19ac963498b": { - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "txHash": "0x839b50d1144d3939baf0ed2e2eb2731afc670d45a735271abc7e5a3e970d6e3f", - "layout": { - "solcVersion": "0.8.17", - "storage": [ - { - "label": "pubKeyToNodeMap", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_struct(NodeInfo)45_storage)", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:6" - }, - { - "label": "nsToShardToSNodeMap", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_string_memory_ptr,t_mapping(t_string_memory_ptr,t_array(t_string_storage)dyn_storage))", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:8" - }, - { - "label": "nsToShard", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_string_memory_ptr,t_array(t_string_storage)dyn_storage)", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:10" - }, - { - "label": "SNODE_COLLATERAL", - "offset": 0, - "slot": "3", - "type": "t_uint256", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:12" - }, - { - "label": "VNODE_COLLATERAL", - "offset": 0, - "slot": "4", - "type": "t_uint256", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:13" - }, - { - "label": "owner", - "offset": 0, - "slot": "5", - "type": "t_address", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:15" - }, - { - "label": "newOwner", - "offset": 0, - "slot": "6", - "type": "t_address", - "contract": "DStorageV1", - "src": "contracts/DStorageV1.sol:16" - } - ], - "types": { - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_string_storage)dyn_storage": { - "label": "string[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(Vote)55_storage)dyn_storage": { - "label": "struct DStorageV1.Vote[]", - "numberOfBytes": "32" - }, - "t_bytes_storage": { - "label": "bytes", - "numberOfBytes": "32" - }, - "t_enum(NodeType)66": { - "label": "enum DStorageV1.NodeType", - "members": [ - "VNode", - "SNode", - "DNode" - ], - "numberOfBytes": "1" - }, - "t_enum(SlashResult)59": { - "label": "enum DStorageV1.SlashResult", - "members": [ - "OK", - "Slash", - "Ban" - ], - "numberOfBytes": "1" - }, - "t_enum(VoteAction)62": { - "label": "enum DStorageV1.VoteAction", - "members": [ - "Slash", - "Ban" - ], - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_struct(NodeInfo)45_storage)": { - "label": "mapping(address => struct DStorageV1.NodeInfo)", - "numberOfBytes": "32" - }, - "t_mapping(t_string_memory_ptr,t_array(t_string_storage)dyn_storage)": { - "label": "mapping(string => string[])", - "numberOfBytes": "32" - }, - "t_mapping(t_string_memory_ptr,t_mapping(t_string_memory_ptr,t_array(t_string_storage)dyn_storage))": { - "label": "mapping(string => mapping(string => string[]))", - "numberOfBytes": "32" - }, - "t_string_memory_ptr": { - "label": "string", - "numberOfBytes": "32" - }, - "t_string_storage": { - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(NodeInfo)45_storage": { - "label": "struct DStorageV1.NodeInfo", - "members": [ - { - "label": "pubKey", - "type": "t_bytes_storage", - "offset": 0, - "slot": "0" - }, - { - "label": "walletId", - "type": "t_address", - "offset": 0, - "slot": "1" - }, - { - "label": "nodeType", - "type": "t_enum(NodeType)66", - "offset": 20, - "slot": "1" - }, - { - "label": "pushTokensLocked", - "type": "t_uint256", - "offset": 0, - "slot": "2" - }, - { - "label": "nodeApiBaseUrl", - "type": "t_string_storage", - "offset": 0, - "slot": "3" - }, - { - "label": "votes", - "type": "t_array(t_struct(Vote)55_storage)dyn_storage", - "offset": 0, - "slot": "4" - }, - { - "label": "slashResult", - "type": "t_enum(SlashResult)59", - "offset": 0, - "slot": "5" - } - ], - "numberOfBytes": "192" - }, - "t_struct(Vote)55_storage": { - "label": "struct DStorageV1.Vote", - "members": [ - { - "label": "ts", - "type": "t_uint256", - "offset": 0, - "slot": "0" - }, - { - "label": "voter", - "type": "t_address", - "offset": 0, - "slot": "1" - }, - { - "label": "target", - "type": "t_address", - "offset": 0, - "slot": "2" - }, - { - "label": "voteAction", - "type": "t_enum(VoteAction)62", - "offset": 20, - "slot": "2" - } - ], - "numberOfBytes": "96" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - } - } - } - } - } -} diff --git a/smart-contracts/README.md b/smart-contracts/README.md index 7f24505..f325279 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -1,32 +1,36 @@ # Validator contract -# How to run tests (uses embedded EVM, it resets for every test case) +## 1 How to run tests (uses embedded EVM, it resets for every test case) ```shell npx hardhat test ``` -# How to set up the local env +## 2 How to set up the local env -## Run an empty local hardhat EVM as a DEDICATED SEPARATE PROCESS +Run an empty local hardhat EVM as a DEDICATED SEPARATE PROCESS ```shell export PRIVATE_KEY=[YOUR KEY] npx hardhat node ``` -## Deploy Push contract and validator contract +Deploy Push contract and validator contract ```shell -npx hardhat run --network localhost scripts/deploy.ts +# compile everything +npx hardhat compile +# deploy a test PUSH token an put the result address into a variable +npx hardhat --network localhost v:deployTestPushTokenCt +export PUSH_CT=0x5FbDB2315678afecb367f032d93F642f64180aa3 // example address +# deploy Validator and puth the result (proxy) address into a variable +npx hardhat --network localhost v:deployValidatorCt $PUSH_CT +export VAL_CT=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 // example address + +# for contract updates only (using proxy!) +npx hardhat --network localhost v:updateValidatorCt $VAL_CT + +# to register 3 validator nodes +npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT 8e12de12c35eabf35b56b04e53c4e468e46727e8 "http://localhost:4001" 101 +npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT fdaeaf7afcfbb4e4d16dc66bd2039fd6004cfce8 "http://localhost:4002" 102 +npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT 98f9d910aef9b3b9a45137af1ca7675ed90a5355 "http://localhost:4003" 103 -# read the output and export contract addresses - - -export PUSH_ADDRESS=[PUSH_CONTRACT_ADDRESS] -export VALIDATOR_ADDRESS=[VALIDATOR_CONTRACT_ADDRESS] -``` - -## Register 3 local test nodes (see the script for details) - -```shell -npx hardhat run --network localhost scripts/registerTestNodes.ts ``` diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index b3a34c4..9bb3d4e 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -24,11 +24,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // backend-wide variables // how many attesters should sign the message block, after validator proposes a block - uint32 public attestersRequired; + uint8 public attestersRequired; // how many networkRandom objects are required to compute a random value - uint32 public nodeRandomMinCount; + uint8 public nodeRandomMinCount; // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random - uint32 public nodeRandomFilterPingsRequired; + uint8 public nodeRandomPingCount; + + // token storages IERC20 pushToken; @@ -39,6 +41,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 totalStaked; // push tokens owned by this contract; which have an owner uint256 totalPenalties; // push tokens owned by this contract; comes from penalties + /* EVENTS */ + event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); + event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); + + event AttestersRequiredUpdated(uint32 value); + event NodeRandomMinCountUpdated(uint32 value); + event NodeRandomPingCountUpdated(uint32 value); + + /* TYPES */ + + struct NodeInfo { address ownerWallet; address nodeWallet; // eth wallet @@ -82,10 +95,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { DNode // delivery } - event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); - event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); - - struct VoteMessage { VoteAction vote; address target; @@ -109,9 +118,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function initialize( uint16 protocolVersion_, address pushToken_, - uint32 attestersRequired_, - uint32 nodeRandomMinCount_, - uint32 nodeRandomFilterPingsRequired_ + uint8 attestersRequired_, + uint8 nodeRandomMinCount_, + uint8 nodeRandomPingCount_ ) initializer public { // init libraries __UUPSUpgradeable_init(); @@ -124,8 +133,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { attestersRequired = attestersRequired_; require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); nodeRandomMinCount = nodeRandomMinCount_; - require(nodeRandomFilterPingsRequired_ > 0, "invalid nodeRandomFilterPingsRequired amount"); - nodeRandomFilterPingsRequired = nodeRandomFilterPingsRequired_; + require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); + nodeRandomPingCount = nodeRandomPingCount_; vnodeCollateralInPushTokens = 100; REPORT_COUNT_TO_SLASH = 2; @@ -309,6 +318,23 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return 2; } + function updateAttestersRequired(uint8 amount) public onlyOwner { + require(amount >= 0 && amount < nodes.length); + attestersRequired = amount; + emit AttestersRequiredUpdated(amount); + } + + function updateNodeRandomMinCount(uint8 amount) public onlyOwner { + require(amount >= 0 && amount < nodes.length); + nodeRandomMinCount = amount; + emit NodeRandomMinCountUpdated(amount); + } + + function updateNodeRandomPingCount(uint8 amount) public onlyOwner { + require(amount >= 0 && amount < nodes.length); + nodeRandomPingCount = amount; + emit NodeRandomPingCountUpdated(amount); + } } @@ -368,4 +394,6 @@ library SigUtil { bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, _signature); } + + } \ No newline at end of file diff --git a/smart-contracts/tasks/deployTask.ts b/smart-contracts/tasks/deployTask.ts index 539d29c..31064e4 100644 --- a/smart-contracts/tasks/deployTask.ts +++ b/smart-contracts/tasks/deployTask.ts @@ -1,4 +1,5 @@ import {subtask, task, types} from "hardhat/config" +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; // import "ts-node/register" // import "tsconfig-paths/register" @@ -64,23 +65,54 @@ task("v:updateValidatorCt", "redeploys a new validatorCt") }); -/* - -// await upgrades.deployProxy(MyTokenV1); -async function main() { - loadEnvVariables(); - - // deploy token - // deploy - const pushTokenAddr = process.env.PUSH_TOKEN_ADDRESS ?? pushToken?.address; +task("v:registerValidator", "redeploys a new validatorCt") + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeUrl", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const ethers = hre.ethers; + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); + + const nodeAddress = args.nodeAddress; + const nodeUrl = args.nodeUrl; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await registerNode(pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl); + info(`success`); + }); - info("VALIDATOR_CONTRACT_ADDRESS=", validator.address); - // give 10k to owner - await pushToken.mint(owner.address, ethers.utils.parseEther("10000")); - info("owner ", owner.address); - info("owner balance ", await pushToken.balanceOf(owner.address)); -} -*/ +/** + * + * @param pushAddr push smart contract (deployed) + * @param validatorAddr validator smart contract (deployed) + * @param nodeOwner the wallet which pays for the node registration + * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) + * @param amount amount of push tokens + * @param nodeUrl node api url endpoint + */ +async function registerNode(pushAddr: string, validatorAddr: string, + nodeOwner: SignerWithAddress, + nodeAddr: string, amount: number, nodeUrl: string) { + info("registerNode()"); + const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); + let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); + await tx1.wait(); + info("node ", nodeAddr); +/* + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); + let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, + nodeUrl, nodeAddr); + await tx2.wait(); + let res = await validatorCt.getNodeInfo(nodeAddr); + info("getNodeInfo:", res);*/ +} \ No newline at end of file From bc2814160a993c3c0f7a0fc3153e366a29636608 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 3 May 2023 11:49:40 +0400 Subject: [PATCH 20/84] improved console tasks --- smart-contracts/README.md | 8 ++ smart-contracts/hardhat.config.ts | 145 +----------------------- smart-contracts/tasks/deployTask.ts | 118 ------------------- smart-contracts/tasks/deployTasks.ts | 56 +++++++++ smart-contracts/tasks/keyTasks.ts | 54 +++++++++ smart-contracts/tasks/utilz/TaskUtil.ts | 33 ++++++ smart-contracts/tasks/validatorTasks.ts | 52 +++++++++ 7 files changed, 206 insertions(+), 260 deletions(-) delete mode 100644 smart-contracts/tasks/deployTask.ts create mode 100644 smart-contracts/tasks/deployTasks.ts create mode 100644 smart-contracts/tasks/keyTasks.ts create mode 100644 smart-contracts/tasks/utilz/TaskUtil.ts create mode 100644 smart-contracts/tasks/validatorTasks.ts diff --git a/smart-contracts/README.md b/smart-contracts/README.md index f325279..5d3cbba 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -34,3 +34,11 @@ npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT 98f9d910aef9b3b9a45137af1ca7675ed90a5355 "http://localhost:4003" 103 ``` + +Info commands +```shell +# show balance in PUSH tokens for Validator contract +npx hardhat --network localhost push:balanceOf --push-ct $PUSH_CT $VAL_CT +# show registered validator nodes +npx hardhat --network localhost v:listNodes --validator-proxy-ct $VAL_CT +``` diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index 7395618..dea1472 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -7,9 +7,7 @@ require('@nomiclabs/hardhat-etherscan') import "@nomicfoundation/hardhat-toolbox"; import {HardhatRuntimeEnvironment} from "hardhat/types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -import {ethers} from "hardhat"; -let log = console.log; require("dotenv").config(); const config: HardhatUserConfig = { @@ -36,143 +34,6 @@ const config: HardhatUserConfig = { export default config; /* TASKS */ -const pushTokenAddr = process.env.VALIDATOR_PUSH_TOKEN_ADDRESS; -const validatorCtAddr = process.env.VALIDATOR_CONTRACT_ADDRESS; - -/** - * - * @param pushAddr push smart contract (deployed) - * @param validatorAddr validator smart contract (deployed) - * @param nodeOwner the wallet which pays for the node registration - * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) - * @param amount amount of push tokens - * @param nodeUrl node api url endpoint - */ -async function registerNode(hre: HardhatRuntimeEnvironment, - pushAddr: string, validatorAddr: string, - nodeOwner: SignerWithAddress, - nodeAddr: string, amount: number, nodeUrl: string) { - const ethers = hre.ethers; - - const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); - let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); - await tx1.wait(); - log("node ", nodeAddr); - - const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); - let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, - nodeUrl, nodeAddr); - await tx2.wait(); - let res = await validatorCt.getNodeInfo(nodeAddr); - log("getNodeInfo:", res); -} - -async function printBalance(hre: HardhatRuntimeEnvironment, addr) { - const pushCt = await hre.ethers.getContractAt("IERC20", pushTokenAddr); - log(`checking balance of ${addr} in IERC20 ${pushTokenAddr}`); - log(await pushCt.balanceOf(addr)); -} - -task("v:info", "shows all properties") - .setAction(async (taskArgs, hre) => { - log(`pushTokenAddr=${pushTokenAddr} - validatorCtAddr=${validatorCtAddr}`) - }); - -task("v:balanceForAddr", "prints account balance @ PUSH token") - .addPositionalParam("address") - .setAction(async (taskArgs, hre) => { - await printBalance(hre, taskArgs.address); - }); - -task("v:balanceForValidatorContract", "prints validator contract balance @ PUSH token") - .setAction(async (taskArgs, hre) => { - - await printBalance(hre, validatorCtAddr); - }); - -task("v:getNodes", "shows validator nodes registered") - .setAction(async (taskArgs, hre) => { - const validatorCt = await hre.ethers.getContractAt("ValidatorV1", validatorCtAddr); - log(`showing validator nodes registered in ${validatorCtAddr}`); - log(await validatorCt.getNodes()); - }); - -task("v:registerNodeWithRandomWallet", "register a node on behalf of owner " + - "(he should own @PUSH tokens and approve them for spending by Validator contract)") - .addPositionalParam("nodeUrl") - .setAction(async (taskArgs, hre) => { - const nodeUrl = taskArgs.nodeUrl; - const ethers = hre.ethers; - const validatorCt = await ethers.getContractAt("ValidatorV1", validatorCtAddr); - - const randomWallet = ethers.Wallet.createRandom().connect(ethers.provider); - const nodeCollateralFromOwner = 100; - - const [owner] = await ethers.getSigners(); - log(`registering new node`); - log(`owner=${owner.address} - node wallet address=${randomWallet.address} - node wallet private key=${randomWallet.privateKey} - collateral=${nodeCollateralFromOwner} - PUSH url=${nodeUrl} - `) - log(`nodes before: `, await validatorCt.getNodes()); - await registerNode(hre, pushTokenAddr, validatorCtAddr, owner, - randomWallet.address, nodeCollateralFromOwner, nodeUrl); - log(`nodes after: `, await validatorCt.getNodes()); - }); - -import "./tasks/deployTask" - - - -/* - -npx hardhat --network polygon_mumbai v:balanceForValidatorContract -checking balance of 0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 in IERC20 0x7c34E2Ef947e494b5cf9FF8EBc5bB23226026905 -BigNumber { value: "100" } - - -npx hardhat --network polygon_mumbai v:info -pushTokenAddr=0x7c34E2Ef947e494b5cf9FF8EBc5bB23226026905 - validatorCtAddr=0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 - - - -npx hardhat --network polygon_mumbai v:getNodes -showing validator nodes registered in 0xe0FcfCa5E1e2dB7F25B92F62307113Fbdfdc4bf2 -[ '0x47A40E58419C99013305f9559238028CC823fFE1' ] - -igx@igxmbp contract % npx hardhat --network polygon_mumbai v:registerNodeWithRandomWallet "http://localhost:4001" -registering new node -owner=0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1 - node wallet address=0x47A40E58419C99013305f9559238028CC823fFE1 - node wallet private key=0x47415b01beb052363f0c90b010f4bb80b7739baf116e602612460772a1837c57 - collateral=100 - PUSH url=http://localhost:4001 - -nodes before: [] -node 0x47A40E58419C99013305f9559238028CC823fFE1 -getNodeInfo: [ - '0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1', - '0x47A40E58419C99013305f9559238028CC823fFE1', - 0, - BigNumber { value: "100" }, - 'http://localhost:4001', - [ 0, 0, reportCounter: 0, slashCounter: 0 ], - 0, - ownerWallet: '0xa8FdBe12dfC9cAFB825E89D2Cd634ce2c666EbB1', - nodeWallet: '0x47A40E58419C99013305f9559238028CC823fFE1', - nodeType: 0, - nodeTokens: BigNumber { value: "100" }, - nodeApiBaseUrl: 'http://localhost:4001', - counters: [ 0, 0, reportCounter: 0, slashCounter: 0 ], - status: 0 -] -nodes after: [ '0x47A40E58419C99013305f9559238028CC823fFE1' ] -igx@igxmbp contract % - - - -*/ +import "./tasks/deployTasks" +import "./tasks/keyTasks" +import "./tasks/validatorTasks" \ No newline at end of file diff --git a/smart-contracts/tasks/deployTask.ts b/smart-contracts/tasks/deployTask.ts deleted file mode 100644 index 31064e4..0000000 --- a/smart-contracts/tasks/deployTask.ts +++ /dev/null @@ -1,118 +0,0 @@ -import {subtask, task, types} from "hardhat/config" -import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -// import "ts-node/register" -// import "tsconfig-paths/register" - -let info = console.log; - -task("v:deployTestPushTokenCt", "register a test push token; owner emits 10k for himself") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - info(`owner is ${owner.address}`); - - const pushTokenFactory = await ethers.getContractFactory("PushToken"); - const pushToken = await pushTokenFactory.deploy(); - await pushToken.deployed(); - info(`pushToken deployed`); - - const mintAmount = "100000"; - const amount = ethers.utils.parseEther(mintAmount); - await pushToken.mint(owner.address, amount); - let finalBalance = await pushToken.balanceOf(owner.address); - info(`minted ${mintAmount} for owner ${owner.address}, balance is ${finalBalance}`); - info(`pushToken address: ${pushToken.address}`); - }); - - -task("v:deployValidatorCt", "deploys validatorCt") - .addPositionalParam("pushCt", "push token contract") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - const pushCt = taskArgs.pushCt; - info(`owner is ${owner.address}`); - info(`pushcontract is ${pushCt}`); - - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushCt, 1, 1, 1], - {kind: "uups"}); - await validatorV1Proxy.deployed(); - info(`deployed proxy: ${validatorV1Proxy.address}`); - let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); - console.log(`deployed impl: ${validatorV1Impl}`); - }); - - -task("v:updateValidatorCt", "redeploys a new validatorCt") - .addPositionalParam("validatorProxyCt", "validatorCt proxy address") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - const validatorProxyCt = taskArgs.validatorProxyCt; - info(`owner is ${owner.address}`); - info(`proxy is ${validatorProxyCt}`); - - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const abi = await upgrades.upgradeProxy(validatorProxyCt, validatorV1Factory, {kind: 'uups'}); - info(`updated proxy at address: ${abi.address}`); - - // let validatorV1ImplCt = await upgrades.erc1967.getImplementationAddress(validatorProxyCt.address); - // let proxyAdminCt = await upgrades.erc1967.getAdminAddress(validatorProxyCt.address); - // console.log("contract is ", validatorV1ImplCt); - // console.log("proxyAdmin is ", proxyAdminCt); - - - }); - - -task("v:registerValidator", "redeploys a new validatorCt") - .addParam("validatorProxyCt", "validatorCt proxy address") - .addParam("pushCt", "push token contract") - .addPositionalParam("nodeAddress", "") - .addPositionalParam("nodeUrl", "") - .addPositionalParam("nodeAmount", "") - .setAction(async (args, hre) => { - const ethers = hre.ethers; - const validatorProxyCt = args.validatorProxyCt; - info(`validatorProxyCt is ${validatorProxyCt}`); - const pushCt = args.pushCt; - info(`pushCt is ${pushCt}`); - const [nodeOwner] = await hre.ethers.getSigners(); - info(`nodeOwner is ${nodeOwner.address}`); - - const nodeAddress = args.nodeAddress; - const nodeUrl = args.nodeUrl; - const nodeAmount = args.nodeAmount; - info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await registerNode(pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl); - info(`success`); - }); - - -/** - * - * @param pushAddr push smart contract (deployed) - * @param validatorAddr validator smart contract (deployed) - * @param nodeOwner the wallet which pays for the node registration - * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) - * @param amount amount of push tokens - * @param nodeUrl node api url endpoint - */ -async function registerNode(pushAddr: string, validatorAddr: string, - nodeOwner: SignerWithAddress, - nodeAddr: string, amount: number, nodeUrl: string) { - info("registerNode()"); - const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); - let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); - await tx1.wait(); - info("node ", nodeAddr); -/* - const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); - let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, - nodeUrl, nodeAddr); - await tx2.wait(); - let res = await validatorCt.getNodeInfo(nodeAddr); - info("getNodeInfo:", res);*/ -} \ No newline at end of file diff --git a/smart-contracts/tasks/deployTasks.ts b/smart-contracts/tasks/deployTasks.ts new file mode 100644 index 0000000..deec5ce --- /dev/null +++ b/smart-contracts/tasks/deployTasks.ts @@ -0,0 +1,56 @@ +import {subtask, task, types} from "hardhat/config" + +let info = console.log; + +task("v:deployTestPushTokenCt", "register a test push token; owner emits 10k for himself") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + info(`owner is ${owner.address}`); + + const pushTokenFactory = await ethers.getContractFactory("PushToken"); + const pushToken = await pushTokenFactory.deploy(); + await pushToken.deployed(); + info(`pushToken deployed`); + + const mintAmount = "100000"; + const amount = ethers.utils.parseEther(mintAmount); + await pushToken.mint(owner.address, amount); + let finalBalance = await pushToken.balanceOf(owner.address); + info(`minted ${mintAmount} for owner ${owner.address}, balance is ${finalBalance}`); + info(`pushToken address: ${pushToken.address}`); + }); + + +task("v:deployValidatorCt", "deploys validatorCt") + .addPositionalParam("pushCt", "push token contract") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const pushCt = taskArgs.pushCt; + info(`owner is ${owner.address}`); + info(`pushcontract is ${pushCt}`); + + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushCt, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + info(`deployed proxy: ${validatorV1Proxy.address}`); + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + console.log(`deployed impl: ${validatorV1Impl}`); + }); + + +task("v:updateValidatorCt", "redeploys a new validatorCt") + .addPositionalParam("validatorProxyCt", "validatorCt proxy address") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const validatorProxyCt = taskArgs.validatorProxyCt; + info(`owner is ${owner.address}`); + info(`proxy is ${validatorProxyCt}`); + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const abi = await upgrades.upgradeProxy(validatorProxyCt, validatorV1Factory, {kind: 'uups'}); + info(`updated proxy at address: ${abi.address}`); + }); \ No newline at end of file diff --git a/smart-contracts/tasks/keyTasks.ts b/smart-contracts/tasks/keyTasks.ts new file mode 100644 index 0000000..6f195c7 --- /dev/null +++ b/smart-contracts/tasks/keyTasks.ts @@ -0,0 +1,54 @@ +import crypto from "crypto"; +import {Wallet} from "ethers"; +import {task} from "hardhat/config"; + +let info = console.log; + +task("key:generateTestEthKeys", "shows a pre defined set of keys used for tests") + .setAction(async (taskArgs, hre) => { + await printPrivateKeyDetails('0x33fb23f822c5dba0f3cb2796b90d56bb553ebd215726398c93374440b34e510b', 'test'); + await printPrivateKeyDetails('0x16c90855a0dfc9884adf2625a4bffcdbfe760d5ff6756a766d2bbc0bc82318f0', 'test'); + await printPrivateKeyDetails('0xb6c538bac86eb0964b16b7ff6a1ac7d5f0736dcbd0f00bd142ae433dad27f685', 'test'); + await printPrivateKeyDetails('0x445ab25af345ce4096ca1e46f6846a4e8617cc1d513440671647f5f137c9c684', 'test'); + }); + +task("key:generateEthKeyFromEthers", "generates secure keys") + .addPositionalParam("passwordForJsonKeyFile") + .setAction(async (args, hre) => { + const wallet = hre.ethers.Wallet.createRandom(); + const privKey = wallet.privateKey; + const address = wallet.address; + info(`generated address=${address}, privKey=${privKey}`); + await printPrivateKeyDetails(privKey, args.passwordForJsonKeyFile); + }); + +task("key:generateEthKeyFromRandom", "generates secure keys") + .addPositionalParam("passwordForJsonKeyFile") + .setAction(async (args, hre) => { + const privKey = generateRandomEthPrivateKey(); + info(`generated privKey=${privKey}`); + await printPrivateKeyDetails(privKey, args.passwordForJsonKeyFile); + }); + + +function generateRandomEthPrivateKey() { + return "0x" + crypto.randomBytes(32).toString("hex"); +} + +async function generateKeys() { + +} + +async function printPrivateKeyDetails(privKey: string, pass: string) { + const wallet1 = new Wallet(privKey); + const wallet1Address = await wallet1.getAddress(); + const encryptedJsonWallet = await wallet1.encrypt(pass); + + info("-".repeat(20)); + info("address ", wallet1Address); + info("privKey", privKey); + info("pubKey", wallet1.publicKey); + info("encrypted json pass:", pass); + info("encrypted json:", encryptedJsonWallet); + info("=".repeat(20)); +} \ No newline at end of file diff --git a/smart-contracts/tasks/utilz/TaskUtil.ts b/smart-contracts/tasks/utilz/TaskUtil.ts new file mode 100644 index 0000000..35d2e7a --- /dev/null +++ b/smart-contracts/tasks/utilz/TaskUtil.ts @@ -0,0 +1,33 @@ +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +import {HardhatRuntimeEnvironment} from "hardhat/types"; + +let info = console.log; + +export class TaskUtil { + /** + * + * @param pushAddr push smart contract (deployed) + * @param validatorAddr validator smart contract (deployed) + * @param nodeOwner the wallet which pays for the node registration + * @param nodeAddr the wallet which is being used for the node operation (it does not contain tokens) + * @param amount amount of push tokens + * @param nodeUrl node api url endpoint + */ + public static async registerNode(hre:HardhatRuntimeEnvironment, + pushAddr: string, validatorAddr: string, + nodeOwner: SignerWithAddress, + nodeAddr: string, amount: number, nodeUrl: string) { + info("registerNode()"); + const ethers = hre.ethers; + const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); + let tx1 = await pushCt.connect(nodeOwner).approve(validatorAddr, amount); + await tx1.wait(); + info("node ", nodeAddr); + const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); + let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, + nodeUrl, nodeAddr); + await tx2.wait(); + let res = await validatorCt.getNodeInfo(nodeAddr); + info("getNodeInfo:", res); + } +} diff --git a/smart-contracts/tasks/validatorTasks.ts b/smart-contracts/tasks/validatorTasks.ts new file mode 100644 index 0000000..c48a708 --- /dev/null +++ b/smart-contracts/tasks/validatorTasks.ts @@ -0,0 +1,52 @@ +import {task} from "hardhat/config"; +import {TaskUtil} from "./utilz/TaskUtil"; +import {HardhatRuntimeEnvironment} from "hardhat/types"; + +let info = console.log; + +task("v:registerValidator", "redeploys a new validatorCt") + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeUrl", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); + + const nodeAddress = args.nodeAddress; + const nodeUrl = args.nodeUrl; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl); + info(`success`); + }); + + +task("push:balanceOf", "prints account balance @ PUSH token") + .addParam("pushCt", "push token contract") + .addPositionalParam("address") + .setAction(async (args, hre) => { + await printBalance(hre, args.pushCt, args.address); + }); + + + +task("v:listNodes", "shows validator nodes registered") + .addParam("validatorProxyCt", "validatorCt proxy address") + .setAction(async (args, hre) => { + const validator = await hre.ethers.getContractAt("ValidatorV1", args.validatorProxyCt); + info(`showing validator nodes registered in ${args.validatorProxyCt}`); + info(await validator.getNodes()); + }); + + +async function printBalance(hre: HardhatRuntimeEnvironment, pushCt:string, balanceAddr:string) { + const push = await hre.ethers.getContractAt("IERC20", pushCt); + info(`checking balance of ${balanceAddr} in IERC20 ${pushCt}`); + info(await push.balanceOf(balanceAddr)); +} \ No newline at end of file From 80efccc8947cdc9da68684c1731579e0b48ab427 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 5 Jun 2023 15:49:19 +0400 Subject: [PATCH 21/84] deliveryNode tasks (5) --- smart-contracts/README.md | 6 ++++++ smart-contracts/contracts/Validator.sol | 16 +++++++++++++--- smart-contracts/tasks/keyTasks.ts | 2 ++ smart-contracts/tasks/utilz/TaskUtil.ts | 4 ++-- smart-contracts/tasks/validatorTasks.ts | 25 +++++++++++++++++++++++-- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/smart-contracts/README.md b/smart-contracts/README.md index 5d3cbba..04d331b 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -33,6 +33,12 @@ npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT fdaeaf7afcfbb4e4d16dc66bd2039fd6004cfce8 "http://localhost:4002" 102 npx hardhat --network localhost v:registerValidator --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT 98f9d910aef9b3b9a45137af1ca7675ed90a5355 "http://localhost:4003" 103 +# to register 1 delivery node +npx hardhat --network localhost v:registerDelivery --validator-proxy-ct $VAL_CT --push-ct $PUSH_CT 816adec240b4744a1e1e112d0411cafb8f256183 200 + + +# check what has been registered +npx hardhat --network localhost v:listNodes --validator-proxy-ct $VAL_CT ``` Info commands diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 9bb3d4e..b9dd160 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -90,9 +90,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } enum NodeType { - VNode, // validator - SNode, // storage - DNode // delivery + VNode, // validator 0 + SNode, // storage 1 + DNode // delivery 2 } struct VoteMessage { @@ -153,6 +153,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 coll = _nodeTokens; if (_nodeType == NodeType.VNode) { require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for VNODE"); + } else if(_nodeType == NodeType.DNode) { + require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for DNODE"); } else { revert("unsupported nodeType "); } @@ -217,6 +219,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler function doReportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ + require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); NodeStatus ns = targetNode.status; // 2 check count if (_vm.vote == VoteAction.Report) { @@ -395,5 +398,12 @@ library SigUtil { return recoverSigner(ethSignedMessageHash, _signature); } + /**********/ + /* Errors */ + /**********/ + + // todo if(!condition) revert Error1(); + // this produces smaller bytecode + error Error1(); } \ No newline at end of file diff --git a/smart-contracts/tasks/keyTasks.ts b/smart-contracts/tasks/keyTasks.ts index 6f195c7..5e7004a 100644 --- a/smart-contracts/tasks/keyTasks.ts +++ b/smart-contracts/tasks/keyTasks.ts @@ -10,6 +10,8 @@ task("key:generateTestEthKeys", "shows a pre defined set of keys used for tests" await printPrivateKeyDetails('0x16c90855a0dfc9884adf2625a4bffcdbfe760d5ff6756a766d2bbc0bc82318f0', 'test'); await printPrivateKeyDetails('0xb6c538bac86eb0964b16b7ff6a1ac7d5f0736dcbd0f00bd142ae433dad27f685', 'test'); await printPrivateKeyDetails('0x445ab25af345ce4096ca1e46f6846a4e8617cc1d513440671647f5f137c9c684', 'test'); + // a key for delivery node tests + await printPrivateKeyDetails('0xaceda8e33da25891123d3f425233f57832d8a139649f660fb2c63571ea777921', 'test'); }); task("key:generateEthKeyFromEthers", "generates secure keys") diff --git a/smart-contracts/tasks/utilz/TaskUtil.ts b/smart-contracts/tasks/utilz/TaskUtil.ts index 35d2e7a..56f9c3f 100644 --- a/smart-contracts/tasks/utilz/TaskUtil.ts +++ b/smart-contracts/tasks/utilz/TaskUtil.ts @@ -16,7 +16,7 @@ export class TaskUtil { public static async registerNode(hre:HardhatRuntimeEnvironment, pushAddr: string, validatorAddr: string, nodeOwner: SignerWithAddress, - nodeAddr: string, amount: number, nodeUrl: string) { + nodeAddr: string, amount: number, nodeUrl: string, nodeType:number) { info("registerNode()"); const ethers = hre.ethers; const pushCt = await ethers.getContractAt("IERC20", pushAddr, nodeOwner); @@ -24,7 +24,7 @@ export class TaskUtil { await tx1.wait(); info("node ", nodeAddr); const validatorCt = await ethers.getContractAt("ValidatorV1", validatorAddr, nodeOwner); - let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, 0, + let tx2 = await validatorCt.connect(nodeOwner).registerNodeAndStake(amount, nodeType, nodeUrl, nodeAddr); await tx2.wait(); let res = await validatorCt.getNodeInfo(nodeAddr); diff --git a/smart-contracts/tasks/validatorTasks.ts b/smart-contracts/tasks/validatorTasks.ts index c48a708..3130f0c 100644 --- a/smart-contracts/tasks/validatorTasks.ts +++ b/smart-contracts/tasks/validatorTasks.ts @@ -4,7 +4,7 @@ import {HardhatRuntimeEnvironment} from "hardhat/types"; let info = console.log; -task("v:registerValidator", "redeploys a new validatorCt") +task("v:registerValidator", "") .addParam("validatorProxyCt", "validatorCt proxy address") .addParam("pushCt", "push token contract") .addPositionalParam("nodeAddress", "") @@ -22,7 +22,28 @@ task("v:registerValidator", "redeploys a new validatorCt") const nodeUrl = args.nodeUrl; const nodeAmount = args.nodeAmount; info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl); + await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 0); + info(`success`); + }); + +task("v:registerDelivery", "redeploys a new validatorCt") + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); + + const nodeAddress = args.nodeAddress; + const nodeUrl = ''; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 2); info(`success`); }); From 140fca6884de59c383d47c3e7f00f764bf3bc0dc Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 14 Jun 2023 02:54:45 +0400 Subject: [PATCH 22/84] deliveryNode tasks (7) --- dstorage-common/src/util/envLoader.ts | 11 +- smart-contracts/contracts/DStorageV1.sol | 3 + smart-contracts/contracts/Validator.sol | 20 +- smart-contracts/tasks/keyTasks.ts | 5 +- snode/migrations/V1__init.sql | 6 +- snode/migrations/V2___sampleData.sql | 36 + snode/package-lock.json | 1869 +++++++++++------ snode/package.json | 6 +- snode/src/api/routes/AppController.ts | 6 +- snode/src/appInit.ts | 8 + snode/src/config/index.ts | 11 +- snode/src/helpers/dbHelper.ts | 10 +- .../src/services/messaging/deliverySocket.ts | 83 + snode/src/services/messaging/messageBlock.ts | 141 ++ snode/src/services/messaging/storageNode.ts | 148 ++ .../services/messaging/validatorContract.ts | 261 +++ snode/src/utilz/ethSig.ts | 33 + snode/src/utilz/objectHasher.ts | 47 + 18 files changed, 2075 insertions(+), 629 deletions(-) create mode 100644 snode/src/services/messaging/deliverySocket.ts create mode 100644 snode/src/services/messaging/messageBlock.ts create mode 100644 snode/src/services/messaging/storageNode.ts create mode 100644 snode/src/services/messaging/validatorContract.ts create mode 100644 snode/src/utilz/ethSig.ts create mode 100644 snode/src/utilz/objectHasher.ts diff --git a/dstorage-common/src/util/envLoader.ts b/dstorage-common/src/util/envLoader.ts index 36da4e8..0857314 100644 --- a/dstorage-common/src/util/envLoader.ts +++ b/dstorage-common/src/util/envLoader.ts @@ -4,12 +4,11 @@ import StrUtil from "./strUtil"; export default class EnvLoader { public static loadEnvOrFail() { - // TODO figure out why this crashes , and why it works without .config() call - // const envFound = dotenv.config(); - // if (envFound.error) { - // // This error should crash whole process - // throw new Error("⚠️ Couldn't find .env file ⚠️"); - // } + const envFound = dotenv.config(); + if (envFound.error) { + // This error should crash whole process + throw new Error("⚠️ Couldn't find .env file ⚠️"); + } } public static getPropertyOrFail(propName:string):string { diff --git a/smart-contracts/contracts/DStorageV1.sol b/smart-contracts/contracts/DStorageV1.sol index e9cbebf..3fce39c 100644 --- a/smart-contracts/contracts/DStorageV1.sol +++ b/smart-contracts/contracts/DStorageV1.sol @@ -11,6 +11,9 @@ contract DStorageV1 { // storage layout: 'feeds' -> ['0x25','0x26'] mapping(string => string[]) nsToShard; // todo not used yet + + + IERC20 public token; uint public constant TIME_1_DAY = 1 days; diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index b9dd160..fc9cfe0 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -31,16 +31,27 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint8 public nodeRandomPingCount; - // token storages IERC20 pushToken; // node colleciton address[] nodes; - mapping(address => NodeInfo) nodeMap; // nodeWallet -> node info + mapping(address => uint16) addrToShortAddr; + mapping(uint16 => NodeInfo) nodeMap; // nodeWallet -> node info + uint16 public unusedNodeId; // increments after each invocation (new node registration) uint256 totalStaked; // push tokens owned by this contract; which have an owner uint256 totalPenalties; // push tokens owned by this contract; comes from penalties + /* storage node mapping + namespace 'notif' + 0x25 -> 0x1, 0x2, 0x3 ; + shards are in 0..0x20; nodeids are in 0x..0xFF; we'll use 2 bytes for safety + shard 0x25 is hosted on 0x1, 0x2, 0x3 + */ + mapping(uint8 => uint16[]) notifShardToNodeId; // todo support shards, and reshard on every storage node registration + // this is the next free index, which will be assigned to a new node + uint16 notifShardsMax = 31; + /* EVENTS */ event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); @@ -53,6 +64,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { struct NodeInfo { + uint16 shortAddr; address ownerWallet; address nodeWallet; // eth wallet NodeType nodeType; @@ -136,6 +148,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); nodeRandomPingCount = nodeRandomPingCount_; + unusedNodeId = 1; vnodeCollateralInPushTokens = 100; REPORT_COUNT_TO_SLASH = 2; SLASH_COLL_PERCENTAGE = 1; @@ -153,7 +166,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 coll = _nodeTokens; if (_nodeType == NodeType.VNode) { require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for VNODE"); - } else if(_nodeType == NodeType.DNode) { + } else if (_nodeType == NodeType.DNode) { require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for DNODE"); } else { revert("unsupported nodeType "); @@ -167,6 +180,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(allowed >= _nodeTokens, "_nodeTokens cannot be transferred, check allowance"); // new mapping NodeInfo memory n; + n.shortAddr = unusedNodeId++; n.ownerWallet = msg.sender; n.nodeWallet = _nodeWallet; n.nodeType = _nodeType; diff --git a/smart-contracts/tasks/keyTasks.ts b/smart-contracts/tasks/keyTasks.ts index 5e7004a..06a87a4 100644 --- a/smart-contracts/tasks/keyTasks.ts +++ b/smart-contracts/tasks/keyTasks.ts @@ -6,12 +6,15 @@ let info = console.log; task("key:generateTestEthKeys", "shows a pre defined set of keys used for tests") .setAction(async (taskArgs, hre) => { + // keys for validator node tests await printPrivateKeyDetails('0x33fb23f822c5dba0f3cb2796b90d56bb553ebd215726398c93374440b34e510b', 'test'); await printPrivateKeyDetails('0x16c90855a0dfc9884adf2625a4bffcdbfe760d5ff6756a766d2bbc0bc82318f0', 'test'); await printPrivateKeyDetails('0xb6c538bac86eb0964b16b7ff6a1ac7d5f0736dcbd0f00bd142ae433dad27f685', 'test'); await printPrivateKeyDetails('0x445ab25af345ce4096ca1e46f6846a4e8617cc1d513440671647f5f137c9c684', 'test'); - // a key for delivery node tests + // keys for delivery node tests await printPrivateKeyDetails('0xaceda8e33da25891123d3f425233f57832d8a139649f660fb2c63571ea777921', 'test'); + // keys for storage node tests + await printPrivateKeyDetails('0xac3a2f1b2eedbf02ef33fc22b438d8e7021c1b72141623d38feebf031fdcb5c9', 'test'); }); task("key:generateEthKeyFromEthers", "generates secure keys") diff --git a/snode/migrations/V1__init.sql b/snode/migrations/V1__init.sql index ef599e5..df15560 100755 --- a/snode/migrations/V1__init.sql +++ b/snode/migrations/V1__init.sql @@ -14,8 +14,8 @@ CREATE TABLE IF NOT EXISTS network_storage_layout ( id SERIAL PRIMARY KEY NOT NULL, namespace VARCHAR(20) NOT NULL, - namespace_shard_id VARCHAR(20) NOT NULL, - node_id VARCHAR(20) NOT NULL + namespace_shard_id VARCHAR(64) NOT NULL, + node_id VARCHAR(64) NOT NULL ); ALTER TABLE network_storage_layout DROP CONSTRAINT IF EXISTS network_storage_layout_uniq; @@ -45,7 +45,7 @@ DROP TABLE IF EXISTS node_storage_layout; CREATE TABLE IF NOT EXISTS node_storage_layout ( namespace VARCHAR(20) NOT NULL, - namespace_shard_id VARCHAR(20) NOT NULL, + namespace_shard_id VARCHAR(64) NOT NULL, ts_start TIMESTAMP NOT NULL default NOW(), ts_end TIMESTAMP NOT NULL default NOW(), table_name VARCHAR(64) NOT NULL diff --git a/snode/migrations/V2___sampleData.sql b/snode/migrations/V2___sampleData.sql index 2c012ef..aeb565b 100644 --- a/snode/migrations/V2___sampleData.sql +++ b/snode/migrations/V2___sampleData.sql @@ -1127,3 +1127,39 @@ INSERT INTO network_storage_layout (id, namespace, namespace_shard_id, node_id) INSERT INTO network_storage_layout (id, namespace, namespace_shard_id, node_id) VALUES (6142, 'feeds', '255', '1'); INSERT INTO network_storage_layout (id, namespace, namespace_shard_id, node_id) VALUES (6143, 'feeds', '255', '2'); INSERT INTO network_storage_layout (id, namespace, namespace_shard_id, node_id) VALUES (6144, 'feeds', '255', '3'); + + +INSERT INTO network_storage_layout (namespace, namespace_shard_id, node_id) +VALUES + ( 'inbox', '0', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '1', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '2', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '3', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '4', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '5', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '6', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '7', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '8', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '9', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '10', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '11', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '12', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '13', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '14', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '15', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '16', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '17', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '18', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '19', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '20', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '21', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '22', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '23', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '24', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '25', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '26', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '27', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '28', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '29', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '30', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'), + ( 'inbox', '31', '0x3563C89b05e4dcD0edEeE0F3e93e396C128C06E2'); diff --git a/snode/package-lock.json b/snode/package-lock.json index 5c26459..a6209ff 100644 --- a/snode/package-lock.json +++ b/snode/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "snode", "version": "0.1", "license": "UNLICENSED", "dependencies": { @@ -31,7 +32,7 @@ "ethereum-blockies-base64": "^1.0.2", "ethereum-blockies-png": "^0.1.3", "ethereum-public-key-to-address": "0.0.2", - "ethers": "5.0.18", + "ethers": "^5.7.2", "event-dispatch": "^0.4.1", "eventemitter3": "^3.1.0", "express": "^4.16.2", @@ -55,6 +56,7 @@ "mysql": "2.18.1", "nano-ipfs-store": "0.1.3", "node-schedule": "1.3.2", + "object-hash": "^3.0.0", "openpgp": "^5.3.1", "pg-promise": "^10.12.0", "promise.allsettled": "^1.0.6", @@ -63,6 +65,7 @@ "request-promise": "^4.2.6", "secp256k1-v4": "https://github.com/HarshRajat/secp256k1-node", "socket.io": "^4.4.1", + "socket.io-client": "^4.5.3", "ts-luxon": "^4.0.1", "typedi": "^0.8.0", "typescript": "^4.5.4", @@ -2128,376 +2131,689 @@ } }, "node_modules/@ethersproject/abstract-provider": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz", - "integrity": "sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, "node_modules/@ethersproject/abstract-signer": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz", - "integrity": "sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "node_modules/@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, "node_modules/@ethersproject/base64": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.4.tgz", - "integrity": "sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4" + "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.4.tgz", - "integrity": "sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "node_modules/@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, "node_modules/@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bignumber": "^5.0.7" + "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.5.tgz", - "integrity": "sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abi": "^5.0.5", - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/hash": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", - "integrity": "sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-signer": "^5.0.6", - "@ethersproject/address": "^5.0.5", - "@ethersproject/bignumber": "^5.0.8", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.4", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/hdnode": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.5.tgz", - "integrity": "sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "node_modules/@ethersproject/json-wallets": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz", - "integrity": "sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "node_modules/@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, + "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] }, "node_modules/@ethersproject/networks": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.4.tgz", - "integrity": "sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz", - "integrity": "sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/sha2": "^5.0.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, "node_modules/@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.13.tgz", - "integrity": "sha512-5jsuk1FwXxmoQApGs8LSQyS43KP01pHA+6cQ1OPov5pT5Pcqe6ffh6UD1//BZ9Vjf+5e9AQqIk8w7FkGyROuCA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", - "ws": "7.2.3" + "ws": "7.4.6" } }, "node_modules/@ethersproject/random": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.4.tgz", - "integrity": "sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/sha2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.4.tgz", - "integrity": "sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A==", - "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "hash.js": "1.1.3" - } - }, - "node_modules/@ethersproject/sha2/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, "node_modules/@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" } }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } + "node_modules/@ethersproject/signing-key/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/@ethersproject/solidity": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.5.tgz", - "integrity": "sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/strings": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", - "integrity": "sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" } }, "node_modules/@ethersproject/units": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.6.tgz", - "integrity": "sha512-tsJuy4mipppdmooukRfhXt8fGx9nxvfvG6Xdy0RDm7LzHsjghjwQ69m2bCpId6SDSR1Uq1cQ9irPiUBSyWolUA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/wallet": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.6.tgz", - "integrity": "sha512-dRqx3+Degc5pvjaeeTHuk2EuTRM3b6ce/TiV0HRZhRXYnKyyjg0iYXEZo/b6p3rnV+Xhwxkc0+I/ISPkNpictA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/json-wallets": "^5.0.6", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "node_modules/@ethersproject/web": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", - "integrity": "sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/base64": "^5.0.3", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/wordlists": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.5.tgz", - "integrity": "sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@firebase/app-types": { @@ -7154,6 +7470,54 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/engine.io-parser": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", @@ -8078,40 +8442,76 @@ } }, "node_modules/ethers": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.18.tgz", - "integrity": "sha512-WCiKGfAt09hBS1HZspu+JTgeunFcUCVRhCXO8X+VadBJGTRlG722XXib79Vz2oyBperz90CcjkBPdNly61Ah4A==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethersproject/abi": "5.0.7", - "@ethersproject/abstract-provider": "5.0.5", - "@ethersproject/abstract-signer": "5.0.7", - "@ethersproject/address": "5.0.5", - "@ethersproject/base64": "5.0.4", - "@ethersproject/basex": "5.0.4", - "@ethersproject/bignumber": "5.0.8", - "@ethersproject/bytes": "5.0.5", - "@ethersproject/constants": "5.0.5", - "@ethersproject/contracts": "5.0.5", - "@ethersproject/hash": "5.0.6", - "@ethersproject/hdnode": "5.0.5", - "@ethersproject/json-wallets": "5.0.7", - "@ethersproject/keccak256": "5.0.4", - "@ethersproject/logger": "5.0.6", - "@ethersproject/networks": "5.0.4", - "@ethersproject/pbkdf2": "5.0.4", - "@ethersproject/properties": "5.0.4", - "@ethersproject/providers": "5.0.13", - "@ethersproject/random": "5.0.4", - "@ethersproject/rlp": "5.0.4", - "@ethersproject/sha2": "5.0.4", - "@ethersproject/signing-key": "5.0.5", - "@ethersproject/solidity": "5.0.5", - "@ethersproject/strings": "5.0.5", - "@ethersproject/transactions": "5.0.6", - "@ethersproject/units": "5.0.6", - "@ethersproject/wallet": "5.0.6", - "@ethersproject/web": "5.0.9", - "@ethersproject/wordlists": "5.0.5" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/ethjs-unit": { @@ -9721,6 +10121,18 @@ "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==" }, + "node_modules/hapi/node_modules/b64": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", + "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/big-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", + "integrity": "sha512-qtwYYoocwpiAxTXC5sIpB6nH5j6ckt+n/jhD7J5OEiFHnUZEFn0Xk8STUaE5s10LdazN/87bTDMe+fSihaW7Kg==", + "extraneous": true + }, "node_modules/hapi/node_modules/boom": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", @@ -9731,6 +10143,12 @@ "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==" }, + "node_modules/hapi/node_modules/bourne": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.1.tgz", + "integrity": "sha512-Ou0l3W8+n1FuTOoIfIrCk9oF9WVWc+9fKoAl67XQr9Ws0z7LgILRZ7qtc9xdT4BveSKtnYXfKPgn8pFAqeQRew==", + "extraneous": true + }, "node_modules/hapi/node_modules/call": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/call/-/call-5.0.3.tgz", @@ -9746,6 +10164,18 @@ "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.4.tgz", "integrity": "sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g==" }, + "node_modules/hapi/node_modules/content": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/content/-/content-4.0.6.tgz", + "integrity": "sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA==", + "extraneous": true + }, + "node_modules/hapi/node_modules/cryptiles": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", + "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", + "extraneous": true + }, "node_modules/hapi/node_modules/heavy": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.2.tgz", @@ -9756,16 +10186,40 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.1.tgz", "integrity": "sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==" }, + "node_modules/hapi/node_modules/iron": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/iron/-/iron-5.0.6.tgz", + "integrity": "sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw==", + "extraneous": true + }, "node_modules/hapi/node_modules/joi": { "version": "14.0.4", "resolved": "https://registry.npmjs.org/joi/-/joi-14.0.4.tgz", "integrity": "sha512-KUXRcinDUMMbtlOk7YLGHQvG73dLyf8bmgE+6sBTkdJbZpeGVGAlPXEHLiQBV7KinD/VLD5OA0EUgoTTfbRAJQ==" }, + "node_modules/hapi/node_modules/mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "extraneous": true + }, "node_modules/hapi/node_modules/mimos": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.2.tgz", "integrity": "sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA==" }, + "node_modules/hapi/node_modules/nigel": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nigel/-/nigel-3.0.4.tgz", + "integrity": "sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/pez": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pez/-/pez-4.0.5.tgz", + "integrity": "sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ==", + "extraneous": true + }, "node_modules/hapi/node_modules/podium": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.5.tgz", @@ -9801,6 +10255,18 @@ "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==" }, + "node_modules/hapi/node_modules/vise": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vise/-/vise-3.0.1.tgz", + "integrity": "sha512-7BJNjsv2o83+E6AHAFSnjQF324UTgypsR/Sw/iFmLvr7RgJrEXF1xNBvb5LJfi+1FvWQXjJK4X41WMuHMeunPQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/wreck": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-14.1.3.tgz", + "integrity": "sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw==", + "extraneous": true + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -15591,6 +16057,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -18341,10 +18815,40 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" }, + "node_modules/socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -20144,9 +20648,10 @@ "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21868,9 +22373,9 @@ } }, "node_modules/ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { "node": ">=8.3.0" }, @@ -21970,6 +22475,14 @@ "node": ">=0.4.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -23997,380 +24510,397 @@ } }, "@ethersproject/abstract-provider": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz", - "integrity": "sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, "@ethersproject/abstract-signer": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz", - "integrity": "sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, "@ethersproject/base64": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.4.tgz", - "integrity": "sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "requires": { - "@ethersproject/bytes": "^5.0.4" + "@ethersproject/bytes": "^5.7.0" } }, "@ethersproject/basex": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.4.tgz", - "integrity": "sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + } } }, "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "requires": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "requires": { - "@ethersproject/bignumber": "^5.0.7" + "@ethersproject/bignumber": "^5.7.0" } }, "@ethersproject/contracts": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.5.tgz", - "integrity": "sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "requires": { - "@ethersproject/abi": "^5.0.5", - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + } } }, "@ethersproject/hash": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", - "integrity": "sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "requires": { - "@ethersproject/abstract-signer": "^5.0.6", - "@ethersproject/address": "^5.0.5", - "@ethersproject/bignumber": "^5.0.8", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.4", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/hdnode": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.5.tgz", - "integrity": "sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ==", - "requires": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "@ethersproject/json-wallets": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz", - "integrity": "sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ==", - "requires": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + }, + "dependencies": { + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + } } }, "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, "@ethersproject/networks": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.4.tgz", - "integrity": "sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "requires": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/pbkdf2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz", - "integrity": "sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/sha2": "^5.0.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "requires": { - "@ethersproject/logger": "^5.0.5" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/providers": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.13.tgz", - "integrity": "sha512-5jsuk1FwXxmoQApGs8LSQyS43KP01pHA+6cQ1OPov5pT5Pcqe6ffh6UD1//BZ9Vjf+5e9AQqIk8w7FkGyROuCA==", - "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", - "ws": "7.2.3" + "ws": "7.4.6" } }, "@ethersproject/random": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.4.tgz", - "integrity": "sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/sha2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.4.tgz", - "integrity": "sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "hash.js": "1.1.3" - }, - "dependencies": { - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - } + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" }, "dependencies": { - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, "@ethersproject/solidity": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.5.tgz", - "integrity": "sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/strings": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", - "integrity": "sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" } }, "@ethersproject/units": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.6.tgz", - "integrity": "sha512-tsJuy4mipppdmooukRfhXt8fGx9nxvfvG6Xdy0RDm7LzHsjghjwQ69m2bCpId6SDSR1Uq1cQ9irPiUBSyWolUA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/wallet": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.6.tgz", - "integrity": "sha512-dRqx3+Degc5pvjaeeTHuk2EuTRM3b6ce/TiV0HRZhRXYnKyyjg0iYXEZo/b6p3rnV+Xhwxkc0+I/ISPkNpictA==", - "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/json-wallets": "^5.0.6", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "@ethersproject/web": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", - "integrity": "sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "requires": { - "@ethersproject/base64": "^5.0.3", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/wordlists": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.5.tgz", - "integrity": "sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@firebase/app-types": { @@ -28263,6 +28793,34 @@ } } }, + "engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, "engine.io-parser": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", @@ -28986,40 +29544,58 @@ } }, "ethers": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.18.tgz", - "integrity": "sha512-WCiKGfAt09hBS1HZspu+JTgeunFcUCVRhCXO8X+VadBJGTRlG722XXib79Vz2oyBperz90CcjkBPdNly61Ah4A==", - "requires": { - "@ethersproject/abi": "5.0.7", - "@ethersproject/abstract-provider": "5.0.5", - "@ethersproject/abstract-signer": "5.0.7", - "@ethersproject/address": "5.0.5", - "@ethersproject/base64": "5.0.4", - "@ethersproject/basex": "5.0.4", - "@ethersproject/bignumber": "5.0.8", - "@ethersproject/bytes": "5.0.5", - "@ethersproject/constants": "5.0.5", - "@ethersproject/contracts": "5.0.5", - "@ethersproject/hash": "5.0.6", - "@ethersproject/hdnode": "5.0.5", - "@ethersproject/json-wallets": "5.0.7", - "@ethersproject/keccak256": "5.0.4", - "@ethersproject/logger": "5.0.6", - "@ethersproject/networks": "5.0.4", - "@ethersproject/pbkdf2": "5.0.4", - "@ethersproject/properties": "5.0.4", - "@ethersproject/providers": "5.0.13", - "@ethersproject/random": "5.0.4", - "@ethersproject/rlp": "5.0.4", - "@ethersproject/sha2": "5.0.4", - "@ethersproject/signing-key": "5.0.5", - "@ethersproject/solidity": "5.0.5", - "@ethersproject/strings": "5.0.5", - "@ethersproject/transactions": "5.0.6", - "@ethersproject/units": "5.0.6", - "@ethersproject/wallet": "5.0.6", - "@ethersproject/web": "5.0.9", - "@ethersproject/wordlists": "5.0.5" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + } } }, "ethjs-unit": { @@ -30349,6 +30925,16 @@ "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==" }, + "b64": { + "version": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", + "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", + "extraneous": true + }, + "big-time": { + "version": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", + "integrity": "sha512-qtwYYoocwpiAxTXC5sIpB6nH5j6ckt+n/jhD7J5OEiFHnUZEFn0Xk8STUaE5s10LdazN/87bTDMe+fSihaW7Kg==", + "extraneous": true + }, "boom": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", @@ -30359,6 +30945,11 @@ "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==" }, + "bourne": { + "version": "https://registry.npmjs.org/bourne/-/bourne-1.1.1.tgz", + "integrity": "sha512-Ou0l3W8+n1FuTOoIfIrCk9oF9WVWc+9fKoAl67XQr9Ws0z7LgILRZ7qtc9xdT4BveSKtnYXfKPgn8pFAqeQRew==", + "extraneous": true + }, "call": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/call/-/call-5.0.3.tgz", @@ -30374,6 +30965,16 @@ "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.4.tgz", "integrity": "sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g==" }, + "content": { + "version": "https://registry.npmjs.org/content/-/content-4.0.6.tgz", + "integrity": "sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA==", + "extraneous": true + }, + "cryptiles": { + "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", + "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", + "extraneous": true + }, "heavy": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.2.tgz", @@ -30384,16 +30985,36 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.1.tgz", "integrity": "sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==" }, + "iron": { + "version": "https://registry.npmjs.org/iron/-/iron-5.0.6.tgz", + "integrity": "sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw==", + "extraneous": true + }, "joi": { "version": "14.0.4", "resolved": "https://registry.npmjs.org/joi/-/joi-14.0.4.tgz", "integrity": "sha512-KUXRcinDUMMbtlOk7YLGHQvG73dLyf8bmgE+6sBTkdJbZpeGVGAlPXEHLiQBV7KinD/VLD5OA0EUgoTTfbRAJQ==" }, + "mime-db": { + "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "extraneous": true + }, "mimos": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.2.tgz", "integrity": "sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA==" }, + "nigel": { + "version": "https://registry.npmjs.org/nigel/-/nigel-3.0.4.tgz", + "integrity": "sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ==", + "extraneous": true + }, + "pez": { + "version": "https://registry.npmjs.org/pez/-/pez-4.0.5.tgz", + "integrity": "sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ==", + "extraneous": true + }, "podium": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.5.tgz", @@ -30428,6 +31049,16 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==" + }, + "vise": { + "version": "https://registry.npmjs.org/vise/-/vise-3.0.1.tgz", + "integrity": "sha512-7BJNjsv2o83+E6AHAFSnjQF324UTgypsR/Sw/iFmLvr7RgJrEXF1xNBvb5LJfi+1FvWQXjJK4X41WMuHMeunPQ==", + "extraneous": true + }, + "wreck": { + "version": "https://registry.npmjs.org/wreck/-/wreck-14.1.3.tgz", + "integrity": "sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw==", + "extraneous": true } } }, @@ -34969,6 +35600,11 @@ } } }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -37170,10 +37806,31 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" }, + "socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + } + } + }, "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -38569,9 +39226,10 @@ "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" }, "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==" + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true }, "typings": { "version": "2.1.1", @@ -39977,9 +40635,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "requires": {} }, "xdg-basedir": { @@ -40056,6 +40714,11 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", diff --git a/snode/package.json b/snode/package.json index c4debbc..4a6d2fd 100755 --- a/snode/package.json +++ b/snode/package.json @@ -56,7 +56,6 @@ "ethereum-blockies-base64": "^1.0.2", "ethereum-blockies-png": "^0.1.3", "ethereum-public-key-to-address": "0.0.2", - "ethers": "5.0.18", "event-dispatch": "^0.4.1", "eventemitter3": "^3.1.0", "express": "^4.16.2", @@ -95,7 +94,10 @@ "underscore": "^1.13.6", "unique-names-generator": "^4.7.1", "web3": "1.6.0", - "winston": "^3.2.1" + "winston": "^3.2.1", + "socket.io-client": "^4.5.3", + "ethers": "^5.7.2", + "object-hash": "^3.0.0" }, "devDependencies": { "@types/agenda": "^2.0.4", diff --git a/snode/src/api/routes/AppController.ts b/snode/src/api/routes/AppController.ts index a79bae9..01fa4ce 100755 --- a/snode/src/api/routes/AppController.ts +++ b/snode/src/api/routes/AppController.ts @@ -43,7 +43,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; const dt = req.params.dt; const key = req.params.key; - const nodeId = 1; // todo read this from db + const nodeId = '1'; // todo read this from db log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); log.debug(`nodeId=${nodeId} shardId=${shardId}`); @@ -88,7 +88,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; // ex: 1000000 const ts:string = req.params.ts; //ex: 1661214142.123456 const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad - const nodeId = 1; // todo read this from db + const nodeId = '1'; // todo read this from db const body = JSON.stringify(req.body); log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); @@ -152,7 +152,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; const dt = req.params.month + '01'; const key = req.params.key; - const nodeId = 1; // todo read this from db + const nodeId = '1'; // todo read this from db const body = JSON.stringify(req.body); const page = parseInt(req.params.page); log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); diff --git a/snode/src/appInit.ts b/snode/src/appInit.ts index ec4a9e7..b75047d 100755 --- a/snode/src/appInit.ts +++ b/snode/src/appInit.ts @@ -1,6 +1,10 @@ import 'reflect-metadata'; // We need this in order to use @Decorators import express from 'express'; import chalk from 'chalk'; +import {Container} from "typedi"; +import StorageNode from "./services/messaging/storageNode"; +import {ValidatorContract} from "./services/messaging/validatorContract"; +import DeliverySocket from "./services/messaging/deliverySocket"; async function startServer(logLevel = null) { if (logLevel) { @@ -26,6 +30,10 @@ async function startServer(logLevel = null) { await require('./api/index'); await require('./loaders/express'); + Container.set("logger", Logger); + await Container.get(ValidatorContract).postConstruct(); + await Container.get(StorageNode).postConstruct(); + await Container.get(DeliverySocket).postConstruct(); // load app const app = express(); diff --git a/snode/src/config/index.ts b/snode/src/config/index.ts index 4a80cfb..e298276 100755 --- a/snode/src/config/index.ts +++ b/snode/src/config/index.ts @@ -4,10 +4,15 @@ import dotenv from 'dotenv'; process.env.NODE_ENV = process.env.NODE_ENV || 'development'; // loads all .env variables into process.env.* variables -const envFound = dotenv.config(); +// Optional support for CONFIG_DIR variable +console.log(`config dir is ${process.env.CONFIG_DIR}`); +let options = {}; +if(process.env.CONFIG_DIR) { + options = {path: `${process.env.CONFIG_DIR}/.env`}; +} +const envFound = dotenv.config(options); if (envFound.error) { - // This error should crash whole process - throw new Error("⚠️ Couldn't find .env file ⚠️"); + throw new Error("⚠️ Couldn't find .env file ⚠️") } export const changeLogLevel = (level: string) => { diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 58bbb36..c78a383 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -14,11 +14,11 @@ const crypto = require('crypto'); export default class DbHelper { // maps key -> 8bit space (0..255) - // uses first 8bit from an md5 hash + // uses first 4bit from an md5 hash public static calculateShardForNamespaceIndex(namespace: string, key: string): number { let buf = crypto.createHash('md5').update(key).digest(); let i32 = buf.readUInt32LE(0); - const i8bits = i32 & 0xFF; + const i8bits = i32 % 32; // todo it's 0x20 now, not 0xff log.debug('calculateShardForNamespaceIndex(): ', buf, '->', i32, '->', i8bits); return i8bits; } @@ -64,8 +64,8 @@ export default class DbHelper { CREATE TABLE IF NOT EXISTS ${tableName} ( namespace VARCHAR(20) NOT NULL, - namespace_shard_id VARCHAR(20) NOT NULL, - namespace_id VARCHAR(20) NOT NULL, + namespace_shard_id VARCHAR(64) NOT NULL, + namespace_id VARCHAR(64) NOT NULL, ts TIMESTAMP NOT NULL default NOW(), skey VARCHAR(64) NOT NULL PRIMARY KEY, dataSchema VARCHAR(20) NOT NULL, @@ -88,7 +88,7 @@ export default class DbHelper { } // todo fix params substitution for the pg library; - public static async checkThatShardIsOnThisNode(namespace: string, namespaceShardId: number, nodeId: number): Promise { + public static async checkThatShardIsOnThisNode(namespace: string, namespaceShardId: number, nodeId: string): Promise { const sql = `SELECT count(*) FROM network_storage_layout where namespace='${namespace}' and namespace_shard_id='${namespaceShardId}' and node_id='${nodeId}'` console.log(sql); diff --git a/snode/src/services/messaging/deliverySocket.ts b/snode/src/services/messaging/deliverySocket.ts new file mode 100644 index 0000000..8be6c02 --- /dev/null +++ b/snode/src/services/messaging/deliverySocket.ts @@ -0,0 +1,83 @@ +import {Container, Inject, Service} from 'typedi' +import io from 'socket.io-client' +import config from '../../config' +import log from '../../loaders/logger' +import StorageNode from "./storageNode"; +import {MessageBlock} from "./messageBlock"; +import {Logger} from "winston"; +import {NodeInfo, NodeType, ValidatorContract} from "./validatorContract"; + + +@Service() +export default class DeliverySocket { + static RECONNECTION_DELAY_MAX = 10000; + static RECONNECTION_DELAY = 5000; + + @Inject('logger') + private log: Logger; + + @Inject() + private storageNode: StorageNode; + + @Inject() + private validatorContract: ValidatorContract; + + private validatorSocketMap: Map = new Map(); + + public async postConstruct() { + for (const ni of this.validatorContract.getAllValidators()) { + if (NodeInfo.isValidValidator(ni)) { + await this.connect(ni); + } + } + } + + public async connect(ni: NodeInfo) { + this.log.info(`connecting to validator ${ni.nodeId} , url: ${ni.url}`); + const socket = io.connect(ni.url, { + reconnectionDelayMax: DeliverySocket.RECONNECTION_DELAY_MAX, + reconnectionDelay: DeliverySocket.RECONNECTION_DELAY, + query: { + mode: 'MESSAGE_BLOCK', + clientType: NodeType.DNode, // todo handle + clientVer: "1.0" // todo handle + }, + }); + let validatorSocket = new ValidatorSocket(); + validatorSocket.socket = socket; + validatorSocket.nodeId = ni.nodeId; + this.validatorSocketMap.set(ni.nodeId, validatorSocket) + + socket.on('connect', async () => { + this.log.info(`>connected to validator ${ni.nodeId} , url: ${ni.url}`); + + }) + + socket.on('connect_error', async () => { + this.log.error( + '!!!! Unable to connect to the push node websocket!! Will reconnect after with in next %o seconds.', + DeliverySocket.RECONNECTION_DELAY_MAX); + }); + + socket.on('disconnect', function () { + this.log.error('Socket connection dropped!'); + }); + + socket.on("messageBlockEvent", async (mb: MessageBlock) => { + this.log.info('message block event: %o', mb); + const res = this.storageNode.checkBlock(mb); + if (!res.success) { + log.error('error ' + res.err); + return; + } + await this.storageNode.unpackBlock(mb); + this.log.info('message block successfully unpacked: ', mb); + }); + } +} + +class ValidatorSocket { + socket: any; + nodeId: string; +} + diff --git a/snode/src/services/messaging/messageBlock.ts b/snode/src/services/messaging/messageBlock.ts new file mode 100644 index 0000000..b5ea2cd --- /dev/null +++ b/snode/src/services/messaging/messageBlock.ts @@ -0,0 +1,141 @@ + +/** + block + 1 inputs -- + 2 outputs -- + message1 { source: wallet100, target: broadcast, signatures: [ { w100, 0x5} ] } + messageM { source: wallet200, target: [wallet1, ..., walletN], signatures: [ { w200, 0x6} ] } + 3 output signatures -- + signatures: [ { v1, 0xA}, { v2, 0xB}, { v3, 0xC}, + { s1, 0xD}, { s2, 0xE}, { s3, 0xF}, + { d1, 0x1}, { d2, 0x2}, { d3, 0x3} ] + */ +export class MessageBlock { + id: string; + // input (filled by NetworkRole.VALIDATOR) + requests: PayloadItem[] = []; + // output (filled by NetworkRole.VALIDATOR) + attestToken: string; + // output (filled by NetworkRole.VALIDATOR) + responses: FeedItem[] = []; // [feedItem] + // output (filled by NetworkRole.VALIDATOR at [0], NetworkRole.ATTESTER at [1+]) + responsesSignatures: FeedItemSig[][] = []; // [feedItem] [signatures] + + // stages + // randao: any; // todo secure random vector, which defines applied validators + // blockValidatorSig: VSignature[]; // first validator who produced that block + // blockStorageSig: VSignature[]; // snodes which store that block +} + +export enum NetworkRole { + VALIDATOR = "V", + ATTESTER = "A", + STORAGE = "S", + DELIVERY = "D" +} + + +export class NodeMeta { + nodeId: string; // uniq node id, this is eth wallet, ex: 0xAAAAAAA + role: NetworkRole; // validator, attester ex: "V" + tsMillis: number; // timestamp, ms ex: 1999999 +} + + +export class FeedItemSig { + nodeMeta: NodeMeta; // empty, until signed + signature: string; // empty, until signed + + + constructor(nodeMeta: NodeMeta, signature: string) { + this.nodeMeta = nodeMeta; + this.signature = signature; + } +} + +// see MySql:feeds +export class FeedItem { + header: FHeader; + payload: FPayload; +} + +export class FHeader { + sender: string; // ex: eip155:1:0x6500 + recipients: string[]; // ex: eip155:1:0x0700 or a list of recipients + senderType: number; // ex: #SenderType.CHANNEL + source: string; // ex: ETH_MAINNET + // verification: string; // ex: eip712v2:0xFO00::uid::3F // todo Check that this is not needed + // subscribed:boolean; //, ex: true + // isSpam:boolean; //, ex: true + +} + +export class FNotification { + title: string; + body: string; +} + +export enum SenderType { + CHANNEL = 0, + W2W = 1, + PUSH_VIDEO = 2 +} + +export class FPayload { + data: FData; + notification: FNotification; + sectype: string; + recipients: any; + verificationProof: any; +} + +export class FData { + app: string; + sid: string; + url: string; + acta: string; + aimg: string; + amsg: string; + asub: string; + icon: string; + type: number; + epoch: string; + etime: string; + sectype: string; + hidden: string; // 0 or 1 + videoMeta: any; +} + +// see PayloadService.addExternalPayload +export class PayloadItem { + // ex: AAAZZ-AAAAA-BBBB + id: string; + // ex: eip712v2:0xFO00::uid::3F + verificationProof: string; + // ex: eip155:1:0x6500 + sender: string; + // ex: #SenderType.CHANNEL + senderType: number = SenderType.CHANNEL; + // ex: eip155:1:0x0700 + recipient: string; + // ex: ETH_MAINNET + source: string; + // ex: 2+{"title":"test", "body":"test2", "data":{"acta":"", "aimg":"","amsg":""}} + identityBytes: any; + + validatorToken: string; + + public constructor(payloadId: string, verificationProof: string, sender: string, + senderType: number = SenderType.CHANNEL, + recipient: string, source: string, identityBytes: any, + validatorToken?: string) { + this.id = payloadId; + this.verificationProof = verificationProof; + this.sender = sender; + this.senderType = senderType; + this.recipient = recipient; + this.source = source; + this.identityBytes = identityBytes; + this.validatorToken = validatorToken; + } +} diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts new file mode 100644 index 0000000..0e7cabe --- /dev/null +++ b/snode/src/services/messaging/storageNode.ts @@ -0,0 +1,148 @@ +import {Inject, Service} from 'typedi' +import {ValidatorContract} from "./validatorContract"; +import {Logger} from "winston"; +import {FeedItemSig, FPayload, MessageBlock, NetworkRole} from "./messageBlock"; +import DbHelper from "../../helpers/dbHelper"; +import {DateUtil, StrUtil} from "dstorage-common"; +import {EthSig} from "../../utilz/ethSig"; + +@Service() +export default class StorageNode { + + @Inject() + private contract: ValidatorContract; + + @Inject('logger') + private log: Logger; + + public async postConstruct() { + await this.contract.postConstruct(); + } + + // todo move to common + public checkBlock(block: MessageBlock): CheckResult { + if (block.requests.length != block.responses.length) { + return CheckResult.failWithText(`message block has incorrect length ${block.requests.length}!=${block.responses.length}`); + } + let blockValidatorNodeId = null; + let item0sig0 = block.responsesSignatures[0][0]; + if (item0sig0?.nodeMeta.role != NetworkRole.VALIDATOR + || StrUtil.isEmpty(item0sig0?.nodeMeta.nodeId)) { + return CheckResult.failWithText('first signature is not performed by a validator'); + } + let result: FeedItemSig[] = []; + for (let i = 0; i < block.responses.length; i++) { + let payloadItem = block.requests[i]; + let feedItem = block.responses[i]; + // check signatures + let feedItemSignatures = block.responsesSignatures[i]; + for (let j = 0; j < feedItemSignatures.length; j++) { + let fiSig = feedItemSignatures[j]; + if (j == 0) { + if (fiSig.nodeMeta.role != NetworkRole.VALIDATOR) { + return CheckResult.failWithText(`First signature on a feed item should be ${NetworkRole.VALIDATOR}`); + } + } else { + if (fiSig.nodeMeta.role != NetworkRole.ATTESTER) { + return CheckResult.failWithText(`2+ signature on a feed item should be ${NetworkRole.ATTESTER}`); + } + } + const valid = EthSig.check(fiSig.signature, fiSig.nodeMeta.nodeId, fiSig.nodeMeta, feedItem); + if (!valid) { + return CheckResult.failWithText(`signature is not valid`); + } else { + this.log.debug('valid signature %o', fiSig); + } + const validNodeId = this.contract.isActiveValidator(fiSig.nodeMeta.nodeId); + if (!validNodeId) { + return CheckResult.failWithText(`${fiSig.nodeMeta.nodeId} is not a valid nodeId from a contract`); + } else { + this.log.debug('valid nodeId %o', fiSig.nodeMeta.nodeId); + } + } + } + return CheckResult.ok(); + } + // sends the block contents (internal messages from every response) + // to every recipient's inbox + public async unpackBlock(mb: MessageBlock) { + let now = Date.now() / 1000; + let nowStr = now + ''; + const currentNodeId = this.contract.nodeId; + for (const feedItem of mb.responses) { + let targetWallets = feedItem.header.recipients; + for (const targetWallet of targetWallets) { + await this.putToInbox('inbox', targetWallet, nowStr, currentNodeId, feedItem.payload); + } + } + } + + /** + * + * @param nsName ex: inbox + * @param nsIndex ex: eip155:0xAAAAA + * @param ts current time, ex: 1661214142.123456 + * @param nodeId current node id, ex: 0xAAAAAAA + * @param fpayload payload format + */ + public async putToInbox(nsName:string, nsIndex:string, + ts:string, + nodeId:string, + fpayload:FPayload) { + const key = fpayload.data.sid; + fpayload.recipients = null; // null recipients field because we don't need that + this.log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} fpayload=${fpayload}`); + let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); + this.log.debug(`nodeId=${nodeId} shardId=${shardId}`); + const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); + if (!success) { + let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; + console.log(errMsg); + } + const date = DateUtil.parseUnixFloatAsDateTime(ts); + this.log.debug(`parsed date ${ts} -> ${date}`) + var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + this.log.debug(`found table ${storageTable}`) + if (StrUtil.isEmpty(storageTable)) { + this.log.error('storage table not found'); + var monthStart = date.startOf('month').toISODate().toString(); + var monthEndExclusive = date.startOf('month').plus({months: 1}).toISODate().toString(); + this.log.debug('creating new storage table'); + const dateYYYYMM = DateUtil.formatYYYYMM(date); + const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; + const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, shardId, + monthStart, monthEndExclusive, tableName); + if (recordCreated) { + this.log.debug('record created: ', recordCreated) + // we've added a new record to node_storage_layout => we can safely try to create a table + // otherwise, if many connections attempt to create a table from multiple threads + // it leads to postgres deadlock sometimes + const createtable = await DbHelper.createNewStorageTable(tableName); + this.log.debug('creating node storage layout mapping') + this.log.debug(createtable); + } + } + var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, + ts, key, JSON.stringify(fpayload)); + this.log.debug(`found value: ${storageValue}`) + this.log.debug('success is ' + success); + } +} + +class CheckResult { + success: boolean; + err: string; + + + static failWithText(err: string): CheckResult { + return {success: false, err: err} + } + + static ok(): CheckResult { + return {success: true, err: ''} + } + +} + + diff --git a/snode/src/services/messaging/validatorContract.ts b/snode/src/services/messaging/validatorContract.ts new file mode 100644 index 0000000..4c894ce --- /dev/null +++ b/snode/src/services/messaging/validatorContract.ts @@ -0,0 +1,261 @@ +import {Inject, Service} from "typedi"; +import {Contract, ethers, Signer, Wallet} from "ethers"; +import fs, {readFileSync} from "fs"; +import path from "path"; +import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; +import {log} from "winston"; +import {Logger} from "winston"; +import {StrUtil, EnvLoader} from "dstorage-common"; + + +/* +Validator contract abstraction. +All blockchain goes here + */ +@Service() +export class ValidatorContract { + nodeId: string; + wallet: Wallet; + + @Inject('logger') + private log: Logger; + + private contractFactory: ContractClientFactory; + public contractCli: ValidatorCtClient; + + public async postConstruct() { + this.log.info("ValidatorContract.postConstruct()"); + this.contractFactory = new ContractClientFactory(); + this.contractCli = await this.contractFactory.buildRWClient(this.log); + await this.contractCli.connect(); + this.log.info("loaded %o ", this.contractCli.nodeMap); + this.wallet = this.contractFactory.nodeWallet; + this.nodeId = this.wallet.address; + if (!this.wallet) throw new Error("wallet is not loaded"); + if (this.contractCli.nodeMap == null) throw new Error("Nodes are not initialized"); + } + + public isActiveValidator(nodeId: string): boolean { + let vi = this.contractCli.nodeMap.get(nodeId); + return vi != null; + } + + public getAllNodesMap(): Map { + return this.contractCli.nodeMap; + } + + public getAllValidators(): NodeInfo[] { + let allNodes = Array.from(this.getAllNodesMap().values()); + let onlyGoodValidators = allNodes.filter(ni => ni.nodeType == NodeType.VNode && + (ni.nodeStatus == NodeStatus.OK + || ni.nodeStatus == NodeStatus.Reported + || ni.nodeStatus == NodeStatus.Slashed)) + return onlyGoodValidators; + } +} + + +class ContractClientFactory { + private validatorCtAddr: string; + private provider: JsonRpcProvider; + private abi: string; + private pushTokenAddr: string; + private validatorRpcEndpoint: string; + private validatorRpcNetwork: number; + private configDir: string; + nodeWallet: Wallet; + // private nodeWallet: Signer; + private validatorPrivateKeyFile: string; + private validatorPrivateKeyPass: string; + private nodeAddress: string; + + constructor() { + this.validatorCtAddr = EnvLoader.getPropertyOrFail("VALIDATOR_CONTRACT_ADDRESS"); + this.pushTokenAddr = EnvLoader.getPropertyOrFail("VALIDATOR_PUSH_TOKEN_ADDRESS"); + this.validatorRpcEndpoint = EnvLoader.getPropertyOrFail("VALIDATOR_RPC_ENDPOINT"); + this.validatorRpcNetwork = Number.parseInt(EnvLoader.getPropertyOrFail("VALIDATOR_RPC_NETWORK")); + this.provider = new ethers.providers.JsonRpcProvider(this.validatorRpcEndpoint, this.validatorRpcNetwork); + this.configDir = EnvLoader.getPropertyOrFail("CONFIG_DIR"); + this.abi = ContractClientFactory.loadValidatorContractAbi(this.configDir, "ValidatorV1.json"); + } + + private static loadValidatorContractAbi(configDir: string, fileNameInConfigDir: string): string { + const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); + const file = fs.readFileSync(fileAbsolute, "utf8") + const json = JSON.parse(file) + const abi = json.abi + console.log(`abi size:`, abi.length) + return abi + } + + // creates a client which can only read blockchain state + public async buildROClient(log: Logger): Promise { + const contract = new ethers.Contract(this.validatorCtAddr, this.abi, this.provider); + return new ValidatorCtClient(contract, log); + } + + // creates a client, using an encrypted private key from disk, so that we could write to the blockchain + public async buildRWClient(log: Logger): Promise { + this.validatorPrivateKeyFile = EnvLoader.getPropertyOrFail("VALIDATOR_PRIVATE_KEY_FILE"); + this.validatorPrivateKeyPass = EnvLoader.getPropertyOrFail("VALIDATOR_PRIVATE_KEY_PASS"); + + let jsonFile = readFileSync(this.configDir + "/" + this.validatorPrivateKeyFile, 'utf-8'); + this.nodeWallet = await Wallet.fromEncryptedJson(jsonFile, this.validatorPrivateKeyPass); + this.nodeAddress = await this.nodeWallet.getAddress(); + + const signer = this.nodeWallet.connect(this.provider) + const contract = new ethers.Contract(this.validatorCtAddr, this.abi, signer); + return new ValidatorCtClient(contract, log); + } +} + + +// all Validator contract interactions are wrapped into this class +export class ValidatorCtClient { + contract: Contract; + private log: Logger; + + // contract state + nodeMap: Map = new Map(); + public attestersRequired: number; + public nodeRandomMinCount: number; + public nodeRandomPingCount: number; + + + constructor(contract: ethers.Contract, log: Logger) { + this.contract = contract; + this.log = log; + } + + private async loadConstants() { + { + this.attestersRequired = await this.contract.attestersRequired(); + this.log.info(`attestersRequired=${this.attestersRequired}`); + if (this.attestersRequired == null) { + throw new Error('attestersRequired is undefined'); + } + this.contract.on("AttestersRequiredUpdated", + (value: number) => { + this.attestersRequired = value; + this.log.info(`attestersRequired=${this.attestersRequired}`); + }); + } + + { + this.nodeRandomMinCount = await this.contract.nodeRandomMinCount(); + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`); + if (this.nodeRandomMinCount == null) { + throw new Error('nodeRandomMinCount is undefined'); + } + this.contract.on("NodeRandomMinCountUpdated", + (value: number) => { + this.nodeRandomMinCount = value; + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`); + }); + } + + { + this.nodeRandomPingCount = await this.contract.nodeRandomPingCount(); + this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`); + if (this.nodeRandomPingCount == null) { + throw new Error('nodeRandomPingCount is undefined'); + } + this.contract.on("NodeRandomPingCountUpdated", + (value: number) => { + this.nodeRandomPingCount = value; + this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`); + }); + } + } + + async connect() { + await this.loadConstants(); + let result = this.loadNodesFromEnv(); + if (result != null) { + // we have a debug variable set; no need to do blockchain + this.nodeMap = result; + return; + } + const nodeAddresses = await this.contract.getNodes(); + for (const nodeAddress of nodeAddresses) { + let ctObj = await this.contract.getNodeInfo(nodeAddress); + this.nodeMap.set(ctObj.nodeWallet, + new NodeInfo(ctObj.nodeWallet, ctObj.nodeApiBaseUrl, ctObj.nodeType, NodeStatus.OK)); + } + this.log.info('contract nodes loaded %o', this.nodeMap); + + + this.contract.on("NodeAdded", + (ownerWallet: string, nodeWallet: string, nodeType: number, nodeTokens: number, + nodeApiBaseUrl: string) => { + this.log.info("NodeAdded %o", arguments) + this.log.info("NodeAdded %s %s %s %s %s", ownerWallet, nodeWallet, nodeType, nodeTokens, nodeApiBaseUrl); + this.nodeMap.set(nodeWallet, new NodeInfo(nodeWallet, nodeApiBaseUrl, nodeType, NodeStatus.OK)); + this.log.info("ValidatorMap: %o", this.nodeMap); + }); + + this.contract.on("NodeStatusChanged", + (nodeWallet: string, nodeStatus: number, nodeTokens: number) => { + this.log.info("NodeStatusChanged", arguments) + this.log.info("NodeStatusChanged", nodeWallet, nodeStatus, nodeTokens); + let ni = this.nodeMap.get(nodeWallet); + if (ni == null) { + this.log.error(`unknown node ${nodeWallet}`); + return; + } + ni.nodeStatus = nodeStatus; + }); + } + + private loadNodesFromEnv(): Map | null { + let testValidatorsEnv = process.env.VALIDATOR_CONTRACT_TEST_VALIDATORS; + if (testValidatorsEnv) { + // test mode + let testValidators = <{ validators: NodeInfo[] }>JSON.parse(testValidatorsEnv); + let result = new Map(); + for (const vi of testValidators.validators) { + vi.nodeId = StrUtil.normalizeEthAddress(vi.nodeId); + result.set(vi.nodeId, vi); + } + return result; + } else { + return null; + } + } +} + + +// from smart contract +export enum NodeStatus { + OK, + Reported, + Slashed, + BannedAndUnstaked, + Unstaked +} + +export class NodeInfo { + nodeId: string; + url: string; + nodeType: NodeType; + nodeStatus: NodeStatus; + + + constructor(nodeId: string, url: string, nodeType: NodeType, nodeStatus: NodeStatus) { + this.nodeId = nodeId; + this.url = url; + this.nodeType = nodeType; + this.nodeStatus = nodeStatus; + } + + static isValidValidator(ni: NodeInfo): boolean { + return ni != null && !StrUtil.isEmpty(ni.url) && ni.nodeType == NodeType.VNode && + (ni.nodeStatus == NodeStatus.OK || ni.nodeStatus == NodeStatus.Reported || ni.nodeStatus == NodeStatus.Slashed) + } +} + +export enum NodeType { + VNode = 0, // validator 0 + SNode = 1, // storage 1 + DNode = 2 // delivery 2 +} diff --git a/snode/src/utilz/ethSig.ts b/snode/src/utilz/ethSig.ts new file mode 100644 index 0000000..af557bb --- /dev/null +++ b/snode/src/utilz/ethSig.ts @@ -0,0 +1,33 @@ +import {Wallet} from "ethers"; +import {Logger} from "winston"; +import {Container} from "typedi"; +import {verifyMessage} from "ethers/lib/utils"; +import {ObjectHasher} from "./objectHasher"; + +/** + * Utitily class that allows + * - to sign objects with an eth private key + * - to check that signature later + * + * Ignores 'signature' properties + */ +export class EthSig { + + public static async create(wallet: Wallet, ...object: any[]): Promise { + let ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); + let sig = await wallet.signMessage(ethMessage); + return sig; + } + + public static check(sig: string, targetWallet: string, ...object: any[]): boolean { + let ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); + let verificationAddress = verifyMessage(ethMessage, sig); + if (targetWallet !== verificationAddress) { + return false; + } + return true; + } +} + +export function Signed(target: Function) { +} \ No newline at end of file diff --git a/snode/src/utilz/objectHasher.ts b/snode/src/utilz/objectHasher.ts new file mode 100644 index 0000000..1d291e5 --- /dev/null +++ b/snode/src/utilz/objectHasher.ts @@ -0,0 +1,47 @@ +const hash = require('object-hash'); + +/** + * Allows to build a consistent hash out of a json object + */ +export class ObjectHasher { + private static options = { + algorithm: 'sha256', + encoding: 'hex', + respectFunctionProperties: false, // skip functions + respectFunctionNames: false, // skip function names + respectType: false, // skip class info + unorderedArrays: false, // don't sort arrays before hash + unorderedSets: false, // don't sort sets before hash + unorderedObjects: true // sort object properties before hash + + }; + + // todo Object.assign(target, src) + private static optionsIgnoreSig = { + algorithm: 'sha256', + encoding: 'hex', + respectFunctionProperties: false, // skip functions + respectFunctionNames: false, // skip function names + respectType: false, // skip class info + unorderedArrays: false, // don't sort arrays before hash + unorderedSets: false, // don't sort sets before hash + unorderedObjects: true, // sort object properties before hash + excludeKeys: keyFilterFunction + }; + + /** + * Returns hex string + * @param obj json object + */ + public static hashToSha256(obj: any): string { + return hash(obj, ObjectHasher.options); + } + + public static hashToSha256IgnoreSig(obj: any): string { + return hash(obj, ObjectHasher.optionsIgnoreSig); + } +} + +function keyFilterFunction(propName) { + return 'signature' === propName; +} From 3ea33ddac00116e0983d21452911b8d514a1b72d Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 24 Aug 2023 11:49:21 +0400 Subject: [PATCH 23/84] add: reverted sc changes --- dstorage-common/package-lock.json | 1 + .../contracts/{DStorageV1.sol => DStorageV1.sol.tmp} | 0 smart-contracts/contracts/Validator.sol | 9 +++------ 3 files changed, 4 insertions(+), 6 deletions(-) rename smart-contracts/contracts/{DStorageV1.sol => DStorageV1.sol.tmp} (100%) diff --git a/dstorage-common/package-lock.json b/dstorage-common/package-lock.json index 8c86f32..1cd8d1b 100644 --- a/dstorage-common/package-lock.json +++ b/dstorage-common/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "dstorage-common", "version": "1.0.0", "license": "ISC", "dependencies": { diff --git a/smart-contracts/contracts/DStorageV1.sol b/smart-contracts/contracts/DStorageV1.sol.tmp similarity index 100% rename from smart-contracts/contracts/DStorageV1.sol rename to smart-contracts/contracts/DStorageV1.sol.tmp diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index fc9cfe0..50c68be 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -36,9 +36,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // node colleciton address[] nodes; - mapping(address => uint16) addrToShortAddr; - mapping(uint16 => NodeInfo) nodeMap; // nodeWallet -> node info - uint16 public unusedNodeId; // increments after each invocation (new node registration) + mapping(address => NodeInfo) nodeMap; uint256 totalStaked; // push tokens owned by this contract; which have an owner uint256 totalPenalties; // push tokens owned by this contract; comes from penalties @@ -50,7 +48,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { */ mapping(uint8 => uint16[]) notifShardToNodeId; // todo support shards, and reshard on every storage node registration // this is the next free index, which will be assigned to a new node - uint16 notifShardsMax = 31; + uint16 notifShardsMax; /* EVENTS */ event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); @@ -148,7 +146,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); nodeRandomPingCount = nodeRandomPingCount_; - unusedNodeId = 1; + notifShardsMax = 31; vnodeCollateralInPushTokens = 100; REPORT_COUNT_TO_SLASH = 2; SLASH_COLL_PERCENTAGE = 1; @@ -180,7 +178,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(allowed >= _nodeTokens, "_nodeTokens cannot be transferred, check allowance"); // new mapping NodeInfo memory n; - n.shortAddr = unusedNodeId++; n.ownerWallet = msg.sender; n.nodeWallet = _nodeWallet; n.nodeType = _nodeType; From 973cafd52e158049571d66fded53afc65622269e Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 24 Aug 2023 11:53:54 +0400 Subject: [PATCH 24/84] add: synced code from v; also now both pg and mysql are used (!) --- snode/migrations/{ => pg}/V1__init.sql | 0 snode/migrations/{ => pg}/V2___sampleData.sql | 0 snode/package-lock.json | 1215 +++++++++++++---- snode/package.json | 17 +- snode/src/api/index.ts | 12 +- .../{AppController.ts => storageRoutes.ts} | 37 +- snode/src/appInit.ts | 47 +- snode/src/config/envLoader.ts | 21 - snode/src/helpers/dbHelper.ts | 62 +- snode/src/loaders/envVerifier.ts | 123 -- .../services/messaging-common/messageBlock.ts | 439 ++++++ .../messaging-common/queueClientHelper.ts | 52 + .../services/messaging-common/redisClient.ts | 24 + .../validatorContractState.ts | 300 ++++ .../services/messaging-dset/queueClient.ts | 113 ++ .../services/messaging-dset/queueServer.ts | 166 +++ .../src/services/messaging-dset/queueTypes.ts | 17 + snode/src/services/messaging/BlockStorage.ts | 38 + .../src/services/messaging/deliverySocket.ts | 83 -- snode/src/services/messaging/messageBlock.ts | 141 -- snode/src/services/messaging/queueManager.ts | 116 ++ snode/src/services/messaging/storageNode.ts | 130 +- .../services/messaging/validatorContract.ts | 261 ---- snode/src/utilz/EthUtil.ts | 35 + snode/src/utilz/bitUtil.ts | 39 + snode/src/utilz/check.ts | 27 + snode/src/utilz/collectionUtil.ts | 28 + snode/src/utilz/dateUtil.ts | 55 + snode/src/utilz/envLoader.ts | 26 + snode/src/utilz/ethSig.ts | 14 +- snode/src/utilz/expressUtil.ts | 20 + snode/src/utilz/idUtil.ts | 8 + snode/src/utilz/mySqlUtil.ts | 137 ++ snode/src/utilz/numUtil.ts | 19 + snode/src/utilz/objectHasher.ts | 74 +- snode/src/utilz/pgUtil.ts | 98 ++ snode/src/utilz/promiseUtil.ts | 92 ++ snode/src/utilz/strUtil.ts | 114 ++ snode/src/utilz/stringCounter.ts | 88 ++ snode/src/utilz/tuple.ts | 1 + snode/src/utilz/waitNotify.ts | 50 + snode/src/utilz/winstonUtil.ts | 168 +++ snode/tests/DbHelper.test.ts | 2 + vnode/src/loaders/dbService.ts | 1 - 44 files changed, 3413 insertions(+), 1097 deletions(-) rename snode/migrations/{ => pg}/V1__init.sql (100%) rename snode/migrations/{ => pg}/V2___sampleData.sql (100%) rename snode/src/api/routes/{AppController.ts => storageRoutes.ts} (87%) delete mode 100644 snode/src/config/envLoader.ts delete mode 100755 snode/src/loaders/envVerifier.ts create mode 100644 snode/src/services/messaging-common/messageBlock.ts create mode 100644 snode/src/services/messaging-common/queueClientHelper.ts create mode 100644 snode/src/services/messaging-common/redisClient.ts create mode 100644 snode/src/services/messaging-common/validatorContractState.ts create mode 100644 snode/src/services/messaging-dset/queueClient.ts create mode 100644 snode/src/services/messaging-dset/queueServer.ts create mode 100644 snode/src/services/messaging-dset/queueTypes.ts create mode 100644 snode/src/services/messaging/BlockStorage.ts delete mode 100644 snode/src/services/messaging/deliverySocket.ts delete mode 100644 snode/src/services/messaging/messageBlock.ts create mode 100644 snode/src/services/messaging/queueManager.ts delete mode 100644 snode/src/services/messaging/validatorContract.ts create mode 100644 snode/src/utilz/EthUtil.ts create mode 100644 snode/src/utilz/bitUtil.ts create mode 100644 snode/src/utilz/check.ts create mode 100644 snode/src/utilz/collectionUtil.ts create mode 100644 snode/src/utilz/dateUtil.ts create mode 100644 snode/src/utilz/envLoader.ts create mode 100644 snode/src/utilz/expressUtil.ts create mode 100755 snode/src/utilz/idUtil.ts create mode 100644 snode/src/utilz/mySqlUtil.ts create mode 100644 snode/src/utilz/numUtil.ts create mode 100644 snode/src/utilz/pgUtil.ts create mode 100644 snode/src/utilz/promiseUtil.ts create mode 100755 snode/src/utilz/strUtil.ts create mode 100644 snode/src/utilz/stringCounter.ts create mode 100644 snode/src/utilz/tuple.ts create mode 100644 snode/src/utilz/waitNotify.ts create mode 100644 snode/src/utilz/winstonUtil.ts diff --git a/snode/migrations/V1__init.sql b/snode/migrations/pg/V1__init.sql similarity index 100% rename from snode/migrations/V1__init.sql rename to snode/migrations/pg/V1__init.sql diff --git a/snode/migrations/V2___sampleData.sql b/snode/migrations/pg/V2___sampleData.sql similarity index 100% rename from snode/migrations/V2___sampleData.sql rename to snode/migrations/pg/V2___sampleData.sql diff --git a/snode/package-lock.json b/snode/package-lock.json index a6209ff..f13a9fd 100644 --- a/snode/package-lock.json +++ b/snode/package-lock.json @@ -55,6 +55,7 @@ "multer": "^1.4.5-lts.1", "mysql": "2.18.1", "nano-ipfs-store": "0.1.3", + "node-docker-api": "^1.1.22", "node-schedule": "1.3.2", "object-hash": "^3.0.0", "openpgp": "^5.3.1", @@ -88,7 +89,6 @@ "@typescript-eslint/eslint-plugin": "^1.7.0", "@typescript-eslint/parser": "^1.7.0", "aws-sdk": "2.770.0", - "eslint": "^5.16.0", "eslint-config-prettier": "^4.2.0", "eslint-plugin-prettier": "^3.0.1", "jest": "^24.1.0", @@ -96,11 +96,11 @@ "nodemon": "^2.0.1", "prettier": "^1.17.0", "ts-jest": "^24.0.0", - "ts-node": "^7.0.1", - "ts-node-dev": "^2.0.0", + "ts-node": "^10.4.0", + "ts-node-dev": "1.0.0-pre.44", "tsconfig-paths": "^4.0.0", "tslint": "^5.11.0", - "typescript": "^3.1.3" + "typescript": "^4.5.4" } }, "node_modules/@ampproject/remapping": { @@ -4306,6 +4306,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5936,7 +5937,8 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/check-error": { "version": "1.0.2", @@ -6248,6 +6250,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "dependencies": { "restore-cursor": "^2.0.0" }, @@ -6282,7 +6285,8 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cliui": { "version": "5.0.0", @@ -6877,6 +6881,253 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dateformat/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, "node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -7213,11 +7464,60 @@ } } }, + "node_modules/docker-modem": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", + "integrity": "sha512-4Xn4ZVtc/2DEFtxY04lOVeF7yvxwXGVo0sN8FKRBnLhBcwQ78Hb56j+Z5yAXXUhoweVhzGeBeGWahS+af0/mcg==", + "dependencies": { + "debug": "^2.6.0", + "JSONStream": "0.10.0", + "readable-stream": "~1.0.26-4", + "split-ca": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/docker-modem/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/docker-modem/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/docker-modem/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/docker-modem/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/docker-modem/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -7790,6 +8090,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "ajv": "^6.9.1", @@ -7910,6 +8211,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -7922,6 +8224,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7936,6 +8239,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -7944,13 +8248,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eslint/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -7968,6 +8274,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -7977,6 +8284,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver" } @@ -7986,6 +8294,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -7998,6 +8307,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, + "peer": true, "dependencies": { "acorn": "^6.0.7", "acorn-jsx": "^5.0.0", @@ -8012,6 +8322,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8036,6 +8347,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -8048,6 +8360,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -8939,6 +9252,7 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "peer": true, "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -9098,6 +9412,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, + "peer": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -9110,6 +9425,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, + "peer": true, "dependencies": { "flat-cache": "^2.0.1" }, @@ -9122,6 +9438,15 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "node_modules/filewatcher": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", + "integrity": "sha512-Fro8py2B8EJupSP37Kyd4kjKZLr+5ksFq7Vbw8A392Z15Unq8016SPUDvO/AsDj5V6bbPk98PTAinpc5YhPbJw==", + "dev": true, + "dependencies": { + "debounce": "^1.0.0" + } + }, "node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -9278,6 +9603,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, + "peer": true, "dependencies": { "flatted": "^2.0.0", "rimraf": "2.6.3", @@ -9292,6 +9618,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -9303,7 +9630,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/fn.name": { "version": "1.1.0", @@ -10663,6 +10991,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "peer": true, "engines": { "node": ">= 4" } @@ -10692,6 +11021,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10803,6 +11133,7 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, + "peer": true, "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -10827,6 +11158,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -10839,6 +11171,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10853,6 +11186,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -10861,13 +11195,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/inquirer/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -10877,6 +11213,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -10889,6 +11226,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -11335,6 +11673,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -11687,6 +12037,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -13648,7 +14004,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -13675,6 +14032,29 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha512-8XbSFFd43EG+1thjLNFIzCBlwXti0yKa7L+ak/f0T/pkC+31b7G41DXL/JzYpAoYWZ2eCPiu4IIqzijM8N0a/w==", + "dependencies": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "index.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -14381,6 +14761,14 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/meow": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", @@ -15543,7 +15931,8 @@ "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mysql": { "version": "2.18.1", @@ -15697,6 +16086,15 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, + "node_modules/node-docker-api": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", + "integrity": "sha512-8xfOiuLDJQw+l58i66lUNQhRhS5fAExqQbLolmyqMucrsDON7k7eLMIHphcBwwB7utwCHCQkcp73gSAmzSiAiw==", + "dependencies": { + "docker-modem": "^0.3.1", + "memorystream": "^0.3.1" + } + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -16253,6 +16651,7 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16445,6 +16844,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -16457,6 +16857,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -16752,6 +17153,27 @@ "node": ">=4" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -17144,6 +17566,7 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -17737,6 +18160,18 @@ "node": ">=0.10" } }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -17916,6 +18351,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -17951,6 +18387,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -17964,6 +18401,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -17973,6 +18411,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "dependencies": { "mimic-fn": "^1.0.0" }, @@ -18077,6 +18516,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.12.0" } @@ -18086,6 +18526,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "peer": true, "dependencies": { "tslib": "^1.9.0" }, @@ -18541,6 +18982,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -18555,6 +18997,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -18567,6 +19010,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -18575,7 +19019,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sliced": { "version": "1.0.1", @@ -19059,6 +19504,11 @@ "node": ">=4.5" } }, + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -19720,6 +20170,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, + "peer": true, "dependencies": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -19735,6 +20186,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -19749,6 +20201,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -19946,7 +20399,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/thenify": { "version": "3.3.1", @@ -19965,8 +20419,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { "version": "3.0.2", @@ -20004,6 +20457,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "peer": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -20209,116 +20663,6 @@ } }, "node_modules/ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "dependencies": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "bin": { - "ts-node": "dist/bin.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/ts-node-dev/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node-dev/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node-dev/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ts-node-dev/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-node-dev/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ts-node-dev/node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", @@ -20361,28 +20705,70 @@ } } }, - "node_modules/ts-node-dev/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/ts-node-dev": { + "version": "1.0.0-pre.44", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz", + "integrity": "sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw==", + "dev": true, + "dependencies": { + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "filewatcher": "~3.0.0", + "minimist": "^1.1.3", + "mkdirp": "^0.5.1", + "node-notifier": "^5.4.0", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.1", + "ts-node": "*", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "bin/ts-node-dev", + "tsnd": "bin/ts-node-dev" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/ts-node/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, "node_modules/ts-node/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -20648,9 +21034,9 @@ "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" }, "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -22353,6 +22739,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, + "peer": true, "dependencies": { "mkdirp": "^0.5.1" }, @@ -22628,12 +23015,12 @@ } }, "node_modules/yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/yocto-queue": { @@ -26206,6 +26593,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "peer": true, "requires": {} }, "acorn-walk": { @@ -27514,7 +27902,8 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "dev": true, + "peer": true }, "check-error": { "version": "1.0.2", @@ -27747,6 +28136,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "peer": true, "requires": { "restore-cursor": "^2.0.0" } @@ -27774,7 +28164,8 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "dev": true, + "peer": true }, "cliui": { "version": "5.0.0", @@ -28291,6 +28682,192 @@ } } }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + } + } + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -28541,11 +29118,59 @@ } } }, + "docker-modem": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", + "integrity": "sha512-4Xn4ZVtc/2DEFtxY04lOVeF7yvxwXGVo0sN8FKRBnLhBcwQ78Hb56j+Z5yAXXUhoweVhzGeBeGWahS+af0/mcg==", + "requires": { + "debug": "^2.6.0", + "JSONStream": "0.10.0", + "readable-stream": "~1.0.26-4", + "split-ca": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "peer": true, "requires": { "esutils": "^2.0.2" } @@ -29002,6 +29627,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.9.1", @@ -29046,6 +29672,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -29055,6 +29682,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29066,6 +29694,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -29074,13 +29703,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "peer": true, "requires": { "ms": "2.1.2" } @@ -29089,19 +29720,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -29156,6 +29790,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, + "peer": true, "requires": { "acorn": "^6.0.7", "acorn-jsx": "^5.0.0", @@ -29166,7 +29801,8 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -29180,6 +29816,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, + "peer": true, "requires": { "estraverse": "^5.1.0" }, @@ -29188,7 +29825,8 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -29970,6 +30608,7 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "peer": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -30097,6 +30736,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, + "peer": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -30106,6 +30746,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, + "peer": true, "requires": { "flat-cache": "^2.0.1" } @@ -30115,6 +30756,15 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "filewatcher": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", + "integrity": "sha512-Fro8py2B8EJupSP37Kyd4kjKZLr+5ksFq7Vbw8A392Z15Unq8016SPUDvO/AsDj5V6bbPk98PTAinpc5YhPbJw==", + "dev": true, + "requires": { + "debounce": "^1.0.0" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -30250,6 +30900,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, + "peer": true, "requires": { "flatted": "^2.0.0", "rimraf": "2.6.3", @@ -30261,6 +30912,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, + "peer": true, "requires": { "glob": "^7.1.3" } @@ -30271,7 +30923,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true + "dev": true, + "peer": true }, "fn.name": { "version": "1.1.0", @@ -31374,7 +32027,8 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "dev": true, + "peer": true }, "ignore-by-default": { "version": "1.0.1", @@ -31395,6 +32049,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "peer": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -31483,6 +32138,7 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -31504,6 +32160,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -31513,6 +32170,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -31524,6 +32182,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -31532,19 +32191,22 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "peer": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -31554,6 +32216,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "requires": { "has-flag": "^3.0.0" } @@ -31883,6 +32546,12 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -32116,6 +32785,12 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, "is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -33705,7 +34380,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "peer": true }, "json-stringify-safe": { "version": "5.0.1", @@ -33726,6 +34402,20 @@ "graceful-fs": "^4.1.6" } }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==" + }, + "JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha512-8XbSFFd43EG+1thjLNFIzCBlwXti0yKa7L+ak/f0T/pkC+31b7G41DXL/JzYpAoYWZ2eCPiu4IIqzijM8N0a/w==", + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -34295,6 +34985,11 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" + }, "meow": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", @@ -35188,7 +35883,8 @@ "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true + "dev": true, + "peer": true }, "mysql": { "version": "2.18.1", @@ -35321,6 +36017,15 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, + "node-docker-api": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", + "integrity": "sha512-8xfOiuLDJQw+l58i66lUNQhRhS5fAExqQbLolmyqMucrsDON7k7eLMIHphcBwwB7utwCHCQkcp73gSAmzSiAiw==", + "requires": { + "docker-modem": "^0.3.1", + "memorystream": "^0.3.1" + } + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -35741,7 +36446,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true + "dev": true, + "peer": true }, "p-cancelable": { "version": "2.1.1", @@ -35891,6 +36597,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "peer": true, "requires": { "callsites": "^3.0.0" }, @@ -35899,7 +36606,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -36134,6 +36842,21 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -36457,7 +37180,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "peer": true }, "promise-finally": { "version": "3.0.1", @@ -36939,6 +37663,15 @@ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -37078,7 +37811,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "peer": true }, "resolve-url": { "version": "0.2.1", @@ -37106,6 +37840,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "peer": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -37115,13 +37850,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "dev": true, + "peer": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "requires": { "mimic-fn": "^1.0.0" } @@ -37202,13 +37939,15 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "dev": true, + "peer": true }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "peer": true, "requires": { "tslib": "^1.9.0" } @@ -37568,6 +38307,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -37579,6 +38319,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "requires": { "color-convert": "^1.9.0" } @@ -37588,6 +38329,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "requires": { "color-name": "1.1.3" } @@ -37596,7 +38338,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -37994,6 +38737,11 @@ "resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz", "integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg==" }, + "split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -38517,6 +39265,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, + "peer": true, "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -38529,6 +39278,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "peer": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -38540,6 +39290,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^4.1.0" } @@ -38703,7 +39454,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "peer": true }, "thenify": { "version": "3.3.1", @@ -38722,8 +39474,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "through2": { "version": "3.0.2", @@ -38758,6 +39509,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "peer": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -38912,77 +39664,66 @@ "integrity": "sha512-y7wCmgQ1sIjDUheejmLIOz08XeJ8sQ75m4zKd2ppI4OgTbQIuW8e4ZfNyp75zgomSZGi0I/PIiaHSYdrHd+tiQ==" }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true } } }, "ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "version": "1.0.0-pre.44", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz", + "integrity": "sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw==", "dev": true, "requires": { - "chokidar": "^3.5.1", + "dateformat": "~1.0.4-1.2.3", "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", + "filewatcher": "~3.0.0", + "minimist": "^1.1.3", + "mkdirp": "^0.5.1", + "node-notifier": "^5.4.0", "resolve": "^1.0.0", "rimraf": "^2.6.1", "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", + "tree-kill": "^1.2.1", + "ts-node": "*", "tsconfig": "^7.0.0" }, "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -38991,33 +39732,6 @@ "requires": { "glob": "^7.1.3" } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true } } }, @@ -39226,9 +39940,9 @@ "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "typings": { @@ -40618,6 +41332,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, + "peer": true, "requires": { "mkdirp": "^0.5.1" } @@ -40837,9 +41552,9 @@ } }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { diff --git a/snode/package.json b/snode/package.json index 4a6d2fd..b538cb2 100755 --- a/snode/package.json +++ b/snode/package.json @@ -6,6 +6,7 @@ "scripts": { "build": "rimraf ./build && tsc", "dev": "ts-node-dev --respawn --inspect=9229 --transpile-only ./src/app.ts", + "dev6001": "ts-node-dev --inspect=6001 --transpile-only ./src/app.ts", "heroku-postbuild": "npm run build", "start": "nodemon", "inspect": "nodemon --inspect src/app.ts", @@ -56,6 +57,7 @@ "ethereum-blockies-base64": "^1.0.2", "ethereum-blockies-png": "^0.1.3", "ethereum-public-key-to-address": "0.0.2", + "ethers": "^5.7.2", "event-dispatch": "^0.4.1", "eventemitter3": "^3.1.0", "express": "^4.16.2", @@ -78,7 +80,9 @@ "multer": "^1.4.5-lts.1", "mysql": "2.18.1", "nano-ipfs-store": "0.1.3", + "node-docker-api": "^1.1.22", "node-schedule": "1.3.2", + "object-hash": "^3.0.0", "openpgp": "^5.3.1", "pg-promise": "^10.12.0", "promise.allsettled": "^1.0.6", @@ -87,6 +91,7 @@ "request-promise": "^4.2.6", "secp256k1-v4": "https://github.com/HarshRajat/secp256k1-node", "socket.io": "^4.4.1", + "socket.io-client": "^4.5.3", "ts-luxon": "^4.0.1", "typedi": "^0.8.0", "typescript": "^4.5.4", @@ -94,10 +99,7 @@ "underscore": "^1.13.6", "unique-names-generator": "^4.7.1", "web3": "1.6.0", - "winston": "^3.2.1", - "socket.io-client": "^4.5.3", - "ethers": "^5.7.2", - "object-hash": "^3.0.0" + "winston": "^3.2.1" }, "devDependencies": { "@types/agenda": "^2.0.4", @@ -112,7 +114,6 @@ "@typescript-eslint/eslint-plugin": "^1.7.0", "@typescript-eslint/parser": "^1.7.0", "aws-sdk": "2.770.0", - "eslint": "^5.16.0", "eslint-config-prettier": "^4.2.0", "eslint-plugin-prettier": "^3.0.1", "jest": "^24.1.0", @@ -120,10 +121,10 @@ "nodemon": "^2.0.1", "prettier": "^1.17.0", "ts-jest": "^24.0.0", - "ts-node": "^7.0.1", - "ts-node-dev": "^2.0.0", "tsconfig-paths": "^4.0.0", + "typescript": "^4.5.4", + "ts-node": "^10.4.0", "tslint": "^5.11.0", - "typescript": "^3.1.3" + "ts-node-dev": "1.0.0-pre.44" } } diff --git a/snode/src/api/index.ts b/snode/src/api/index.ts index 9d0bb00..bdb68ff 100755 --- a/snode/src/api/index.ts +++ b/snode/src/api/index.ts @@ -1,16 +1,12 @@ import { Router } from 'express'; -import pushMessaging from './routes/AppController'; +import {storageRoutes} from './routes/storageRoutes'; +import {ExpressUtil} from "../utilz/expressUtil"; // guaranteed to get dependencies export default () => { const app = Router(); - - // -- HELPERS - // For mailing route - pushMessaging(app); - console.log("pushMessaging loaded"); - - // Finally return app + app.use(ExpressUtil.handle); + storageRoutes(app); return app; }; diff --git a/snode/src/api/routes/AppController.ts b/snode/src/api/routes/storageRoutes.ts similarity index 87% rename from snode/src/api/routes/AppController.ts rename to snode/src/api/routes/storageRoutes.ts index 01fa4ce..ca1cb52 100755 --- a/snode/src/api/routes/AppController.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -1,40 +1,29 @@ import {Router, Request, Response, NextFunction} from 'express'; import {Container} from 'typedi'; -// import MessagingService from '../../services/pushMessageService'; -import middlewares from '../middlewares'; -import {celebrate, Joi} from 'celebrate'; import log from '../../loaders/logger'; import DbHelper from '../../helpers/dbHelper'; -import {isEmpty} from "lodash"; -import { StrUtil, DateUtil } from 'dstorage-common'; - import bodyParser from "body-parser"; - import {DateTime} from "ts-luxon"; -// const log = Container.get('logger'); -// console.log("pushMessaging imported"); +import {ExpressUtil} from "../../utilz/expressUtil"; +import DateUtil from "../../utilz/dateUtil"; +import StrUtil from "../../utilz/strUtil"; +import {ValidatorContractState} from "../../services/messaging-common/validatorContractState"; const route = Router(); const dbh = new DbHelper(); -function splitIntoNameAndIndex(nsNameWithIndex: string): string[] { - return nsNameWithIndex.split('.', 2); -} function logRequest(req: Request) { log.debug('Calling %o %o with body: %o', req.method, req.url, req.body); } -export default (app: Router) => { +// todo ValidatorContractState +// todo remove logic from router +export function storageRoutes (app: Router) { app.use(bodyParser.json()); app.use('/v1/kv', route); - app.post('/post-test', (req, res) => { - console.log('Got body:', req.body); - res.sendStatus(200); - }); - route.get( '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', /* */ async (req: Request, res: Response, next: NextFunction) => { @@ -43,7 +32,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; const dt = req.params.dt; const key = req.params.key; - const nodeId = '1'; // todo read this from db + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); log.debug(`nodeId=${nodeId} shardId=${shardId}`); @@ -69,12 +58,10 @@ export default (app: Router) => { log.debug(`found value: ${storageItems}`) log.debug('success is ' + success); try { - // const messaging = Container.get(MessagingService); return res.status(200).json({ items: storageItems }); } catch (e) { - // log.error('🔥 error: %o', e); return next(e); } } @@ -88,7 +75,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; // ex: 1000000 const ts:string = req.params.ts; //ex: 1661214142.123456 const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad - const nodeId = '1'; // todo read this from db + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db const body = JSON.stringify(req.body); log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); @@ -128,10 +115,8 @@ export default (app: Router) => { log.debug(`found value: ${storageValue}`) log.debug('success is ' + success); try { - // const messaging = Container.get(MessagingService); return res.status(201).json(storageValue); } catch (e) { - // log.error('🔥 error: %o', e); return next(e); } } @@ -152,7 +137,7 @@ export default (app: Router) => { const nsIndex = req.params.nsIndex; const dt = req.params.month + '01'; const key = req.params.key; - const nodeId = '1'; // todo read this from db + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db const body = JSON.stringify(req.body); const page = parseInt(req.params.page); log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); @@ -178,10 +163,8 @@ export default (app: Router) => { log.debug(`found value: ${storageValue}`) log.debug('success is ' + success); try { - // const messaging = Container.get(MessagingService); return res.status(200).json(storageValue); } catch (e) { - // log.error('🔥 error: %o', e); return next(e); } } diff --git a/snode/src/appInit.ts b/snode/src/appInit.ts index b75047d..55131bb 100755 --- a/snode/src/appInit.ts +++ b/snode/src/appInit.ts @@ -3,8 +3,8 @@ import express from 'express'; import chalk from 'chalk'; import {Container} from "typedi"; import StorageNode from "./services/messaging/storageNode"; -import {ValidatorContract} from "./services/messaging/validatorContract"; -import DeliverySocket from "./services/messaging/deliverySocket"; +import {ValidatorContractState} from "./services/messaging-common/validatorContractState"; +import {MySqlUtil} from "./utilz/mySqlUtil"; async function startServer(logLevel = null) { if (logLevel) { @@ -22,57 +22,16 @@ async function startServer(logLevel = null) { // Load logger const Logger = (await require('./loaders/logger')).default; - // Check environment setup first - // Logger.info('✌️ Verifying ENV'); - // const EnvVerifierLoader = (await require('./loaders/envVerifier')).default; - // await EnvVerifierLoader(); - // Logger.info('✔️ ENV Verified / Generated and Loaded!'); - await require('./api/index'); await require('./loaders/express'); Container.set("logger", Logger); - await Container.get(ValidatorContract).postConstruct(); + await Container.get(StorageNode).postConstruct(); - await Container.get(DeliverySocket).postConstruct(); // load app const app = express(); const server = require("http").createServer(app); - // const Pool = require("pg").Pool; - - // const credentials = { - // user: "postgres", - // host: "db", - // database: "snode1", - // password: "postgres", - // port: 5432, - // }; - - // let retries = 5; - - // async function connect() { - - // const pool = new Pool(credentials); - // const client = await pool.connect(); - // console.log("Connected to database"); - // client.release(); - // } - - // while (retries) { - // try { - // await connect(); - // break; - // } catch (err) { - // console.log(err); - // retries -= 1; - // console.log(`retries left: ${retries}`); - // // wait 5 seconds - // await new Promise((res) => setTimeout(res, 5000)); - // }} - - - /** * A little hack here * Import/Export can only be used in 'top-level code' diff --git a/snode/src/config/envLoader.ts b/snode/src/config/envLoader.ts deleted file mode 100644 index 4a3e35c..0000000 --- a/snode/src/config/envLoader.ts +++ /dev/null @@ -1,21 +0,0 @@ -import dotenv from 'dotenv'; -import { StrUtil } from 'dstorage-common'; - -export default class EnvLoader { - - public static loadEnvOrFail() { - const envFound = dotenv.config(); - if (envFound.error) { - // This error should crash whole process - throw new Error("⚠️ Couldn't find .env file ⚠️"); - } - } - - public static getPropertyOrFail(propName:string):string { - let val = process.env[propName]; - if(StrUtil.isEmpty(val)) { - throw new Error(`process.env.${propName} is empty`); - } - return val; - } -} \ No newline at end of file diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index c78a383..9ae234e 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -1,15 +1,43 @@ -import {Container} from 'typedi'; -import config from '../config'; -import { StrUtil } from 'dstorage-common' import log from '../loaders/logger'; import pgPromise from 'pg-promise'; import {DateTime} from "ts-luxon"; +import StrUtil from "../utilz/strUtil"; +import {EnvLoader} from "../utilz/envLoader"; +import {MySqlUtil} from "../utilz/mySqlUtil"; +import {PgUtil} from "../utilz/pgUtil"; +import {IClient} from "pg-promise/typescript/pg-subset"; + +// mysql +import crypto from "crypto"; +import {WinstonUtil} from "../utilz/winstonUtil"; + +var mysql = require('mysql') +var mysqlPool = mysql.createPool({ + connectionLimit: 10, + host: EnvLoader.getPropertyOrFail('DB_HOST'), + user: EnvLoader.getPropertyOrFail('DB_USER'), + password: EnvLoader.getPropertyOrFail('DB_PASS'), + database: EnvLoader.getPropertyOrFail('DB_NAME'), + port: Number(EnvLoader.getPropertyOrFail('DB_NAME')) +}) +MySqlUtil.init(mysqlPool); + + +// todo move everything into PgUtil including connection management +let logger = WinstonUtil.newLog('pg'); +let options = { + query: function (e) { + logger.debug('', e.query); + if (e.params) { + logger.debug('PARAMS: ', e.params); + } + } +}; +const pg: pgPromise.IMain<{}, IClient> = pgPromise(options); +export const pgPool = pg(`postgres://${EnvLoader.getPropertyOrFail('PG_USER')}:${EnvLoader.getPropertyOrFail('PG_PASS')}@${EnvLoader.getPropertyOrFail('PG_HOST')}:5432/${EnvLoader.getPropertyOrFail('PG_NAME')}`); +PgUtil.init(pgPool); -const pg = pgPromise({}); -// todo switch to a config file -export const db = pg(`postgres://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}:5432/${process.env.DB_NAME}`); -const crypto = require('crypto'); export default class DbHelper { @@ -33,7 +61,7 @@ export default class DbHelper { tablename='storage_ns_inbox_d_${dbdate}') ` console.log(sql) - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { console.log(data) return Promise.resolve(true) }).catch(err => { @@ -49,7 +77,7 @@ export default class DbHelper { values ($1, $2, $3, $4, $5) on conflict do nothing; ` console.log(sql); - return db.result(sql, [namespace, namespaceShardId, ts_start, ts_end, table_name], r => r.rowCount) + return pgPool.result(sql, [namespace, namespaceShardId, ts_start, ts_end, table_name], r => r.rowCount) .then(rowCount => { console.log('inserted rowcount: ', rowCount) return Promise.resolve(rowCount == 1) @@ -78,7 +106,7 @@ export default class DbHelper { ` // todo CREATE INDEX CONCURRENTLY ? console.log(sql) - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { console.log(data) return Promise.resolve(true) }).catch(err => { @@ -92,7 +120,7 @@ export default class DbHelper { const sql = `SELECT count(*) FROM network_storage_layout where namespace='${namespace}' and namespace_shard_id='${namespaceShardId}' and node_id='${nodeId}'` console.log(sql); - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { console.log(data) let cnt = parseInt(data[0].count); console.log(cnt); @@ -109,7 +137,7 @@ export default class DbHelper { where namespace='${namespace}' and namespace_shard_id='${namespaceShardId}' and ts_start <= '${dateYmd.toISO()}' and ts_end > '${dateYmd.toISO()}'` log.debug(sql); - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { log.debug(data); if (data.length != 1) { return Promise.reject('missing table with the correct name'); @@ -127,7 +155,7 @@ export default class DbHelper { from ${tableName} where skey = '${skey}'`; log.debug(sql); - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { log.debug(data); if (data.length != 1) { return Promise.reject('missing table with the correct name'); @@ -148,7 +176,7 @@ export default class DbHelper { from ${tableName} where skey = '${skey}'`; log.debug(sql); - return db.query(sql).then(data => { + return pgPool.query(sql).then(data => { log.debug(data); if (data.length != 1) { return Promise.reject('missing table with the correct name'); @@ -172,7 +200,7 @@ export default class DbHelper { values ('${ns}', '${shardId}', '${nsIndex}', to_timestamp(${ts}),'${skey}', 'v1', '${body}') ON CONFLICT (skey) DO UPDATE SET payload = '${body}'` log.debug(sql); - return db.none(sql).then(data => { + return pgPool.none(sql).then(data => { log.debug(data); return Promise.resolve(); }).catch(err => { @@ -195,7 +223,7 @@ export default class DbHelper { order by ts limit ${pageSize + pageLookAhead}`; log.debug(sql); - let data1 = await db.any(sql); + let data1 = await pgPool.any(sql); var items = []; var lastTs: number = 0; for (let i = 0; i < Math.min(data1.length, pageSize); i++) { @@ -228,7 +256,7 @@ export default class DbHelper { order by ts limit ${pageSizeForSameTimestamp}`; log.debug(sql2); - let data2 = await db.any(sql2); + let data2 = await pgPool.any(sql2); for (let row of data2) { items.push(DbHelper.convertRowToItem(row, namespace)); } diff --git a/snode/src/loaders/envVerifier.ts b/snode/src/loaders/envVerifier.ts deleted file mode 100755 index 9bb8384..0000000 --- a/snode/src/loaders/envVerifier.ts +++ /dev/null @@ -1,123 +0,0 @@ -import LoggerInstance from './logger'; - -export default async () => { - try { - // Load FS and Other dependency - const fs = require('fs'); - const envfile = require('envfile'); - const readline = require('readline'); - - var fileModified = false; - - // Load environment files - const envpath = `${__dirname}/../../.env`; - const envsamplepath = `${__dirname}/../../.env.sample`; - - // First check and create .env if it doesn't exists - if (!fs.existsSync(envpath)) { - LoggerInstance.info('-- Checking for ENV File... Not Found'); - fs.writeFileSync(envpath, '', { flag: 'wx' }); - LoggerInstance.info(' -- ENV File Generated'); - } else { - LoggerInstance.info(' -- Checking for ENV File... Found'); - } - - // Now Load the environment - const envData = fs.readFileSync(envpath, 'utf8'); - const envObject = envfile.parse(envData); - - const envSampleData = fs.readFileSync(envsamplepath, 'utf8'); - const envSampleObject = envfile.parse(envSampleData); - - const readIntSampleENV = readline.createInterface({ - input: fs.createReadStream(envsamplepath), - output: false, - }); - - let realENVContents = ''; - LoggerInstance.info(' -- Verifying and building ENV File...'); - - for await (const line of readIntSampleENV) { - let moddedLine = line; - - // Check if line is comment or environment variable - if (moddedLine.startsWith('#') || moddedLine.startsWith('\n') || moddedLine.trim().length == 0) { - // do nothing, just include it in the line - // console.log("----"); - } else { - // This is an environtment variable, first segregate the comment if any and the variable info - const delimiter = '#'; - - const index = moddedLine.indexOf('#'); - const splits = - index == -1 - ? [moddedLine.slice(0, index), ''] - : [moddedLine.slice(0, index), ' ' + delimiter + moddedLine.slice(index + 1)]; - - const envVar = splits[0].split('=')[0]; // Get environment variable by splitting the sample and then taking first seperation - const comment = splits[1]; - - // Check if envVar exists in real env, if not ask for val - // console.log(envObject[`${envVar}`]) - if (!envObject[`${envVar}`] || envObject[`${envVar}`].trim() == '') { - // env key doesn't exist, ask for input - LoggerInstance.input(` Enter ENV Variable Value --> ${envVar}`); - - var value = ''; - - while (value.trim().length == 0) { - const rl = readline.createInterface({ - input: process.stdin, - output: null, - }); - value = await doSyncPrompt(rl, `${envSampleObject[envVar]} >`); - - if (value.trim().length == 0) { - LoggerInstance.error(" Incorrect Entry, Field can't be empty"); - } - } - - LoggerInstance.saved(` [Saved] ${envVar}=${value}`); - moddedLine = `${envVar}=${value}${comment}`; - - fileModified = true; - } else { - // Value exists so just replicate - moddedLine = `${envVar}=${envObject[envVar]}${comment}`; - } - } - - // finally append the line - realENVContents = `${realENVContents}\n${moddedLine}`; - } - - if (fileModified) { - LoggerInstance.info(' -- new ENV file generated, saving'); - fs.writeFileSync(envpath, realENVContents, { flag: 'w' }); - LoggerInstance.info(' -- ENV file saved!'); - } else { - LoggerInstance.info(' -- ENV file verified!'); - } - - return null; - } catch (e) { - LoggerInstance.error('🔥 Error on env verifier loader: %o', e); - throw e; - } - - // Leverages Node.js' awesome async/await functionality - async function doSyncPrompt(rl, message) { - var promptInput = await readLineAsync(rl, message); - rl.close(); - - return promptInput; - } - - function readLineAsync(rl, message) { - return new Promise((resolve, reject) => { - rl.question(message, answer => { - resolve(answer.trim()); - }); - }); - } -}; diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts new file mode 100644 index 0000000..e9c092f --- /dev/null +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -0,0 +1,439 @@ +/** + block + 1 inputs -- + 2 outputs -- + message1 { source: wallet100, target: broadcast, signatures: [ { w100, 0x5} ] } + messageM { source: wallet200, target: [wallet1, ..., walletN], signatures: [ { w200, 0x6} ] } + 3 output signatures -- + signatures: [ { v1, 0xA}, { v2, 0xB}, { v3, 0xC}, + { s1, 0xD}, { s2, 0xE}, { s3, 0xF}, + { d1, 0x1}, { d2, 0x2}, { d3, 0x3} ] + */ +import { CollectionUtil } from '../../utilz/collectionUtil' +import StrUtil from '../../utilz/strUtil' +import { EthSig } from '../../utilz/ethSig' +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' +import { ObjectHasher } from '../../utilz/objectHasher' +import { EthUtil } from '../../utilz/EthUtil' +import { Check } from '../../utilz/check' + +/* +ex: +{ + "requests": [ + { + "senderType": 0, + "id": "6294189a-03d6-4412-8458-971bef18969c", + "verificationProof": "eip712v2:0x37ba76d10dceff2c4675d186a17b0e0ffe6020eef42ba170a2436192051996ad3daf835bb660bbad587f44a4e153bd9285fe0a166b35abd978453942f0b325ec1c::uid::1675756031", + "sender": "eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681", + "recipient": "eip155:0xD8634C39BBFd4033c0d3289C4515275102423681", + "source": "ETH_TEST_GOERLI", + "identityBytes": "0+1+EPNS x LISCON+Dropping test directly on push nodes at LISCON 2021.", + "validatorToken": "eyJub2RlcyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE2OTIyNzk1MTAwNTEsInJhbmRvbUhleCI6IjA5ZWFmOWE0YmE4ZDA3OTNkOTZjZmQ2OGYzNmE5ZDAwMDMzY2FlNGUiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE2OTIyNzk1MTAwMjgsInN0YXR1cyI6MX1dLCJzaWduYXR1cmUiOiIweDAwYmYwMjNiYWExMTI0ZTEzYzI2MDg5ZWY1MjVmNWE2YjhmZGY4OWJhODA1YzRjNjU3OTJiMmY2M2I2ZmI3MDY1MWNlYjM1YTEzODM2MjZhODdmYzU4OGExNjQ1NDViMDE0NDk5NWFkM2Q5ODRlMGM2MDcwOWZmZWM1MDcxNThjMWMifSx7Im5vZGVJZCI6IjB4ZkRBRWFmN2FmQ0ZiYjRlNGQxNkRDNjZiRDIwMzlmZDYwMDRDRmNlOCIsInRzTWlsbGlzIjoxNjkyMjc5NTEwMDU1LCJyYW5kb21IZXgiOiIxN2RlZTc1NDcwYjQ0NWFiNDgzN2U4YTdhNDIxNmIwMjhkMzA4MTMyIiwicGluZ1Jlc3VsdHMiOlt7Im5vZGVJZCI6IjB4OGUxMmRFMTJDMzVlQUJmMzViNTZiMDRFNTNDNEU0NjhlNDY3MjdFOCIsInRzTWlsbGlzIjoxNjkyMjc5NTEwMDM3LCJzdGF0dXMiOjF9XSwic2lnbmF0dXJlIjoiMHgzYjJhOTVkMTBlNDdkZjY2MGRmMzM2NzcxNTA2MWZlOWE3ZDZhYTUzZGZmMGE2NzI2YzI0MjI0OWU2NDUyNTFiNjQ4MWQwMWNiMmViMWJiMDRkMmI1ZjI3ZjA1ODFkZTc5ZTFiNjdjMzRiZTBkNTMyOWE1YWViZWZiMGJjYjE0YTFiIn1dfQ==" + } + ], + "responses": [ + { + "header": { + "sender": "eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681", + "recipientsResolved": [ + { + "addr": "eip155:0x5ac9E6205eACA2bBbA6eF716FD9AabD76326EEee", + "ts": 1664871012 + }, + { + "addr": "eip155:0x69e666767Ba3a661369e1e2F572EdE7ADC926029", + "ts": 1666268868 + }, + { + "addr": "eip155:0xD8634C39BBFd4033c0d3289C4515275102423681", + "ts": 1692295692 + } + ], + "senderType": 0, + "source": "ETH_TEST_GOERLI" + }, + "payload": { + "notification": { + "title": "testing goerli - EPNS x LISCON", + "body": "Dropping test directly on push nodes at LISCON 2021." + }, + "data": { + "type": 1, + "app": "testing goerli", + "icon": "https://gateway.ipfs.io/ipfs/bafybeidkt3qrlcplntabfazs7nnzlxdzu36mmieth2ocyphm2kp4sh333a/QmTX8zZjzuKpiLZmn4ShNzyKDakNdbBQfwi449TBw7wgoK", + "url": "https://dev.push.org/", + "sectype": null, + "asub": "EPNS x LISCON", + "amsg": "Dropping test directly on push nodes at LISCON 2021.", + "acta": "", + "aimg": "", + "etime": null, + "hidden": "0", + "silent": "0", + "additionalMeta": null, + "sid": "6294189a-03d6-4412-8458-971bef18969c" + }, + "recipients": "eip155:0xd8634c39bbfd4033c0d3289c4515275102423681", + "verificationProof": "eip712v2:0x37ba76d10dceff2c4675d186a17b0e0ffe6020eef42ba170a2436192051996ad3daf835bb660bbad587f44a4e153bd9285fe0a166b35abd978453942f0b325ec1c::uid::1675756031" + } + } + ], + "responsesSignatures": [ + [ + { + "data": null, + "nodeMeta": { + "nodeId": "0x8e12dE12C35eABf35b56b04E53C4E468e46727E8", + "role": "V", + "tsMillis": 1692281453978 + }, + "signature": "0xb95379d016b20161756c32a756eaa1b1fee7817874a55c26ae8f339bcbeb4ae172bcdcecd64c773559a4198dcd67b8bb78e5ed6d4370d9a016a08c46cca417111c" + }, + { + "data": { + "recipientsMissing": { + "recipients": [ + { + "addr": "eip155:0xD8634C39BBFd4033c0d3289C4515275102423681" + } + ], + "sid": "6294189a-03d6-4412-8458-971bef18969c" + } + }, + "nodeMeta": { + "nodeId": "0xfDAEaf7afCFbb4e4d16DC66bD2039fd6004CFce8", + "role": "A", + "tsMillis": 1692281454034 + }, + "signature": "0x51a7216a97e180876c0da7a74ab2e3e2ea2d3484a29d1488853eb1f76540f078470d421386664adc26a57959f72df2a62e173ed4a678560c8167cf89d9d417ba1c" + } + ] + ], + "attestToken": "eyJub2RlcyI6W3sibm9kZUlkIjoiMHhmREFFYWY3YWZDRmJiNGU0ZDE2REM2NmJEMjAzOWZkNjAwNENGY2U4IiwidHNNaWxsaXMiOjE2OTIyODE0MzAwMjcsInJhbmRvbUhleCI6ImQ0OWM1NjY3MGVkNzIwZDQ1MDFkMjYzNmQ0YWY2MWI2OGEwNzJkZGMiLCJwaW5nUmVzdWx0cyI6W3sibm9kZUlkIjoiMHg4ZTEyZEUxMkMzNWVBQmYzNWI1NmIwNEU1M0M0RTQ2OGU0NjcyN0U4IiwidHNNaWxsaXMiOjE2OTIyODE0MDAwMzQsInN0YXR1cyI6MX1dLCJzaWduYXR1cmUiOiIweDlhNTFkNDU3MjM4ZGMzODM3MDgxNWM5Yzc0ZTdhZGMwNjE1YjdkMTc0OTU5YmViNmJlMDI1NTc5MzM0YmQyOTg1MDE1MGFjMjY0YTEyZGVhYzIxMmVjODc2ZjkyMjNmYTJkZmU3Y2MyOTE3ZDZjN2E5MjQ3MThkZDNhMjM1ZGNmMWIifSx7Im5vZGVJZCI6IjB4OGUxMmRFMTJDMzVlQUJmMzViNTZiMDRFNTNDNEU0NjhlNDY3MjdFOCIsInRzTWlsbGlzIjoxNjkyMjgxNDMwMDM1LCJyYW5kb21IZXgiOiIwOWNkYTI3ZTdmNzE2MmNhYmM4YzRiY2NiZDc2NjNhZGEyNTg0YzBkIiwicGluZ1Jlc3VsdHMiOlt7Im5vZGVJZCI6IjB4ZkRBRWFmN2FmQ0ZiYjRlNGQxNkRDNjZiRDIwMzlmZDYwMDRDRmNlOCIsInRzTWlsbGlzIjoxNjkyMjgxNDMwMDIwLCJzdGF0dXMiOjF9XSwic2lnbmF0dXJlIjoiMHgwOWRhNjg3NGMyNmVhNzAxODZlY2U4NWJiMWM1OWU0YjA5MjUxYTcwZTY5MmJlYjJlNmNkM2FjMDMyMmViN2ZhNDM2MmM3ZTRhZWY2ZmVmMzQyMDJjNGQ3ZmRkYjRjMTQ0ZWJjMGFkMWE5NmZlZGYwMzViNTVjMDg4MDM3MWI2ODFiIn1dfQ==" +} + */ +export class MessageBlock { + id: string + // input (filled by NetworkRole.VALIDATOR) + requests: PayloadItem[] = [] + // output (filled by NetworkRole.VALIDATOR) + attestToken: string + // output (filled by NetworkRole.VALIDATOR) + responses: FeedItem[] = [] // [feedItem] + // output (filled by NetworkRole.VALIDATOR at [0], NetworkRole.ATTESTER at [1+]) + responsesSignatures: FeedItemSig[][] = [] // [feedItem] [signatures] + + // stages + // randao: any; // todo secure random vector, which defines applied validators + // blockValidatorSig: VSignature[]; // first validator who produced that block + // blockStorageSig: VSignature[]; // snodes which store that block +} + +export class MessageBlockSignatures { + id: string + responsesSignatures: FeedItemSig[][] = [] +} + +export enum NetworkRole { + VALIDATOR = 'V', + ATTESTER = 'A', + STORAGE = 'S', + DELIVERY = 'D' +} + +export class NodeMeta { + nodeId: string // uniq node id, this is eth wallet, ex: 0xAAAAAAA + role: NetworkRole // validator, attester ex: "V" + tsMillis: number // timestamp, ms ex: 1999999 +} + +/* +ex: +{ + "nodeMeta": { + "nodeId": "0xfDAEaf7afCFbb4e4d16DC66bD2039fd6004CFce8", + "role": "A", + "tsMillis": 1692199658713 + }, + "data": { + "recipientsMissing" : [{ + "sid" : "e9fd5df5-d782-4196-9072-f912053bf96c", + "recipients": [ + {"addr" : "eip155:0xd8634c39bbfd4033c0d3289c4515275102423681"} + ], + }] + }, + "signature": "0xf46f12e12c8b1a7b15a38702f01db62a081c6906fd0839cef077f567e8bbb0b4603b51ca004b43714d9cb4032aefc6ef63646d0fa1fdb8281ff5f824efe4959c1c" +} + */ +export class FeedItemSig { + data: FISData | null + nodeMeta: NodeMeta // empty, until signed + signature: string // empty, until signed + + constructor(data: FISData, nodeMeta: NodeMeta, signature: string) { + this.data = data + this.nodeMeta = nodeMeta + this.signature = signature + } +} + +export class FISData { + recipientsMissing?: RecipientsMissing +} + +export class RecipientsMissing { + sid: string + recipients: RecipientMissing[] = [] +} + +export class RecipientMissing { + addr: string +} + +// see MySql:feeds +export class FeedItem { + header: FHeader + payload: FPayload +} + +export class FHeader { + sender: string // ex: eip155:1:0x6500 + recipientsResolved: Recipient[] // ex: eip155:1:0x0700 or a list of recipients + senderType: number // ex: #SenderType.CHANNEL + source: string // ex: ETH_MAINNET + // verification: string; // ex: eip712v2:0xFO00::uid::3F // todo Check that this is not needed + // subscribed:boolean; //, ex: true + // isSpam:boolean; //, ex: true +} + +export class Recipient { + addr: string + ts: number +} + +export class FNotification { + title: string + body: string +} + +export enum SenderType { + CHANNEL = 0, + W2W = 1, + PUSH_VIDEO = 2, + PUSH_SPACE = 3 +} + +export class FPayload { + data: FData + notification: FNotification + sectype: string + recipients: any + verificationProof: any +} + +export class FData { + app: string + sid: string + url: string + acta: string + aimg: string + amsg: string + asub: string + icon: string + type: number + epoch: string + etime: string + sectype: string + hidden: string // 0 or 1 + videoMeta: any +} + +// see PayloadService.addExternalPayload +export class PayloadItem { + // ex: AAAZZ-AAAAA-BBBB + id: string + // ex: eip712v2:0xFO00::uid::3F + verificationProof: string + // ex: eip155:1:0x6500 + sender: string + // ex: #SenderType.CHANNEL + senderType: number = SenderType.CHANNEL + // ex: eip155:1:0x0700 + recipient: string + // ex: ETH_MAINNET + source: string + // ex: 2+{"title":"test", "body":"test2", "data":{"acta":"", "aimg":"","amsg":""}} + identityBytes: any + + validatorToken: string + + public constructor( + payloadId: string, + verificationProof: string, + sender: string, + senderType: number = SenderType.CHANNEL, + recipient: string, + source: string, + identityBytes: any, + validatorToken?: string + ) { + this.id = payloadId + this.verificationProof = verificationProof + this.sender = sender + this.senderType = senderType + this.recipient = recipient + this.source = source + this.identityBytes = identityBytes + this.validatorToken = validatorToken + } +} + +export class MessageBlockUtil { + public static log: Logger = WinstonUtil.newLog(MessageBlockUtil) + + /** + * Calculates which addresses will receive messages + * as a result of processing this block.request[requestOffset] + * by a delivery node + * + * @param block + * @param requestOffset search by an offset + * @param requestSid OR search by sid + */ + static calculateRecipients( + block: Readonly, + requestOffset: number, + requestSid?: string + ): string[] { + if (requestOffset == null) { + requestOffset = block.requests.findIndex((value) => value.id === requestSid) + } + Check.isTrue(requestOffset >= 0, 'requestOffset not found') + const recipientsV = block.responses[requestOffset].header.recipientsResolved + const signaturesA = block.responsesSignatures[requestOffset] + const allRecipients = CollectionUtil.arrayToMap(recipientsV, 'addr') + for (const signatureA of signaturesA) { + const recipientsMissing = signatureA.data.recipientsMissing + for (const itemToRemove of recipientsMissing.recipients) { + allRecipients.delete(itemToRemove.addr) + } + } + return Array.from(allRecipients.keys()) + } + + static calculateHash(block: Readonly) { + return ObjectHasher.hashToSha256(block) + } + + /** + * Evaluates all messageBlock target recipients (normally these are addresses) + * for every included packet + * + * And for every recipient finds which shard will host this address + * + * @param block + * @returns a set of shard ids + */ + static calculateAffectedShards(block: Readonly): Set { + const shards = new Set() + for (const response of block.responses) { + for (const recipient of response.header.recipientsResolved) { + const recipientAddr = recipient.addr + let shardId: number = null + // 1) try to get first byte from caip address + // eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681 -> D8 + // and use it as shard + const addrObj = EthUtil.parseCaipAddress(recipientAddr) + if (addrObj != null && !StrUtil.isEmpty(addrObj.addr)) { + Check.isTrue(recipientAddr.startsWith('0x')) + shardId = Number.parseInt(addrObj.addr.substring(2, 4).toLowerCase(), 16) + } + // 2) try to get sha256 otherwise + if (shardId == null) { + shardId = Number.parseInt(ObjectHasher.hashToSha256(recipientAddr.substring(0, 2))) + } + Check.notNull(shardId) + shards.add(shardId) + } + } + return shards + } + + public static checkBlock(block: MessageBlock, validatorsFromContract: Set): CheckResult { + if (block.requests.length != block.responses.length) { + return CheckResult.failWithText( + `message block has incorrect length ${block.requests.length}!=${block.responses.length}` + ) + } + const blockValidatorNodeId = null + const item0sig0 = block.responsesSignatures[0][0] + if ( + item0sig0?.nodeMeta.role != NetworkRole.VALIDATOR || + StrUtil.isEmpty(item0sig0?.nodeMeta.nodeId) + ) { + return CheckResult.failWithText('first signature is not performed by a validator') + } + const result: FeedItemSig[] = [] + for (let i = 0; i < block.responses.length; i++) { + const payloadItem = block.requests[i] + const fi = block.responses[i] + // check signatures + const feedItemSignatures = block.responsesSignatures[i] + for (let j = 0; j < feedItemSignatures.length; j++) { + const fiSig = feedItemSignatures[j] + if (j == 0) { + if (fiSig.nodeMeta.role != NetworkRole.VALIDATOR) { + return CheckResult.failWithText( + `First signature on a feed item should be ${NetworkRole.VALIDATOR}` + ) + } + } else { + if (fiSig.nodeMeta.role != NetworkRole.ATTESTER) { + return CheckResult.failWithText( + `2+ signature on a feed item should be ${NetworkRole.ATTESTER}` + ) + } + } + const valid = EthSig.check( + fiSig.signature, + fiSig.nodeMeta.nodeId, + fi, + fiSig.data, + fiSig.nodeMeta + ) + if (!valid) { + return CheckResult.failWithText( + `signature is not valid: replyOffset ${i} sigOffset ${j} : ${JSON.stringify(fiSig)} ` + ) + } else { + this.log.debug('valid signature %o', fiSig) + } + const validNodeId = validatorsFromContract.has(fiSig.nodeMeta.nodeId) + if (!validNodeId) { + return CheckResult.failWithText( + `${fiSig.nodeMeta.nodeId} is not a valid nodeId from a contract` + ) + } else { + this.log.debug('valid nodeId %o', fiSig.nodeMeta.nodeId) + } + } + } + return CheckResult.ok() + } +} + +export class CheckResult { + success: boolean + err: string + + static failWithText(err: string): CheckResult { + return { success: false, err: err } + } + + static ok(): CheckResult { + return { success: true, err: '' } + } +} diff --git a/snode/src/services/messaging-common/queueClientHelper.ts b/snode/src/services/messaging-common/queueClientHelper.ts new file mode 100644 index 0000000..e97eb90 --- /dev/null +++ b/snode/src/services/messaging-common/queueClientHelper.ts @@ -0,0 +1,52 @@ +import { Check } from '../../utilz/check' +import { ValidatorContractState } from './validatorContractState' +import { MySqlUtil } from '../../utilz/mySqlUtil' +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' + +export class QueueClientHelper { + private static log: Logger = WinstonUtil.newLog(QueueClientHelper) + + // updates the dset_client table used for queries according to the contract data + public static async initClientForEveryQueueForEveryValidator( + contract: ValidatorContractState, + queueNames: string[] + ) { + Check.notEmptyArr(queueNames, 'queue names missing') + const allValidators = contract.getAllValidatorsExceptSelf() + for (const queueName of queueNames) { + for (const nodeInfo of allValidators) { + const targetNodeId = nodeInfo.nodeId + const targetNodeUrl = nodeInfo.url + const targetState = ValidatorContractState.isEnabled(nodeInfo) ? 1 : 0 + await MySqlUtil.insert( + `INSERT INTO dset_client (queue_name, target_node_id, target_node_url, target_offset, state) + VALUES (?, ?, ?, 0, ?) + ON DUPLICATE KEY UPDATE target_node_url=?, + state=?`, + queueName, + targetNodeId, + targetNodeUrl, + targetState, + targetNodeUrl, + targetState + ) + const targetOffset = await MySqlUtil.queryOneValue( + `SELECT target_offset + FROM dset_client + where queue_name = ? + and target_node_id = ?`, + queueName, + targetNodeId + ) + this.log.info( + 'client polls (%s) queue: %s node: %s from offset: %d ', + targetState, + queueName, + targetNodeId, + targetOffset + ) + } + } + } +} diff --git a/snode/src/services/messaging-common/redisClient.ts b/snode/src/services/messaging-common/redisClient.ts new file mode 100644 index 0000000..b765299 --- /dev/null +++ b/snode/src/services/messaging-common/redisClient.ts @@ -0,0 +1,24 @@ +import { createClient, RedisClientType } from 'redis' +import config from '../../config' +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' +import { Service } from 'typedi' + +@Service() +export class RedisClient { + public log: Logger = WinstonUtil.newLog(RedisClient) + private client: RedisClientType + + public async postConstruct(): Promise { + this.client = await createClient({ + url: config.REDIS_URL + }) + await this.client.connect() + this.client.on('error', (err) => this.log.error('Redis Client Error', err)) + await this.client.set('connection', 'Redis connection successful') // todo do we need this line? + } + + public getClient(): RedisClientType { + return this.client + } +} diff --git a/snode/src/services/messaging-common/validatorContractState.ts b/snode/src/services/messaging-common/validatorContractState.ts new file mode 100644 index 0000000..abd9409 --- /dev/null +++ b/snode/src/services/messaging-common/validatorContractState.ts @@ -0,0 +1,300 @@ +import { Service } from 'typedi' +import { Contract, ethers, Wallet } from 'ethers' +import StrUtil from '../../utilz/strUtil' + +import fs, { readFileSync } from 'fs' +import path from 'path' +import { JsonRpcProvider } from '@ethersproject/providers/src.ts/json-rpc-provider' +import { EnvLoader } from '../../utilz/envLoader' +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' + +/* +Validator contract abstraction. +All blockchain goes here + */ +@Service() +export class ValidatorContractState { + nodeId: string + wallet: Wallet + + public log: Logger = WinstonUtil.newLog(ValidatorContractState) + + private contractFactory: ContractClientFactory + public contractCli: ValidatorCtClient + + public async postConstruct() { + this.log.info('ValidatorContractState.postConstruct()') + this.contractFactory = new ContractClientFactory() + this.contractCli = await this.contractFactory.buildRWClient(this.log) + await this.contractCli.connect() + this.log.info('loaded %o ', this.contractCli.nodeMap) + this.wallet = this.contractFactory.nodeWallet + this.nodeId = this.wallet.address + if (!this.wallet) throw new Error('wallet is not loaded') + if (this.contractCli.nodeMap == null) throw new Error('Nodes are not initialized') + } + + public isActiveValidator(nodeId: string): boolean { + const vi = this.contractCli.nodeMap.get(nodeId) + return vi != null + } + + public getAllNodesMap(): Map { + return this.contractCli.nodeMap + } + + public getActiveValidatorsExceptSelf(): NodeInfo[] { + const allNodes = Array.from(this.getAllNodesMap().values()) + const onlyGoodValidators = allNodes.filter( + (ni) => + ni.nodeType == NodeType.VNode && + ValidatorContractState.isEnabled(ni) && + this.nodeId !== ni.nodeId + ) + return onlyGoodValidators + } + + public getActiveValidators(): NodeInfo[] { + const allNodes = Array.from(this.getAllNodesMap().values()) + const onlyGoodValidators = allNodes.filter( + (ni) => ni.nodeType == NodeType.VNode && ValidatorContractState.isEnabled(ni) + ) + return onlyGoodValidators + } + + public getAllValidatorsExceptSelf(): NodeInfo[] { + const allNodes = Array.from(this.getAllNodesMap().values()) + const onlyGoodValidators = allNodes.filter( + (ni) => + ni.nodeType == NodeType.VNode && + ValidatorContractState.isEnabled(ni) && + this.nodeId !== ni.nodeId + ) + return onlyGoodValidators + } + + public static isEnabled(ni: NodeInfo) { + return ( + ni.nodeStatus == NodeStatus.OK || + ni.nodeStatus == NodeStatus.Reported || + ni.nodeStatus == NodeStatus.Slashed + ) + } +} + +class ContractClientFactory { + private validatorCtAddr: string + private provider: JsonRpcProvider + private abi: string + private pushTokenAddr: string + private validatorRpcEndpoint: string + private validatorRpcNetwork: number + private configDir: string + nodeWallet: Wallet + // private nodeWallet: Signer; + private validatorPrivateKeyFile: string + private validatorPrivateKeyPass: string + private nodeAddress: string + + constructor() { + this.validatorCtAddr = EnvLoader.getPropertyOrFail('VALIDATOR_CONTRACT_ADDRESS') + this.pushTokenAddr = EnvLoader.getPropertyOrFail('VALIDATOR_PUSH_TOKEN_ADDRESS') + this.validatorRpcEndpoint = EnvLoader.getPropertyOrFail('VALIDATOR_RPC_ENDPOINT') + this.validatorRpcNetwork = Number.parseInt(EnvLoader.getPropertyOrFail('VALIDATOR_RPC_NETWORK')) + this.provider = new ethers.providers.JsonRpcProvider( + this.validatorRpcEndpoint, + this.validatorRpcNetwork + ) + this.configDir = EnvLoader.getPropertyOrFail('CONFIG_DIR') + this.abi = ContractClientFactory.loadValidatorContractAbi(this.configDir, 'ValidatorV1.json') + } + + private static loadValidatorContractAbi(configDir: string, fileNameInConfigDir: string): string { + const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`) + const file = fs.readFileSync(fileAbsolute, 'utf8') + const json = JSON.parse(file) + const abi = json.abi + console.log(`abi size:`, abi.length) + return abi + } + + // creates a client which can only read blockchain state + public async buildROClient(log: Logger): Promise { + const contract = new ethers.Contract(this.validatorCtAddr, this.abi, this.provider) + return new ValidatorCtClient(contract, log) + } + + // creates a client, using an encrypted private key from disk, so that we could write to the blockchain + public async buildRWClient(log: Logger): Promise { + this.validatorPrivateKeyFile = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE') + this.validatorPrivateKeyPass = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS') + + const jsonFile = readFileSync(this.configDir + '/' + this.validatorPrivateKeyFile, 'utf-8') + this.nodeWallet = await Wallet.fromEncryptedJson(jsonFile, this.validatorPrivateKeyPass) + this.nodeAddress = await this.nodeWallet.getAddress() + + const signer = this.nodeWallet.connect(this.provider) + const contract = new ethers.Contract(this.validatorCtAddr, this.abi, signer) + return new ValidatorCtClient(contract, log) + } +} + +// all Validator contract interactions are wrapped into this class +export class ValidatorCtClient { + contract: Contract + private log: Logger + + // contract state + nodeMap: Map = new Map() + public attestersRequired: number + public nodeRandomMinCount: number + public nodeRandomPingCount: number + + constructor(contract: ethers.Contract, log: Logger) { + this.contract = contract + this.log = log + } + + private async loadConstants() { + { + this.attestersRequired = await this.contract.attestersRequired() + this.log.info(`attestersRequired=${this.attestersRequired}`) + if (this.attestersRequired == null) { + throw new Error('attestersRequired is undefined') + } + this.contract.on('AttestersRequiredUpdated', (value: number) => { + this.attestersRequired = value + this.log.info(`attestersRequired=${this.attestersRequired}`) + }) + } + + { + this.nodeRandomMinCount = await this.contract.nodeRandomMinCount() + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) + if (this.nodeRandomMinCount == null) { + throw new Error('nodeRandomMinCount is undefined') + } + this.contract.on('NodeRandomMinCountUpdated', (value: number) => { + this.nodeRandomMinCount = value + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) + }) + } + + { + this.nodeRandomPingCount = await this.contract.nodeRandomPingCount() + this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`) + if (this.nodeRandomPingCount == null) { + throw new Error('nodeRandomPingCount is undefined') + } + this.contract.on('NodeRandomPingCountUpdated', (value: number) => { + this.nodeRandomPingCount = value + this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`) + }) + } + } + + async connect() { + await this.loadConstants() + const result = this.loadNodesFromEnv() + if (result != null) { + // we have a debug variable set; no need to do blockchain + this.nodeMap = result + return + } + const nodeAddresses = await this.contract.getNodes() + for (const nodeAddress of nodeAddresses) { + const ctObj = await this.contract.getNodeInfo(nodeAddress) + this.nodeMap.set( + ctObj.nodeWallet, + new NodeInfo(ctObj.nodeWallet, ctObj.nodeApiBaseUrl, ctObj.nodeType, NodeStatus.OK) + ) + } + this.log.info('contract nodes loaded %o', this.nodeMap) + + this.contract.on( + 'NodeAdded', + ( + ownerWallet: string, + nodeWallet: string, + nodeType: number, + nodeTokens: number, + nodeApiBaseUrl: string + ) => { + this.log.info('NodeAdded %o', arguments) + this.log.info( + 'NodeAdded %s %s %s %s %s', + ownerWallet, + nodeWallet, + nodeType, + nodeTokens, + nodeApiBaseUrl + ) + this.nodeMap.set( + nodeWallet, + new NodeInfo(nodeWallet, nodeApiBaseUrl, nodeType, NodeStatus.OK) + ) + this.log.info('ValidatorMap: %o', this.nodeMap) + } + ) + + this.contract.on( + 'NodeStatusChanged', + (nodeWallet: string, nodeStatus: number, nodeTokens: number) => { + this.log.info('NodeStatusChanged', arguments) + this.log.info('NodeStatusChanged', nodeWallet, nodeStatus, nodeTokens) + const ni = this.nodeMap.get(nodeWallet) + if (ni == null) { + this.log.error(`unknown node ${nodeWallet}`) + return + } + ni.nodeStatus = nodeStatus + } + ) + } + + private loadNodesFromEnv(): Map | null { + const testValidatorsEnv = process.env.VALIDATOR_CONTRACT_TEST_VALIDATORS + if (testValidatorsEnv) { + // test mode + const testValidators = <{ validators: NodeInfo[] }>JSON.parse(testValidatorsEnv) + const result = new Map() + for (const vi of testValidators.validators) { + vi.nodeId = StrUtil.normalizeEthAddress(vi.nodeId) + result.set(vi.nodeId, vi) + } + return result + } else { + return null + } + } +} + +// from smart contract +export enum NodeStatus { + OK, + Reported, + Slashed, + BannedAndUnstaked, + Unstaked +} + +export class NodeInfo { + nodeId: string + url: string + nodeType: NodeType + nodeStatus: NodeStatus + + constructor(nodeId: string, url: string, nodeType: NodeType, nodeStatus: NodeStatus) { + this.nodeId = nodeId + this.url = url + this.nodeType = nodeType + this.nodeStatus = nodeStatus + } +} + +export enum NodeType { + VNode = 0, // validator 0 + SNode = 1, // storage 1 + DNode = 2 // delivery 2 +} diff --git a/snode/src/services/messaging-dset/queueClient.ts b/snode/src/services/messaging-dset/queueClient.ts new file mode 100644 index 0000000..1dceef4 --- /dev/null +++ b/snode/src/services/messaging-dset/queueClient.ts @@ -0,0 +1,113 @@ +// ------------------------------ +// reads other node queue fully, appends everything to the local queue/storage +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' +import { MySqlUtil } from '../../utilz/mySqlUtil' +import axios from 'axios' +import { Consumer, QItem } from './queueTypes' + +export class QueueClient { + public log: Logger = WinstonUtil.newLog(QueueClient) + // remoteUrl: string // stored into db + // offset: number // stored into db + consumer: Consumer + queueName: string + + constructor(consumer: Consumer, remoteQueueName: string) { + this.consumer = consumer + this.queueName = remoteQueueName + } + + /** + * Call in cycle until it returns true, + * fetches maxRequests at max per each invocation per each endpoint + * @param maxRequests + * @returns true, if no more data available; false otherwise + */ + public async pollRemoteQueue(maxRequests: number): Promise { + const result = [] + const sameQueueEndpoints = await MySqlUtil.queryArr<{ + id: number + queue_name: string + target_node_id: string + target_node_url: string + target_offset: number + }>( + `select id, queue_name, target_node_id, target_node_url, target_offset + from dset_client + where queue_name = ? + and state = 1 + order by id asc`, + this.queueName + ) + for (const endpoint of sameQueueEndpoints) { + // todo EVERY ENDPOINT CAN BE DONE IN PARALLEL + // read data from the endpoint (in cycle) , update the offset in db + const endpointStats = { + queueName: this.queueName, + target_node_id: endpoint.target_node_id, + target_node_url: endpoint.target_node_url, + queries: 0, + downloadedItems: 0, + newItems: 0, + lastOffset: endpoint.target_offset + } + let lastOffset = endpoint.target_offset + for (let i = 0; i < maxRequests; i++) { + result.push(endpointStats) + endpointStats.queries++ + const reply = await this.readItems( + endpoint.queue_name, + endpoint.target_node_url, + lastOffset + ) + if (!reply || reply.items?.length == 0) { + break + } + for (const item of reply.items) { + endpointStats.downloadedItems++ + const appendSuccessful = await this.consumer.accept(item) + if (appendSuccessful) { + endpointStats.newItems++ + } + } + await MySqlUtil.update( + 'UPDATE dset_client SET target_offset=? WHERE id=?', + reply.lastOffset, + endpoint.id + ) + lastOffset = reply.lastOffset + endpointStats.lastOffset = reply.lastOffset + } + } + return { + result: result + } + } + + public async readItems( + queueName: string, + baseUri: string, + firstOffset: number = 0 + ): Promise<{ items: QItem[]; lastOffset: number } | null> { + const url = `${baseUri}/apis/v1/dset/queue/${queueName}?firstOffset=${firstOffset}` + try { + const re = await axios.get(url, { + timeout: 3000 + // signal: AbortSignal.timeout(3000) + }) + this.log.debug('readItems %s from offset %d %o', url, firstOffset, re?.data) + const obj: { items: QItem[]; lastOffset: number } = re.data + return obj + } catch (e) { + this.log.warn('readItems failed for url %s', url) + return null + } + } + + public async readLastOffset(queueName: string, baseUri: string): Promise { + const url = `${baseUri}/api/v1/dset/queue/${queueName}/lastOffset` + const resp: { result: number } = await axios.get(url, { timeout: 3000 }) + return resp.result + } +} diff --git a/snode/src/services/messaging-dset/queueServer.ts b/snode/src/services/messaging-dset/queueServer.ts new file mode 100644 index 0000000..a0c9214 --- /dev/null +++ b/snode/src/services/messaging-dset/queueServer.ts @@ -0,0 +1,166 @@ +// ------------------------------ +// a queue, which is used to store an append only log; +// this node: appends it - if storage says yes to a new item +// other nodes: read this from client +import { Logger } from 'winston' +import { WinstonUtil } from '../../utilz/winstonUtil' +import { MySqlUtil } from '../../utilz/mySqlUtil' +import { Consumer, DCmd, QItem } from './queueTypes' +import StrUtil from '../../utilz/strUtil' +import { ObjectHasher } from '../../utilz/objectHasher' + +export class QueueServer implements Consumer { + private log: Logger = WinstonUtil.newLog(QueueServer) + replyPageSize = 10 + queueName: string + storage: Consumer + + constructor( + localQueueName: string, + replyPageSize: number, + storageForDeduplication: Consumer | null + ) { + this.queueName = localQueueName + this.replyPageSize = replyPageSize + this.storage = storageForDeduplication + } + + /** + * If we have storage: try adding to storage first + * Otherwise insert into the queue. + * + * If an item has object_hash we will use that field at the db level + * @param item + */ + public async accept(item: QItem): Promise { + const cmd = item.object + let valid = true + if (this.storage != null) { + valid = await this.storage.accept(item) + } + this.log.debug('[%s] try add %o', this.queueName, cmd) + if (!valid) { + this.log.debug( + '[%s] item is already in the storage, skip adding to the queue', + this.queueName + ) + return false + } + let success + if (StrUtil.isEmpty(item.object_hash)) { + success = await this.appendDirect(cmd) + } else { + success = await this.appendWithHashChecks(item.object, item.object_hash) + } + this.log.debug('[%s] item pushed into the queue, success=%s', this.queueName, success) + return success + } + + /** + * Append to queue, only if cmdHash is uniq to the underlying queue table + * @param cmd + * @param cmdHash + */ + public async appendWithHashChecks(cmd: DCmd, cmdHash: string): Promise { + const cmdStr = JSON.stringify(cmd) + /* + note: IGNORE consumes all type of errors, so it is a very error prone keyword + we will return true only if there are affected rows + another option is to remove IGNORE and catch the exception + */ + const res = await MySqlUtil.insert( + `INSERT IGNORE INTO dset_queue_${this.queueName}(object, object_hash) + VALUES (?, ?)`, + cmdStr, + cmdHash + ) + return res.affectedRows === 1 + } + + /* + Add directly to queue + */ + public async appendDirect(cmd: DCmd) { + const object = JSON.stringify(cmd) + const objectHash = ObjectHasher.hashToSha256(cmd) + const res = await MySqlUtil.insert( + `INSERT INTO dset_queue_${this.queueName}(object) + VALUES (?,?)`, + object, + objectHash + ) + return res.affectedRows === 1 + } + + public async getFirstRowIdAfter(offset: number): Promise { + return await MySqlUtil.queryOneValue( + `select min(id) as id + from dset_queue_${this.queueName} + where id > ?`, + offset + ) + } + + public async readItems(offset: number): Promise { + const rows = await MySqlUtil.queryArr<{ id: number; object: string; object_hash: string }>( + `select id, object, object_hash + from dset_queue_${this.queueName} + where id > ? + order by id asc + limit ${this.replyPageSize} `, + offset + ) + const items: QItem[] = rows.map((row) => ({ + id: row.id, + object: JSON.parse(row.object), + object_hash: row.object_hash + })) + return items + } + + public getPageSize(): number { + return this.replyPageSize + } + + public async getLastOffset(): Promise { + const row = await MySqlUtil.queryOneRow<{ lastOffset: number }>( + `select max(id) as lastOffset + from dset_queue_${this.queueName} + limit 1` + ) + return row == null ? 0 : row.lastOffset + } + + public async readWithLastOffset( + firstOffset: number + ): Promise<{ items: QItem[]; lastOffset: number }> { + const items = await this.readItems(firstOffset) + let lastOffset + if (items.length == 0) { + // no items in the range and # of rows missing is more than a page size + // ex: [1,2,3, 100,101,102] - missing ids from 4 to 99 + const nextId = await this.getFirstRowIdAfter(firstOffset) + if (nextId == null) { + // no more data in the table + lastOffset = firstOffset + } else { + // for [100,101,102] + // if data starts at [100] => firstOffset=99 + lastOffset = nextId - 1 + } + } else { + // some items are there, grab latest + lastOffset = items[items.length - 1].id + } + return { + items: items, + lastOffset: lastOffset + } + } +} + +export enum QueueServerMode { + APPEND_TO_STORAGE_FIRST, + ITEM, + ITEM_WITH_HASH +} diff --git a/snode/src/services/messaging-dset/queueTypes.ts b/snode/src/services/messaging-dset/queueTypes.ts new file mode 100644 index 0000000..57b066f --- /dev/null +++ b/snode/src/services/messaging-dset/queueTypes.ts @@ -0,0 +1,17 @@ +// abstract item, can be anything +export interface QItem { + // a queue index, 0-based number, always grows + // filled only when Item is fetched by QueueClient from another remote QueueServer + id?: number + // some unique data hash (or ID); // todo check that we use that correctly + object_hash?: string + // a json payload with data + object: DCmd +} + +// abstract command, only for type checks +export interface DCmd {} + +export interface Consumer { + accept(item: T): Promise +} diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts new file mode 100644 index 0000000..0dd388c --- /dev/null +++ b/snode/src/services/messaging/BlockStorage.ts @@ -0,0 +1,38 @@ +import {Service} from "typedi"; +import {WinstonUtil} from "../../utilz/winstonUtil"; +import {Logger} from "winston"; +import {Consumer, QItem} from "../messaging-dset/queueTypes"; +import {MySqlUtil} from "../../utilz/mySqlUtil"; +import {MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; +import {ObjectHasher} from "../../utilz/objectHasher"; + +@Service() +export class BlockStorage { + public log: Logger = WinstonUtil.newLog(BlockStorage); + + // todo + async accept(item: QItem): Promise { + let calculatedHash = item.object_hash; + let rowId = await MySqlUtil.queryOneValueOrDefault('SELECT id FROM blocks where object_hash=?', + -1, calculatedHash); + if (rowId > 0) { + this.log.info('received block with hash %s, ' + + 'already exists in the storage at index %d, ignoring', + calculatedHash, rowId); + return false; + } + this.log.info('received block with hash %s, adding to the db', calculatedHash); + const objectAsJson = JSON.stringify(item.object); + const res = await MySqlUtil.insert( + `INSERT + IGNORE INTO blocks(object, object_hash) VALUES (?, ?)`, + objectAsJson, calculatedHash); + let requiresProcessing = res.affectedRows === 1; + if (!requiresProcessing) { + return false; + } + return true; + } + + +} diff --git a/snode/src/services/messaging/deliverySocket.ts b/snode/src/services/messaging/deliverySocket.ts deleted file mode 100644 index 8be6c02..0000000 --- a/snode/src/services/messaging/deliverySocket.ts +++ /dev/null @@ -1,83 +0,0 @@ -import {Container, Inject, Service} from 'typedi' -import io from 'socket.io-client' -import config from '../../config' -import log from '../../loaders/logger' -import StorageNode from "./storageNode"; -import {MessageBlock} from "./messageBlock"; -import {Logger} from "winston"; -import {NodeInfo, NodeType, ValidatorContract} from "./validatorContract"; - - -@Service() -export default class DeliverySocket { - static RECONNECTION_DELAY_MAX = 10000; - static RECONNECTION_DELAY = 5000; - - @Inject('logger') - private log: Logger; - - @Inject() - private storageNode: StorageNode; - - @Inject() - private validatorContract: ValidatorContract; - - private validatorSocketMap: Map = new Map(); - - public async postConstruct() { - for (const ni of this.validatorContract.getAllValidators()) { - if (NodeInfo.isValidValidator(ni)) { - await this.connect(ni); - } - } - } - - public async connect(ni: NodeInfo) { - this.log.info(`connecting to validator ${ni.nodeId} , url: ${ni.url}`); - const socket = io.connect(ni.url, { - reconnectionDelayMax: DeliverySocket.RECONNECTION_DELAY_MAX, - reconnectionDelay: DeliverySocket.RECONNECTION_DELAY, - query: { - mode: 'MESSAGE_BLOCK', - clientType: NodeType.DNode, // todo handle - clientVer: "1.0" // todo handle - }, - }); - let validatorSocket = new ValidatorSocket(); - validatorSocket.socket = socket; - validatorSocket.nodeId = ni.nodeId; - this.validatorSocketMap.set(ni.nodeId, validatorSocket) - - socket.on('connect', async () => { - this.log.info(`>connected to validator ${ni.nodeId} , url: ${ni.url}`); - - }) - - socket.on('connect_error', async () => { - this.log.error( - '!!!! Unable to connect to the push node websocket!! Will reconnect after with in next %o seconds.', - DeliverySocket.RECONNECTION_DELAY_MAX); - }); - - socket.on('disconnect', function () { - this.log.error('Socket connection dropped!'); - }); - - socket.on("messageBlockEvent", async (mb: MessageBlock) => { - this.log.info('message block event: %o', mb); - const res = this.storageNode.checkBlock(mb); - if (!res.success) { - log.error('error ' + res.err); - return; - } - await this.storageNode.unpackBlock(mb); - this.log.info('message block successfully unpacked: ', mb); - }); - } -} - -class ValidatorSocket { - socket: any; - nodeId: string; -} - diff --git a/snode/src/services/messaging/messageBlock.ts b/snode/src/services/messaging/messageBlock.ts deleted file mode 100644 index b5ea2cd..0000000 --- a/snode/src/services/messaging/messageBlock.ts +++ /dev/null @@ -1,141 +0,0 @@ - -/** - block - 1 inputs -- - 2 outputs -- - message1 { source: wallet100, target: broadcast, signatures: [ { w100, 0x5} ] } - messageM { source: wallet200, target: [wallet1, ..., walletN], signatures: [ { w200, 0x6} ] } - 3 output signatures -- - signatures: [ { v1, 0xA}, { v2, 0xB}, { v3, 0xC}, - { s1, 0xD}, { s2, 0xE}, { s3, 0xF}, - { d1, 0x1}, { d2, 0x2}, { d3, 0x3} ] - */ -export class MessageBlock { - id: string; - // input (filled by NetworkRole.VALIDATOR) - requests: PayloadItem[] = []; - // output (filled by NetworkRole.VALIDATOR) - attestToken: string; - // output (filled by NetworkRole.VALIDATOR) - responses: FeedItem[] = []; // [feedItem] - // output (filled by NetworkRole.VALIDATOR at [0], NetworkRole.ATTESTER at [1+]) - responsesSignatures: FeedItemSig[][] = []; // [feedItem] [signatures] - - // stages - // randao: any; // todo secure random vector, which defines applied validators - // blockValidatorSig: VSignature[]; // first validator who produced that block - // blockStorageSig: VSignature[]; // snodes which store that block -} - -export enum NetworkRole { - VALIDATOR = "V", - ATTESTER = "A", - STORAGE = "S", - DELIVERY = "D" -} - - -export class NodeMeta { - nodeId: string; // uniq node id, this is eth wallet, ex: 0xAAAAAAA - role: NetworkRole; // validator, attester ex: "V" - tsMillis: number; // timestamp, ms ex: 1999999 -} - - -export class FeedItemSig { - nodeMeta: NodeMeta; // empty, until signed - signature: string; // empty, until signed - - - constructor(nodeMeta: NodeMeta, signature: string) { - this.nodeMeta = nodeMeta; - this.signature = signature; - } -} - -// see MySql:feeds -export class FeedItem { - header: FHeader; - payload: FPayload; -} - -export class FHeader { - sender: string; // ex: eip155:1:0x6500 - recipients: string[]; // ex: eip155:1:0x0700 or a list of recipients - senderType: number; // ex: #SenderType.CHANNEL - source: string; // ex: ETH_MAINNET - // verification: string; // ex: eip712v2:0xFO00::uid::3F // todo Check that this is not needed - // subscribed:boolean; //, ex: true - // isSpam:boolean; //, ex: true - -} - -export class FNotification { - title: string; - body: string; -} - -export enum SenderType { - CHANNEL = 0, - W2W = 1, - PUSH_VIDEO = 2 -} - -export class FPayload { - data: FData; - notification: FNotification; - sectype: string; - recipients: any; - verificationProof: any; -} - -export class FData { - app: string; - sid: string; - url: string; - acta: string; - aimg: string; - amsg: string; - asub: string; - icon: string; - type: number; - epoch: string; - etime: string; - sectype: string; - hidden: string; // 0 or 1 - videoMeta: any; -} - -// see PayloadService.addExternalPayload -export class PayloadItem { - // ex: AAAZZ-AAAAA-BBBB - id: string; - // ex: eip712v2:0xFO00::uid::3F - verificationProof: string; - // ex: eip155:1:0x6500 - sender: string; - // ex: #SenderType.CHANNEL - senderType: number = SenderType.CHANNEL; - // ex: eip155:1:0x0700 - recipient: string; - // ex: ETH_MAINNET - source: string; - // ex: 2+{"title":"test", "body":"test2", "data":{"acta":"", "aimg":"","amsg":""}} - identityBytes: any; - - validatorToken: string; - - public constructor(payloadId: string, verificationProof: string, sender: string, - senderType: number = SenderType.CHANNEL, - recipient: string, source: string, identityBytes: any, - validatorToken?: string) { - this.id = payloadId; - this.verificationProof = verificationProof; - this.sender = sender; - this.senderType = senderType; - this.recipient = recipient; - this.source = source; - this.identityBytes = identityBytes; - this.validatorToken = validatorToken; - } -} diff --git a/snode/src/services/messaging/queueManager.ts b/snode/src/services/messaging/queueManager.ts new file mode 100644 index 0000000..d131d72 --- /dev/null +++ b/snode/src/services/messaging/queueManager.ts @@ -0,0 +1,116 @@ +import {Inject, Service} from 'typedi' +import {MySqlUtil} from '../../utilz/mySqlUtil' +import {Logger} from 'winston' +import schedule from 'node-schedule' +import {ValidatorContractState} from '../messaging-common/validatorContractState' +import {WinstonUtil} from '../../utilz/winstonUtil' +import {QueueServer} from '../messaging-dset/queueServer' +import {QueueClient} from '../messaging-dset/queueClient' +import StorageNode from "./storageNode"; + + +@Service() +export class QueueManager { + public log: Logger = WinstonUtil.newLog(QueueManager) + + @Inject((type) => ValidatorContractState) + private contractState: ValidatorContractState; + @Inject(type => StorageNode) + private storageNode:StorageNode; + + + // PING: schedule + private readonly CLIENT_READ_SCHEDULE = '*/30 * * * * *' + + public static QUEUE_MBLOCK = 'mblock' + mblockQueue: QueueServer + mblockClient: QueueClient + + constructor() {} + + private readonly QUEUE_REPLY_PAGE_SIZE = 10 + private readonly CLIENT_REQUEST_PER_SCHEDULED_JOB = 10 + + // client -> queue -?-> channelService -> table <------- client + public async postConstruct() { + this.log.debug('postConstruct') + this.mblockClient = new QueueClient(this.storageNode, QueueManager.QUEUE_MBLOCK) + await this.initClientForEveryQueueForEveryValidator([QueueManager.QUEUE_MBLOCK]) + const qs = this + schedule.scheduleJob(this.CLIENT_READ_SCHEDULE, async function () { + const dbgPrefix = 'PollRemoteQueue' + try { + await qs.mblockClient.pollRemoteQueue(qs.CLIENT_REQUEST_PER_SCHEDULED_JOB) + qs.log.info(`CRON %s started`, dbgPrefix); + } catch (err) { + qs.log.error(`CRON %s failed %o`, dbgPrefix, err); + } finally { + qs.log.info(`CRON %s finished`, dbgPrefix); + } + }) + } + + // updates the dset_client table used for queries according to the contract data + private async initClientForEveryQueueForEveryValidator(queueNames:string[]) { + const nodeId = this.contractState.nodeId + const allValidators = this.contractState.getAllValidatorsExceptSelf() + for (const queueName of queueNames) { + for (const nodeInfo of allValidators) { + const targetNodeId = nodeInfo.nodeId + const targetNodeUrl = nodeInfo.url + const targetState = ValidatorContractState.isEnabled(nodeInfo) ? 1 : 0 + await MySqlUtil.insert( + `INSERT INTO dset_client (queue_name, target_node_id, target_node_url, target_offset, state) + VALUES (?, ?, ?, 0, ?) + ON DUPLICATE KEY UPDATE target_node_url=?, + state=?`, + queueName, + targetNodeId, + targetNodeUrl, + targetState, + targetNodeUrl, + targetState + ) + const targetOffset = await MySqlUtil.queryOneValue( + `SELECT target_offset + FROM dset_client + where queue_name = ? + and target_node_id = ?`, + queueName, + targetNodeId + ) + this.log.info( + 'client polls (%s) queue: %s node: %s from offset: %d ', + targetState, + queueName, + targetNodeId, + targetOffset + ) + } + } + } + + public getQueue(queueName: string): QueueServer { + if (queueName == 'subscribers') { + return this.mblockQueue + } + throw new Error('invalid queue') + } + + public async getQueueLastOffset(queueName: string): Promise { + const lastOffset = await this.getQueue(queueName).getLastOffset() + return { result: lastOffset } + } + + public async readItems(dsetName: string, firstOffset: number){ + const q = this.getQueue(dsetName) + return await q.readWithLastOffset(firstOffset); + } + + public async pollRemoteQueues(): Promise { + const result = await this.mblockClient.pollRemoteQueue(1) + return result + } +} + + diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 0e7cabe..715c71e 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -1,71 +1,80 @@ -import {Inject, Service} from 'typedi' -import {ValidatorContract} from "./validatorContract"; +import {Service, Container, Inject} from 'typedi' +import config from '../../config' +import StrUtil from "../../utilz/strUtil"; +import {ValidatorContractState} from "../messaging-common/validatorContractState"; import {Logger} from "winston"; -import {FeedItemSig, FPayload, MessageBlock, NetworkRole} from "./messageBlock"; +import {FPayload, MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; +import {QueueClient} from "../messaging-dset/queueClient"; +import {Consumer, QItem} from "../messaging-dset/queueTypes"; +import {BlockStorage} from "./BlockStorage"; +import {QueueManager} from "./queueManager"; +import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Check} from "../../utilz/check"; +import {WinstonUtil} from "../../utilz/winstonUtil"; +import DateUtil from "../../utilz/dateUtil"; import DbHelper from "../../helpers/dbHelper"; -import {DateUtil, StrUtil} from "dstorage-common"; -import {EthSig} from "../../utilz/ethSig"; + @Service() -export default class StorageNode { +export default class StorageNode implements Consumer { + public log: Logger = WinstonUtil.newLog(StorageNode) @Inject() - private contract: ValidatorContract; + private contract: ValidatorContractState; + + @Inject(type => QueueManager) + private queueManager: QueueManager; - @Inject('logger') - private log: Logger; + @Inject() + private blockStorage: BlockStorage; + + private client: QueueClient; public async postConstruct() { + // MySqlUtil.init(dbHelper.pool); todo postgres !!!!!!!!!!!!!! await this.contract.postConstruct(); + await this.queueManager.postConstruct(); } - // todo move to common - public checkBlock(block: MessageBlock): CheckResult { - if (block.requests.length != block.responses.length) { - return CheckResult.failWithText(`message block has incorrect length ${block.requests.length}!=${block.responses.length}`); + // remote queue handler + async accept(item: QItem): Promise { + // check hash + let mb = item.object; + Check.notEmpty(mb.id, 'message block has no id'); + let calculatedHash = MessageBlockUtil.calculateHash(mb); + if (calculatedHash !== item.object_hash) { + this.log.error('received item hash=%s , ' + + 'which differs from calculatedHash=%s, ' + + 'ignoring the block because producer calculated the hash incorrectly', + item.object_hash, calculatedHash); + return false; } - let blockValidatorNodeId = null; - let item0sig0 = block.responsesSignatures[0][0]; - if (item0sig0?.nodeMeta.role != NetworkRole.VALIDATOR - || StrUtil.isEmpty(item0sig0?.nodeMeta.nodeId)) { - return CheckResult.failWithText('first signature is not performed by a validator'); + // check contents + // since this check is not for historical data, but for realtime data, + // so we do not care about old blocked validators which might occur in the historical queue + let activeValidators = CollectionUtil.arrayToFields(this.contract.getActiveValidators(), 'nodeId'); + let check1 = MessageBlockUtil.checkBlock(mb, activeValidators); + if (!check1.success) { + this.log.error('item validation failed: ', check1.err); + return false; } - let result: FeedItemSig[] = []; - for (let i = 0; i < block.responses.length; i++) { - let payloadItem = block.requests[i]; - let feedItem = block.responses[i]; - // check signatures - let feedItemSignatures = block.responsesSignatures[i]; - for (let j = 0; j < feedItemSignatures.length; j++) { - let fiSig = feedItemSignatures[j]; - if (j == 0) { - if (fiSig.nodeMeta.role != NetworkRole.VALIDATOR) { - return CheckResult.failWithText(`First signature on a feed item should be ${NetworkRole.VALIDATOR}`); - } - } else { - if (fiSig.nodeMeta.role != NetworkRole.ATTESTER) { - return CheckResult.failWithText(`2+ signature on a feed item should be ${NetworkRole.ATTESTER}`); - } - } - const valid = EthSig.check(fiSig.signature, fiSig.nodeMeta.nodeId, fiSig.nodeMeta, feedItem); - if (!valid) { - return CheckResult.failWithText(`signature is not valid`); - } else { - this.log.debug('valid signature %o', fiSig); - } - const validNodeId = this.contract.isActiveValidator(fiSig.nodeMeta.nodeId); - if (!validNodeId) { - return CheckResult.failWithText(`${fiSig.nodeMeta.nodeId} is not a valid nodeId from a contract`); - } else { - this.log.debug('valid nodeId %o', fiSig.nodeMeta.nodeId); - } - } + // check database + let isNew = await this.blockStorage.accept(item); + if(!isNew) { + // this is not an error, because we read duplicates from every validator + this.log.debug('block %s already exists ', mb.id); + return false; } - return CheckResult.ok(); + // send block + await this.unpackBlock(mb); } + // sends the block contents (internal messages from every response) // to every recipient's inbox public async unpackBlock(mb: MessageBlock) { + // todo calculate shard + + let now = Date.now() / 1000; let nowStr = now + ''; const currentNodeId = this.contract.nodeId; @@ -111,7 +120,7 @@ export default class StorageNode { const dateYYYYMM = DateUtil.formatYYYYMM(date); const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, shardId, - monthStart, monthEndExclusive, tableName); + monthStart, monthEndExclusive, tableName); if (recordCreated) { this.log.debug('record created: ', recordCreated) // we've added a new record to node_storage_layout => we can safely try to create a table @@ -124,25 +133,8 @@ export default class StorageNode { } var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, - ts, key, JSON.stringify(fpayload)); + ts, key, JSON.stringify(fpayload)); this.log.debug(`found value: ${storageValue}`) this.log.debug('success is ' + success); } -} - -class CheckResult { - success: boolean; - err: string; - - - static failWithText(err: string): CheckResult { - return {success: false, err: err} - } - - static ok(): CheckResult { - return {success: true, err: ''} - } - -} - - +} \ No newline at end of file diff --git a/snode/src/services/messaging/validatorContract.ts b/snode/src/services/messaging/validatorContract.ts deleted file mode 100644 index 4c894ce..0000000 --- a/snode/src/services/messaging/validatorContract.ts +++ /dev/null @@ -1,261 +0,0 @@ -import {Inject, Service} from "typedi"; -import {Contract, ethers, Signer, Wallet} from "ethers"; -import fs, {readFileSync} from "fs"; -import path from "path"; -import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; -import {log} from "winston"; -import {Logger} from "winston"; -import {StrUtil, EnvLoader} from "dstorage-common"; - - -/* -Validator contract abstraction. -All blockchain goes here - */ -@Service() -export class ValidatorContract { - nodeId: string; - wallet: Wallet; - - @Inject('logger') - private log: Logger; - - private contractFactory: ContractClientFactory; - public contractCli: ValidatorCtClient; - - public async postConstruct() { - this.log.info("ValidatorContract.postConstruct()"); - this.contractFactory = new ContractClientFactory(); - this.contractCli = await this.contractFactory.buildRWClient(this.log); - await this.contractCli.connect(); - this.log.info("loaded %o ", this.contractCli.nodeMap); - this.wallet = this.contractFactory.nodeWallet; - this.nodeId = this.wallet.address; - if (!this.wallet) throw new Error("wallet is not loaded"); - if (this.contractCli.nodeMap == null) throw new Error("Nodes are not initialized"); - } - - public isActiveValidator(nodeId: string): boolean { - let vi = this.contractCli.nodeMap.get(nodeId); - return vi != null; - } - - public getAllNodesMap(): Map { - return this.contractCli.nodeMap; - } - - public getAllValidators(): NodeInfo[] { - let allNodes = Array.from(this.getAllNodesMap().values()); - let onlyGoodValidators = allNodes.filter(ni => ni.nodeType == NodeType.VNode && - (ni.nodeStatus == NodeStatus.OK - || ni.nodeStatus == NodeStatus.Reported - || ni.nodeStatus == NodeStatus.Slashed)) - return onlyGoodValidators; - } -} - - -class ContractClientFactory { - private validatorCtAddr: string; - private provider: JsonRpcProvider; - private abi: string; - private pushTokenAddr: string; - private validatorRpcEndpoint: string; - private validatorRpcNetwork: number; - private configDir: string; - nodeWallet: Wallet; - // private nodeWallet: Signer; - private validatorPrivateKeyFile: string; - private validatorPrivateKeyPass: string; - private nodeAddress: string; - - constructor() { - this.validatorCtAddr = EnvLoader.getPropertyOrFail("VALIDATOR_CONTRACT_ADDRESS"); - this.pushTokenAddr = EnvLoader.getPropertyOrFail("VALIDATOR_PUSH_TOKEN_ADDRESS"); - this.validatorRpcEndpoint = EnvLoader.getPropertyOrFail("VALIDATOR_RPC_ENDPOINT"); - this.validatorRpcNetwork = Number.parseInt(EnvLoader.getPropertyOrFail("VALIDATOR_RPC_NETWORK")); - this.provider = new ethers.providers.JsonRpcProvider(this.validatorRpcEndpoint, this.validatorRpcNetwork); - this.configDir = EnvLoader.getPropertyOrFail("CONFIG_DIR"); - this.abi = ContractClientFactory.loadValidatorContractAbi(this.configDir, "ValidatorV1.json"); - } - - private static loadValidatorContractAbi(configDir: string, fileNameInConfigDir: string): string { - const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); - const file = fs.readFileSync(fileAbsolute, "utf8") - const json = JSON.parse(file) - const abi = json.abi - console.log(`abi size:`, abi.length) - return abi - } - - // creates a client which can only read blockchain state - public async buildROClient(log: Logger): Promise { - const contract = new ethers.Contract(this.validatorCtAddr, this.abi, this.provider); - return new ValidatorCtClient(contract, log); - } - - // creates a client, using an encrypted private key from disk, so that we could write to the blockchain - public async buildRWClient(log: Logger): Promise { - this.validatorPrivateKeyFile = EnvLoader.getPropertyOrFail("VALIDATOR_PRIVATE_KEY_FILE"); - this.validatorPrivateKeyPass = EnvLoader.getPropertyOrFail("VALIDATOR_PRIVATE_KEY_PASS"); - - let jsonFile = readFileSync(this.configDir + "/" + this.validatorPrivateKeyFile, 'utf-8'); - this.nodeWallet = await Wallet.fromEncryptedJson(jsonFile, this.validatorPrivateKeyPass); - this.nodeAddress = await this.nodeWallet.getAddress(); - - const signer = this.nodeWallet.connect(this.provider) - const contract = new ethers.Contract(this.validatorCtAddr, this.abi, signer); - return new ValidatorCtClient(contract, log); - } -} - - -// all Validator contract interactions are wrapped into this class -export class ValidatorCtClient { - contract: Contract; - private log: Logger; - - // contract state - nodeMap: Map = new Map(); - public attestersRequired: number; - public nodeRandomMinCount: number; - public nodeRandomPingCount: number; - - - constructor(contract: ethers.Contract, log: Logger) { - this.contract = contract; - this.log = log; - } - - private async loadConstants() { - { - this.attestersRequired = await this.contract.attestersRequired(); - this.log.info(`attestersRequired=${this.attestersRequired}`); - if (this.attestersRequired == null) { - throw new Error('attestersRequired is undefined'); - } - this.contract.on("AttestersRequiredUpdated", - (value: number) => { - this.attestersRequired = value; - this.log.info(`attestersRequired=${this.attestersRequired}`); - }); - } - - { - this.nodeRandomMinCount = await this.contract.nodeRandomMinCount(); - this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`); - if (this.nodeRandomMinCount == null) { - throw new Error('nodeRandomMinCount is undefined'); - } - this.contract.on("NodeRandomMinCountUpdated", - (value: number) => { - this.nodeRandomMinCount = value; - this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`); - }); - } - - { - this.nodeRandomPingCount = await this.contract.nodeRandomPingCount(); - this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`); - if (this.nodeRandomPingCount == null) { - throw new Error('nodeRandomPingCount is undefined'); - } - this.contract.on("NodeRandomPingCountUpdated", - (value: number) => { - this.nodeRandomPingCount = value; - this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`); - }); - } - } - - async connect() { - await this.loadConstants(); - let result = this.loadNodesFromEnv(); - if (result != null) { - // we have a debug variable set; no need to do blockchain - this.nodeMap = result; - return; - } - const nodeAddresses = await this.contract.getNodes(); - for (const nodeAddress of nodeAddresses) { - let ctObj = await this.contract.getNodeInfo(nodeAddress); - this.nodeMap.set(ctObj.nodeWallet, - new NodeInfo(ctObj.nodeWallet, ctObj.nodeApiBaseUrl, ctObj.nodeType, NodeStatus.OK)); - } - this.log.info('contract nodes loaded %o', this.nodeMap); - - - this.contract.on("NodeAdded", - (ownerWallet: string, nodeWallet: string, nodeType: number, nodeTokens: number, - nodeApiBaseUrl: string) => { - this.log.info("NodeAdded %o", arguments) - this.log.info("NodeAdded %s %s %s %s %s", ownerWallet, nodeWallet, nodeType, nodeTokens, nodeApiBaseUrl); - this.nodeMap.set(nodeWallet, new NodeInfo(nodeWallet, nodeApiBaseUrl, nodeType, NodeStatus.OK)); - this.log.info("ValidatorMap: %o", this.nodeMap); - }); - - this.contract.on("NodeStatusChanged", - (nodeWallet: string, nodeStatus: number, nodeTokens: number) => { - this.log.info("NodeStatusChanged", arguments) - this.log.info("NodeStatusChanged", nodeWallet, nodeStatus, nodeTokens); - let ni = this.nodeMap.get(nodeWallet); - if (ni == null) { - this.log.error(`unknown node ${nodeWallet}`); - return; - } - ni.nodeStatus = nodeStatus; - }); - } - - private loadNodesFromEnv(): Map | null { - let testValidatorsEnv = process.env.VALIDATOR_CONTRACT_TEST_VALIDATORS; - if (testValidatorsEnv) { - // test mode - let testValidators = <{ validators: NodeInfo[] }>JSON.parse(testValidatorsEnv); - let result = new Map(); - for (const vi of testValidators.validators) { - vi.nodeId = StrUtil.normalizeEthAddress(vi.nodeId); - result.set(vi.nodeId, vi); - } - return result; - } else { - return null; - } - } -} - - -// from smart contract -export enum NodeStatus { - OK, - Reported, - Slashed, - BannedAndUnstaked, - Unstaked -} - -export class NodeInfo { - nodeId: string; - url: string; - nodeType: NodeType; - nodeStatus: NodeStatus; - - - constructor(nodeId: string, url: string, nodeType: NodeType, nodeStatus: NodeStatus) { - this.nodeId = nodeId; - this.url = url; - this.nodeType = nodeType; - this.nodeStatus = nodeStatus; - } - - static isValidValidator(ni: NodeInfo): boolean { - return ni != null && !StrUtil.isEmpty(ni.url) && ni.nodeType == NodeType.VNode && - (ni.nodeStatus == NodeStatus.OK || ni.nodeStatus == NodeStatus.Reported || ni.nodeStatus == NodeStatus.Slashed) - } -} - -export enum NodeType { - VNode = 0, // validator 0 - SNode = 1, // storage 1 - DNode = 2 // delivery 2 -} diff --git a/snode/src/utilz/EthUtil.ts b/snode/src/utilz/EthUtil.ts new file mode 100644 index 0000000..5665d8b --- /dev/null +++ b/snode/src/utilz/EthUtil.ts @@ -0,0 +1,35 @@ +import StrUtil from './strUtil' + +export class EthUtil { + static parseCaipAddress(addressinCAIP: string): CaipAddr | null { + if (StrUtil.isEmpty(addressinCAIP)) { + return null + } + const addressComponent = addressinCAIP.split(':') + if (addressComponent.length === 3) { + return { + namespace: addressComponent[0], + chainId: addressComponent[1], + addr: addressComponent[2] + } + } else if (addressComponent.length === 2) { + return { + namespace: addressComponent[0], + chainId: null, + addr: addressComponent[1] + } + } else { + return null + } + } +} + +// ex: eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681 +export class CaipAddr { + // ex: eip155 + namespace: string + // ex: 5 + chainId: string | null + // ex: 0xD8634C39BBFd4033c0d3289C4515275102423681 + addr: string +} diff --git a/snode/src/utilz/bitUtil.ts b/snode/src/utilz/bitUtil.ts new file mode 100644 index 0000000..57f9c61 --- /dev/null +++ b/snode/src/utilz/bitUtil.ts @@ -0,0 +1,39 @@ +export class BitUtil { + /** + * XORs 2 buffers, byte by byte: src = src XOR add + * 1 modifies src + * 2 returns srs || src's resized copy in case there is no room for add bytes + * + * @param src + * @param add + */ + public static xor(src: Buffer, add: Buffer): Buffer { + if (src == null && add == null) { + return Buffer.alloc(0) + } else if (add == null) { + return src + } else if (src == null) { + src = new Buffer(add.length) + add.copy(src, 0, 0, add.length) + return src + } + let target = src + if (add.length > src.length) { + target = new Buffer(add.length) + src.copy(target, 0, 0, src.length) + } + var length = Math.min(target.length, add.length) + for (var i = 0; i < length; ++i) { + target[i] = target[i] ^ add[i] + } + return target + } + + public static strToBase64(value: string): string { + return Buffer.from(value).toString('base64') + } + + public static base64ToStr(value: string): string { + return Buffer.from(value, 'base64').toString('utf8') + } +} diff --git a/snode/src/utilz/check.ts b/snode/src/utilz/check.ts new file mode 100644 index 0000000..7368fda --- /dev/null +++ b/snode/src/utilz/check.ts @@ -0,0 +1,27 @@ +import StrUtil from './strUtil' + +export class Check { + public static isTrue(condition: any, err?: string) { + if (!condition) { + throw new Error(StrUtil.isEmpty(err) ? 'Assertion failed' : err) + } + } + + public static notNull(condition: any, err?: string) { + if (condition == null) { + throw new Error(StrUtil.isEmpty(err) ? 'Null check failed' : err) + } + } + + public static notEmpty(value: string, err?: string) { + if (StrUtil.isEmpty(value)) { + throw new Error(StrUtil.isEmpty(err) ? 'Str empty check failed' : err) + } + } + + public static notEmptyArr(value: any[], err?: string) { + if (value == null || value.length == 0) { + throw new Error(StrUtil.isEmpty(err) ? 'Str empty check failed' : err) + } + } +} diff --git a/snode/src/utilz/collectionUtil.ts b/snode/src/utilz/collectionUtil.ts new file mode 100644 index 0000000..59b8b43 --- /dev/null +++ b/snode/src/utilz/collectionUtil.ts @@ -0,0 +1,28 @@ +export class CollectionUtil { + public static arrayToMap(arr: V[], keyField: K): Map { + if (arr == null || arr.length == 0) { + return new Map() + } + return new Map(arr.map((value) => [value[keyField], value])) + } + + public static arrayToSet(arr: V[]): Set { + return new Set(arr) + } + + public static arrayToFields(arr: V[], keyField: K): Set { + const arrayOfFields = arr.map((obj) => obj[keyField]) + return new Set(arrayOfFields) + } + + public static findIndex(arr: V[], filter: (item: V) => boolean): number { + if (arr == null) { + return -1 + } + return arr.findIndex(filter) + } + + public static setToArray(set: Set): V[] { + return Array.from(set.keys()) + } +} diff --git a/snode/src/utilz/dateUtil.ts b/snode/src/utilz/dateUtil.ts new file mode 100644 index 0000000..efe67bd --- /dev/null +++ b/snode/src/utilz/dateUtil.ts @@ -0,0 +1,55 @@ +import { DateTime } from 'ts-luxon' + +export default class DateUtil { + public static formatYYYYMMDD(yearValue: number, monthValue: number, dayValue: number): string { + return DateTime.fromObject({ year: yearValue, month: monthValue, day: dayValue }).toFormat( + 'yyyyMMdd' + ) + } + + public static formatYYYYMMDDEx(dt: DateTime): string { + return dt.toFormat('yyyyMMdd') + } + + public static formatYYYYMM(dt: DateTime): string { + return dt.toFormat('yyyyMM') + } + + public static buildDateTime(yearValue: number, monthValue: number, dayValue: number): DateTime { + return DateTime.fromObject({ year: yearValue, month: monthValue, day: dayValue }) + } + + // example: 1661214142.000000 + public static parseUnixFloatAsDouble(timestamp: string): number { + return Number.parseFloat(timestamp) + } + + // example: 1661214142 + public static parseUnixFloatAsInt(timestamp: string): number { + return Math.floor(Number.parseFloat(timestamp)) + } + + public static parseUnixFloatAsDateTime(timestamp: string): DateTime { + return DateTime.fromMillis(Number.parseFloat(timestamp) * 1000) + } + + public static dateTimeToUnixFloat(dt: DateTime): number { + return dt.toMillis() / 1000.0 + } + + public static currentTimeMillis(): number { + return new Date().getTime() + } + + public static currentTimeSeconds(): number { + return Math.round(new Date().getTime() / 1000) + } + + public static millisToDate(timestamp: number): Date { + return new Date(timestamp) + } + + public static millisToUnixSeconds(timestamp: number): number { + return Math.round(timestamp / 1000) + } +} diff --git a/snode/src/utilz/envLoader.ts b/snode/src/utilz/envLoader.ts new file mode 100644 index 0000000..17d3112 --- /dev/null +++ b/snode/src/utilz/envLoader.ts @@ -0,0 +1,26 @@ +import dotenv from 'dotenv' +import StrUtil from './strUtil' + +export class EnvLoader { + public static loadEnvOrFail() { + const envFound = dotenv.config() + if (envFound.error) { + // This error should crash whole process + throw new Error("⚠️ Couldn't find .env file ⚠️") + } + } + + public static getPropertyOrFail(propName: string): string { + const val = process.env[propName] + if (StrUtil.isEmpty(val)) { + throw new Error(`process.env.${propName} is empty`) + } + return val + } + + // for undefined: defaults to false + public static getPropertyAsBool(propName: string): boolean { + const val = process.env[propName] + return val != null && val.toLowerCase() === 'true' + } +} diff --git a/snode/src/utilz/ethSig.ts b/snode/src/utilz/ethSig.ts index af557bb..be11cd9 100644 --- a/snode/src/utilz/ethSig.ts +++ b/snode/src/utilz/ethSig.ts @@ -1,6 +1,4 @@ import {Wallet} from "ethers"; -import {Logger} from "winston"; -import {Container} from "typedi"; import {verifyMessage} from "ethers/lib/utils"; import {ObjectHasher} from "./objectHasher"; @@ -14,19 +12,23 @@ import {ObjectHasher} from "./objectHasher"; export class EthSig { public static async create(wallet: Wallet, ...object: any[]): Promise { - let ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); - let sig = await wallet.signMessage(ethMessage); + const ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); + const sig = await wallet.signMessage(ethMessage); return sig; } public static check(sig: string, targetWallet: string, ...object: any[]): boolean { - let ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); - let verificationAddress = verifyMessage(ethMessage, sig); + const ethMessage = ObjectHasher.hashToSha256IgnoreSig(object); + const verificationAddress = verifyMessage(ethMessage, sig); if (targetWallet !== verificationAddress) { return false; } return true; } + + public static isEthZero(addr: string) { + return '0x0000000000000000000000000000000000000000' === addr + } } export function Signed(target: Function) { diff --git a/snode/src/utilz/expressUtil.ts b/snode/src/utilz/expressUtil.ts new file mode 100644 index 0000000..dd8e671 --- /dev/null +++ b/snode/src/utilz/expressUtil.ts @@ -0,0 +1,20 @@ +import { NextFunction, Request, Response } from 'express' +import { WinstonUtil } from './winstonUtil' + +export class ExpressUtil { + static log = WinstonUtil.newLog('http') + + static handle(req: Request, res: Response, next: NextFunction) { + ExpressUtil.log.debug( + `>> Calling %s %s %o with body: %o`, + req.method, + req.url, + req.params, + req.body + ) + res.on('finish', function () { + ExpressUtil.log.debug(`<< Reply ${res.statusCode} with body: %s`, res.statusMessage) + }) + next() + } +} diff --git a/snode/src/utilz/idUtil.ts b/snode/src/utilz/idUtil.ts new file mode 100755 index 0000000..17f32cb --- /dev/null +++ b/snode/src/utilz/idUtil.ts @@ -0,0 +1,8 @@ +import * as uuid from "uuid"; + +export default class IdUtil { + + public static getUuidV4(): string { + return uuid.v4(); + } +} \ No newline at end of file diff --git a/snode/src/utilz/mySqlUtil.ts b/snode/src/utilz/mySqlUtil.ts new file mode 100644 index 0000000..30621b2 --- /dev/null +++ b/snode/src/utilz/mySqlUtil.ts @@ -0,0 +1,137 @@ +import { Logger } from 'winston' +import { OkPacket, Pool } from 'mysql' +import { WinstonUtil } from './winstonUtil' +import { EnvLoader } from './envLoader' + +/* + A sync replacement of db.query callback-y code + + public async sendSpamEvent(payload_id) { + const query = `select sender from feeds WHERE payload_id=?` + return await new Promise((resolve, reject) => { + db.query(query, [payload_id], function (err, results) { + if (err) { + logger.error(err) + reject(err) + } else { + if (results.length > 0) { + const sender = results[0].sender + const feed = { + payload_id: payload_id, + sender: sender, + } + resolve(feed) + } else { + resolve({}) + } + } + }) + }).catch((err) => { + logger.error(err) + reject(err) + }) + } + ).catch((err) => { + logger.error(err) + reject(err) + }) + } + + Would look like + + let rows = await MySqlUtil.query<{channel: string, alias: string, subscriber: string, timestamp: string, is_currently_subscribed: string}> + (`select channel, alias, subscriber, timestamp, is_currently_subscribed + from subscribers + where (${channelDbField} = ? AND subscriber = ?)`, + cmd.message.channel, subscriberAddr); + + */ +export class MySqlUtil { + private static log: Logger = WinstonUtil.newLog('mysql') + static logSql = false + static pool: Pool + + public static init(pool: Pool) { + MySqlUtil.pool = pool + if (!MySqlUtil.logSql && EnvLoader.getPropertyAsBool('LOG_SQL_STATEMENTS')) { + pool.on('connection', function (connection) { + connection.on('enqueue', function (sequence) { + // if (sequence instanceof mysql.Sequence.Query) { + if ('Query' === sequence.constructor.name) { + MySqlUtil.log.debug(sequence.sql) + } + }) + }) + MySqlUtil.logSql = true + } + this.log.info('sql statement logging is enabled') + } + + public static async queryOneValueOrDefault( + query: string, + defaultValue: V, + ...sqlArgs: any[] + ): Promise { + const result = await this.queryOneRow(query, ...sqlArgs) + if (result == null) { + return defaultValue + } + const firstPropertyName = Object.entries(result)[0][0] + if (firstPropertyName == null) { + return defaultValue + } + const resultValue = result[firstPropertyName] + if (resultValue == null) { + return defaultValue + } + return resultValue + } + + public static async queryOneValue(query: string, ...sqlArgs: any[]): Promise { + return await this.queryOneValueOrDefault(query, null, ...sqlArgs) + } + + public static async queryOneRow(query: string, ...sqlArgs: any[]): Promise { + const result = await this.queryArr(query, ...sqlArgs) + if (result.length != 1) { + return null + } + return result[0] + } + + public static async queryAnyArr(query: string, ...sqlArgs: any[]): Promise { + return await this.queryArr(query, ...sqlArgs) + } + + public static async update(query: string, ...sqlArgs: any[]): Promise { + const res: any = await this.queryArr(query, ...sqlArgs) + return res + } + + public static async insert(query: string, ...sqlArgs: any[]): Promise { + const res: any = await this.queryArr(query, ...sqlArgs) + return res + } + + public static async queryArr(query: string, ...sqlArgs: any[]): Promise { + return new Promise<[R]>((resolve, reject) => { + MySqlUtil.pool.getConnection(function (err, connection) { + if (err) { + MySqlUtil.log.error(err) + reject(err) + return + } + connection.query(query, sqlArgs, function (err, results) { + connection.release() // always put connection back in pool after last query + if (err) { + MySqlUtil.log.error(err) + reject(err) + return + } + resolve(results) + return + }) + }) + }) + } +} diff --git a/snode/src/utilz/numUtil.ts b/snode/src/utilz/numUtil.ts new file mode 100644 index 0000000..40eb7c9 --- /dev/null +++ b/snode/src/utilz/numUtil.ts @@ -0,0 +1,19 @@ +export class NumUtil { + public static parseInt(val: string | number | null, defaultValue: number): number { + if (val === null) { + return defaultValue + } + const valN = typeof val === 'string' ? Number(val) : val + if (isNaN(valN)) { + return defaultValue + } + return Number.isInteger(valN) ? valN : Math.round(valN) + } + + public static toString(value: number) { + if (value == null) { + return '' + } + return '' + value + } +} diff --git a/snode/src/utilz/objectHasher.ts b/snode/src/utilz/objectHasher.ts index 1d291e5..34e6dc8 100644 --- a/snode/src/utilz/objectHasher.ts +++ b/snode/src/utilz/objectHasher.ts @@ -1,47 +1,45 @@ -const hash = require('object-hash'); +const hash = require('object-hash') /** * Allows to build a consistent hash out of a json object */ export class ObjectHasher { - private static options = { - algorithm: 'sha256', - encoding: 'hex', - respectFunctionProperties: false, // skip functions - respectFunctionNames: false, // skip function names - respectType: false, // skip class info - unorderedArrays: false, // don't sort arrays before hash - unorderedSets: false, // don't sort sets before hash - unorderedObjects: true // sort object properties before hash + private static options = { + algorithm: 'sha256', + encoding: 'hex', + respectFunctionProperties: false, // skip functions + respectFunctionNames: false, // skip function names + respectType: false, // skip class info + unorderedArrays: false, // don't sort arrays before hash + unorderedSets: false, // don't sort sets before hash + unorderedObjects: true // sort object properties before hash + } - }; + // todo Object.assign(target, src) + /** + * Returns hex string + * ex: de5ed3919975ece48c922a6380b59efc8638967ed236e0892164cc17ccfbf87b + * @param obj json object + */ + public static hashToSha256(obj: any): string { + return hash(obj, ObjectHasher.options) + } - // todo Object.assign(target, src) - private static optionsIgnoreSig = { - algorithm: 'sha256', - encoding: 'hex', - respectFunctionProperties: false, // skip functions - respectFunctionNames: false, // skip function names - respectType: false, // skip class info - unorderedArrays: false, // don't sort arrays before hash - unorderedSets: false, // don't sort sets before hash - unorderedObjects: true, // sort object properties before hash - excludeKeys: keyFilterFunction - }; + public static hashToSha256IgnoreSig(obj: any): string { + return hash(obj, { + ...ObjectHasher.options, + excludeKeys: function (propName) { + return 'signature' === propName + } + }) + } - /** - * Returns hex string - * @param obj json object - */ - public static hashToSha256(obj: any): string { - return hash(obj, ObjectHasher.options); - } - - public static hashToSha256IgnoreSig(obj: any): string { - return hash(obj, ObjectHasher.optionsIgnoreSig); - } -} - -function keyFilterFunction(propName) { - return 'signature' === propName; + public static hashToSha256IgnoreRecipientsResolved(obj: any): string { + return hash(obj, { + ...ObjectHasher.options, + excludeKeys: function (propName) { + return 'recipientsResolved' === propName + } + }) + } } diff --git a/snode/src/utilz/pgUtil.ts b/snode/src/utilz/pgUtil.ts new file mode 100644 index 0000000..1690da7 --- /dev/null +++ b/snode/src/utilz/pgUtil.ts @@ -0,0 +1,98 @@ +import {Logger} from 'winston' +import {OkPacket, Pool} from 'mysql' +import {WinstonUtil} from './winstonUtil' +import {EnvLoader} from './envLoader' +import StrUtil from "./strUtil"; +import pg from "pg-promise/typescript/pg-subset"; +import {IDatabase} from "pg-promise"; + + +export class PgUtil { + private static log: Logger = WinstonUtil.newLog('pg') + static logSql = false + static pool:IDatabase<{}, pg.IClient>; // todo unknown type ??? + + public static init(pool:IDatabase<{}, pg.IClient>) { + PgUtil.pool = pool; + if (!PgUtil.logSql && EnvLoader.getPropertyAsBool('LOG_SQL_STATEMENTS')) { + // todo add logging query + values + PgUtil.logSql = true + } + this.log.info('sql statement logging is enabled') + } + + public static async queryOneValueOrDefault( + query: string, + defaultValue: V, + ...sqlArgs: any[] + ): Promise { + const result = await this.queryOneRow(query, ...sqlArgs) + if (result == null) { + return defaultValue + } + const firstPropertyName = Object.entries(result)[0][0] + if (firstPropertyName == null) { + return defaultValue + } + const resultValue = result[firstPropertyName] + if (resultValue == null) { + return defaultValue + } + return resultValue + } + + public static async queryOneValue(query: string, ...sqlArgs: any[]): Promise { + return await this.queryOneValueOrDefault(query, null, ...sqlArgs) + } + + public static async queryOneRow(query: string, ...sqlArgs: any[]): Promise { + const result = await this.queryArr(query, ...sqlArgs) + if (result.length != 1) { + return null + } + return result[0] + } + + public static async queryAnyArr(query: string, ...sqlArgs: any[]): Promise { + return await this.queryArr(query, ...sqlArgs) + } + + public static async update(query: string, ...sqlArgs: any[]): Promise { + query = StrUtil.replaceAllMySqlToPostre(query); + let result = await this.pool.result(query, sqlArgs,r => r.rowCount); + return result; + } + + public static async insert(query: string, ...sqlArgs: any[]): Promise { + query = StrUtil.replaceAllMySqlToPostre(query); + let result = await this.pool.result(query, sqlArgs,r => r.rowCount); + return result; + } + + public static async queryArr(query: string, ...sqlArgs: any[]): Promise { + query = StrUtil.replaceAllMySqlToPostre(query); + let result = await this.pool.query(query, sqlArgs); + return result; + } + +} + +/* +function (err, connection) { + if (err) { + PgUtil.log.error(err) + reject(err) + return + } + connection.query(query, sqlArgs, function (err, results) { + connection.release() // always put connection back in pool after last query + if (err) { + PgUtil.log.error(err) + reject(err) + return + } + resolve(results) + return + }) + } +*/ diff --git a/snode/src/utilz/promiseUtil.ts b/snode/src/utilz/promiseUtil.ts new file mode 100644 index 0000000..a133a64 --- /dev/null +++ b/snode/src/utilz/promiseUtil.ts @@ -0,0 +1,92 @@ +export class PromiseUtil { + + // Waits for all promises to complete + public static allSettled(promises: Promise[]): Promise[]> { + let wrappedPromises = promises.map(p => { + return Promise.resolve(p) + .then( + val => new PromiseResult(PromiseResultType.SUCCESS, val, null), + err => new PromiseResult(PromiseResultType.FAILED, null, err)); + }); + return Promise.all(wrappedPromises); + } + + public static async sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + public static createDeferred(rejectTimeout: number = 0, + resolveTimeout: number = 0): DeferredPromise { + let deferred = new DeferredPromise(); + deferred.promise = new Promise((resolve, reject) => { + deferred.resolve = resolve; + deferred.reject = reject; + }); + if (rejectTimeout > 0) { + setTimeout(function () { + deferred.reject(); + }, rejectTimeout); + } + if (resolveTimeout > 0) { + setTimeout(function () { + deferred.resolve(); + }, resolveTimeout); + } + return deferred; + } + + +} + +export enum PromiseResultType { + FAILED = -1, + RUNNING = 0, + SUCCESS = 1 +} + +export class PromiseResult { + private _status: PromiseResultType = PromiseResultType.RUNNING; + private _val: T; + private _err: any; + + constructor(status: number, val: T, err: any) { + this._status = status; + this._val = val; + this._err = err; + } + + public isFullfilled(): boolean { + return this._status == PromiseResultType.SUCCESS; + } + + public isSuccess(): boolean { + return this._status == PromiseResultType.SUCCESS; + } + + public isRejected(): boolean { + return this._status == PromiseResultType.FAILED; + } + + public isRunning(): boolean { + return this._status == PromiseResultType.RUNNING; + } + + get status(): PromiseResultType { + return this._status; + } + + get val(): T { + return this._val; + } + + get err(): any { + return this._err; + } +} + +export class DeferredPromise { + promise: Promise; + resolve: Function; + reject: Function; +} + diff --git a/snode/src/utilz/strUtil.ts b/snode/src/utilz/strUtil.ts new file mode 100755 index 0000000..b538954 --- /dev/null +++ b/snode/src/utilz/strUtil.ts @@ -0,0 +1,114 @@ +export default class StrUtil { + + public static isEmpty(s: string): boolean { + if (s == null) { + return true; + } + if (typeof s !== 'string') { + return false; + } + return s.length === 0 + } + + public static isHex(s: string): boolean { + if (StrUtil.isEmpty(s)) { + return false; + } + let pattern = /^[A-F0-9]+$/i; + let result = pattern.test(s); + return result; + } + + /** + * Return s if this is not empty, defaultValue otherwise + * @param s + * @param defaultValue + */ + public static getOrDefault(s: string, defaultValue: string) { + return StrUtil.isEmpty(s) ? defaultValue : s; + } + + public static toStringDeep(obj: any): string { + return JSON.stringify(obj, null, 4); + } + + // https://ethereum.stackexchange.com/questions/2045/is-ethereum-wallet-address-case-sensitive + public static normalizeEthAddress(addr: string): string { + return addr; + } + + public static replaceAll(str: string, + find: string[], replace: string[], + regexFlags: string):string { + var gFlag = false + + if (typeof str !== 'string') { + throw new TypeError('`str` parameter must be a string!') + } + + if (!Array.isArray(find)) { + throw new TypeError('`find` parameter must be an array!') + } + + if (!Array.isArray(replace)) { + throw new TypeError('`replace` parameter must be an array!') + } + + if (!find.length || !replace.length) { + throw new Error('`find` and `replace` parameters must not be empty!') + } + + if (find.length !== replace.length) { + throw new Error('`find` and `replace` parameters must be equal in length!') + } + + if (regexFlags) { + if (typeof regexFlags !== 'string') { + throw new TypeError('`regexFlags` parameter must be a string!') + } else if (~regexFlags.indexOf('g')) { + gFlag = true + } else { + regexFlags += 'g' + } + } else { + regexFlags = 'g' + } + + var done = [] + var joined = find.join(')|(') + var regex = new RegExp('(' + joined + ')', regexFlags) + + return str.replace(regex, (match, ...finds) => { + var replaced + + finds.some((found, index) => { + if (found !== undefined) { + if (gFlag) { + replaced = replace[index] + } else if (!~done.indexOf(found)) { + done.push(found) + replaced = replace[index] + } else { + replaced = found + } + + return true + } + }) + + return replaced + }) + } + + /** + * replaces MySql placeholders ? with Postre placehoslers $1 $2 $3 + * example: + * aaaa?bbbb?cccc? => aaaa$1bbbb$2cccc$3 + */ + public static replaceAllMySqlToPostre(s: string): string { + let cnt = 1; + return s.replace(/\?/g, function () { + return `$${cnt++}`; + }); + } +} diff --git a/snode/src/utilz/stringCounter.ts b/snode/src/utilz/stringCounter.ts new file mode 100644 index 0000000..537ab3a --- /dev/null +++ b/snode/src/utilz/stringCounter.ts @@ -0,0 +1,88 @@ +/** + * Holds a mapping of + * 'key' -> COUNTER + * + * i.e. + * 'c' -> 3 + * 'b' -> 2 + * 'a' -> 1 + * + * + * and returns it in ascending/descending order + * + * Each value holds an additional context object, i.e. 'a' -> 1, [ incrementObject1, incrementObject2 ] + * + */ + +export class StringCounter { + map: Map> = new Map>() + + public increment(key: string, contextValue: T = null) { + const holder = this.map.get(key) + if (holder == null) { + this.map.set(key, new ValueHolder(1, contextValue)) + } else { + holder.value++ // using wrapper to avoid get/put + holder.append(contextValue) + } + } + + public getValue(key: string): number { + const holder = this.map.get(key) + return holder == undefined ? null : holder.value + } + + public getValueContext(key: string): T[] { + const holder = this.map.get(key) + return holder == undefined ? null : holder.incrementCtx + } + + public iterateAndSort( + asc: boolean, + callback: (index: number, key: string, count: number, incrementCtx: T[]) => void + ) { + this.sort(asc) + let i = 0 + for (const [key, valueHolder] of this.map) { + callback(i++, key, valueHolder.value, valueHolder.incrementCtx) + } + } + + public getMostFrequentEntry(): ValueHolder { + const sortedMap = this.toSortedMap(false) + for (const [key, valueHolder] of sortedMap.entries()) { + return valueHolder + } + return null + } + + public sort(asc: boolean) { + this.map = this.toSortedMap(asc) + } + + private toSortedMap(asc: boolean) { + const sortedMap = new Map>( + [...this.map].sort((a, b) => { + // a[0] = key, a[1] = value + if (a[1].value == b[1].value) return 0 + if (a[1].value > b[1].value) return asc ? 1 : -1 + if (a[1].value < b[1].value) return asc ? -1 : 1 + }) + ) + return sortedMap + } +} + +export class ValueHolder { + value: number + incrementCtx: V[] = [] + + constructor(value: number, contextValue: V) { + this.value = value + this.incrementCtx.push(contextValue) + } + + append(contextValue: V) { + this.incrementCtx.push(contextValue) + } +} diff --git a/snode/src/utilz/tuple.ts b/snode/src/utilz/tuple.ts new file mode 100644 index 0000000..b0f12b8 --- /dev/null +++ b/snode/src/utilz/tuple.ts @@ -0,0 +1 @@ +type Tuple = [A, undefined?] | [undefined, B]; \ No newline at end of file diff --git a/snode/src/utilz/waitNotify.ts b/snode/src/utilz/waitNotify.ts new file mode 100644 index 0000000..d652d53 --- /dev/null +++ b/snode/src/utilz/waitNotify.ts @@ -0,0 +1,50 @@ +import {EventEmitter} from "events"; + +import IdUtil from "./idUtil"; + +export class WaitNotify { + ee: EventEmitter; + waitMsgIDs = []; + + constructor() { + this.ee = new EventEmitter(); + this.waitMsgIDs = []; + } + + async wait(timeout:number = 0) { + return new Promise((resolve, reject) => { + const msgID = IdUtil.getUuidV4(); + this.waitMsgIDs.push(msgID); + let timeoutId; + this.ee.once(msgID, () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + resolve(); + }); + if (timeout) { + timeoutId = setTimeout(() => { + const delIndex = this.waitMsgIDs.indexOf(msgID); + if (delIndex !== -1) { + this.waitMsgIDs.splice(delIndex, 1); + reject(new Error('wait timeout')); + } + }, timeout); + } + }); + } + + notify() { + this.notifyAll(); + } + + notifyAll() { + while (this.waitMsgIDs.length > 0) { + this.ee.emit(this.waitMsgIDs.shift()); + } + } + + notifyOne() { + this.ee.emit(this.waitMsgIDs.shift()); + } +} \ No newline at end of file diff --git a/snode/src/utilz/winstonUtil.ts b/snode/src/utilz/winstonUtil.ts new file mode 100644 index 0000000..5fcbeba --- /dev/null +++ b/snode/src/utilz/winstonUtil.ts @@ -0,0 +1,168 @@ +import {Format, TransformableInfo} from 'logform' +import {DateTime} from 'ts-luxon' +import winston from 'winston' +import {consoleTransport, jsonLogTransport} from '../loaders/logger' +import StrUtil from './strUtil' +import {EnvLoader} from './envLoader' + +/* +Example usage: +public log: Logger = WinstonUtil.newLog(ValidatorNode); + +This is a hacky class which goal is +1. to create debug.log and error.log with custom text format (format2 in debugFileTransport and errorFileTransport) +2. make as little merge confligs with loaders/logger as possible (format1 in consoleTransport and jsonTransport) +3. provide newLog(name) which allows custom formatting of it's messages in debug.log and error.log + +Details +------- +We combine +winston logger + className + dynamic logger from loaders/logger +to work together +and add 2 new targets +debugFileTransport -> $LOG_DIR/debug.log +errorFileTransport -> $LOG_DIR/error.log + +How is this all wired + +All logs come into +loaders/logger.ts LoggerInstance +it formats in +format1: +18:08:06 info Express loaded +-> consoleTransport (takes format1) (renders as format1) +-> jsonLogTransport (takes format1) (renders as format1) +-> dynamicLoggingTransport (these are progressbars, it toggles on/off console output) +-> debugFileTransport (takes format1) (renders as format2) +-> errorFileTransport (takes format1) (renders as format2) + +Some logs come into newLogger(className) +it formats in format1 + adds className meta field +format1: +18:08:06 info Express loaded +-> consoleTransport (takes format1) (renders as format1) +-> jsonLogTransport (takes format1) (renders as format1) +-> debugFileTransport (takes format1) (renders as format2 with className) +-> errorFileTransport (takes format1) (renders as format2 with className) + +format2: +I 230811 174624 Got alias List (SendMessage) + +format2 with class name: +I 230811 174624 [MyClass] Got alias List (SendMessage) + +*/ +export class WinstonUtil { + private static readonly CLASS_NAME_LENGTH = 23 + + static loggerMap: Map = new Map() + + /* + { "message": "Checking Node Version", "level": "info", "timestamp": "230809 180338", className?: "myClass"} + */ + public static renderFormat2(info: TransformableInfo) { + const {timestamp, level, message, meta} = info + const levelFirstChar = level == null ? '' : level.toUpperCase()[0] + const date = DateTime.now() + const formattedDate = date.toFormat('yyMMdd HHmmss') + const className = info.className + let formattedClassName: string + if (StrUtil.isEmpty(className)) { + formattedClassName = ' ' + } else { + formattedClassName = (' [' + className.substring(0, this.CLASS_NAME_LENGTH) + '] ').padEnd( + this.CLASS_NAME_LENGTH + 4 + ) + } + const metaAsString = meta == null ? '' : meta + return `${levelFirstChar} ${formattedDate}${formattedClassName}${message} ${metaAsString}` + } + + static createFormat1WhichSetsClassName(className: string | null): Format { + return winston.format.combine( + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss' + }), + winston.format.errors({stack: true}), + winston.format.splat(), + winston.format.json(), + winston.format.printf((info) => { + info['className'] = className + return '' + }) + ) + } + + static createFormat2WhichRendersClassName(): Format { + return winston.format.combine( + winston.format.errors({stack: true}), + winston.format.splat(), + winston.format.printf((info) => { + return WinstonUtil.renderFormat2(info) + }) + ) + } + + public static debugFileTransport = new winston.transports.File({ + level: 'debug', + filename: `${EnvLoader.getPropertyOrFail('LOG_DIR')}/debug.log`, + handleExceptions: true, + json: false, + maxsize: 5242880, + maxFiles: 5, + colorize: false, + tailable: true, + format: WinstonUtil.createFormat2WhichRendersClassName() + }) + + public static errorFileTransport = new winston.transports.File({ + level: 'error', + filename: `${EnvLoader.getPropertyOrFail('LOG_DIR')}/error.log`, + handleExceptions: true, + json: false, + maxsize: 5242880, + maxFiles: 5, + colorize: false, + tailable: true, + format: WinstonUtil.createFormat2WhichRendersClassName() + }) + + public static newLog(classNameOrClass: string | { name: string }): winston.Logger { + let loggerName = null + if (typeof classNameOrClass === 'string') { + loggerName = classNameOrClass + } else if (!StrUtil.isEmpty(classNameOrClass?.name)) { + loggerName = classNameOrClass?.name + } + loggerName = + loggerName == null ? null : loggerName.toString().substring(0, this.CLASS_NAME_LENGTH) + let loggerObj = WinstonUtil.loggerMap.get(loggerName) + if (loggerObj != null) { + return loggerObj + } + const logLevel = EnvLoader.getPropertyOrFail('LOG_LEVEL'); + const transports = []; + if (consoleTransport != null) { + transports.push(consoleTransport); + } else { + const console = new winston.transports.Console({ + format: WinstonUtil.createFormat2WhichRendersClassName() + }); + transports.push(console); + } + if (jsonLogTransport != null) { + transports.push(jsonLogTransport); + } + /*transports.push([ + this.debugFileTransport, // formats a class name from the log object + this.errorFileTransport // formats a class name from the log object + ]);*/ + loggerObj = winston.createLogger({ + level: logLevel, + format: this.createFormat1WhichSetsClassName(loggerName), // puts a class name into the log object + formats in loaders/logger format + transports: transports + }) + WinstonUtil.loggerMap.set(loggerName, loggerObj) + return loggerObj + } +} diff --git a/snode/tests/DbHelper.test.ts b/snode/tests/DbHelper.test.ts index 89c5bd8..81c26c4 100755 --- a/snode/tests/DbHelper.test.ts +++ b/snode/tests/DbHelper.test.ts @@ -1,6 +1,8 @@ import chai from 'chai' import 'mocha' import DbHelper from '../src/helpers/dbHelper' +import {Container} from "node-docker-api/lib/container"; +import {filter} from "lodash"; chai.should() const crypto = require("crypto"); diff --git a/vnode/src/loaders/dbService.ts b/vnode/src/loaders/dbService.ts index 78ef8af..dfdb0ea 100644 --- a/vnode/src/loaders/dbService.ts +++ b/vnode/src/loaders/dbService.ts @@ -1,4 +1,3 @@ -import config from '../config'; import {Injectable, Logger} from "@nestjs/common"; import {IDatabase} from "pg-promise"; const {DateTime} = require("luxon"); From 74dc418dac226431c4bf9b4e30921b7a88771e92 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 31 Aug 2023 21:33:09 +0400 Subject: [PATCH 25/84] add: Storage.sol (1) --- smart-contracts/contracts/Storage.sol | 391 ++++++++++++++++++++++++++ smart-contracts/test/Storage.test.ts | 46 +++ 2 files changed, 437 insertions(+) create mode 100644 smart-contracts/contracts/Storage.sol create mode 100644 smart-contracts/test/Storage.test.ts diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol new file mode 100644 index 0000000..be47afc --- /dev/null +++ b/smart-contracts/contracts/Storage.sol @@ -0,0 +1,391 @@ +//SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; +import "hardhat/console.sol"; // todo remove + +/* + + +Goal: +support workflows like this + +a node n1 joins a cluster, where every node is responsible for X vshards of data +we have M amount of vshards at the start (a predefined value) + +the algorithm should ensure that +- a network maintains exactly [replication factor] amount of chunks in total on all nodes +- if a node joins/leaves the data is re-distributed +- replication factor can change - it go up (no more than # of nodes in total) and go down to 1 +- re-distribution should affect the least amount of nodes possible +- re-distribution should favor grabbing fresh shards instead of old ones (assigned to the node a long time ago) +- difference between node with most vshards and least vshards should stay as close to ±1 as possible + +Re-sharding works like this: + +maxshards = 6 , shard is a data range hosted by a node in the db, +rf = 1, replication factor - how many copies should be there on different nodes, +nodes = 1, node count + + +shuffle() ---> shardCount=10 rf=1 nodeCount=1 +map after: Map(1) { 1 => Set(10) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } } + +shuffle() ---> shardCount=10 rf=1 nodeCount=2 +map after: Map(2) { + 1 => Set(5) { 1, 2, 3, 4, 5 }, + 2 => Set(5) { 10, 9, 8, 7, 6 } +} + +shuffle() ---> shardCount=10 rf=2 nodeCount=3 +map after: Map(3) { + 1 => Set(7) { 1, 2, 3, 4, 5, 6, 8 }, + 2 => Set(6) { 10, 9, 8, 7, 6, 5 }, + 3 => Set(7) { 1, 2, 3, 4, 7, 9, 10 } +} + + + +TODO ? use bitmaps for storing subscriptions + use uint128 data type https://github.com/ethereum/solidity-examples/blob/master/src/bits/Bits.sol + +*/ +contract StorageV1 { + // node address -> nodeId (short address) + // ex: 0xAAAAAAAAA -> 1 + mapping(address => uint8) public mapAddrToNodeId; + + // number of shards; + // this value should not change after deploy + // also this should match data type in mapNodeToShards (uint32/64/128/256) + uint8 public constant SHARD_COUNT = 32; + + uint8 public constant SET_ON = 1; // for set we use uint8(1) as on, and uint8(0) as off + uint8 public constant SET_OFF = 0; + uint8 public constant NULL_SHARD = 255; // shard id that does not exists + uint8 public constant MAX_NODE_ID = 254; // max nod + + // replication factor - how many copies of the same shard should be served by the network + // dynamic, + // ex: 1....20 + uint8 public rf = 1; + + // active nodeIds + // nodeIds are 1-based + // ex: [1,2,3] + uint8[] public nodeList; + + // nodeId -> shards + // shards are 0-based + // ex: 1 -> 0,1,2 + mapping(uint8 => uint32) public mapNodeToShards; + + uint8 private unusedNodeId = 1; + + + struct NodeDesc { + uint8 node; + uint8 shardCount; + } + + event SNodeMappingChanged(uint8[] nodeList); + + function nodeListLength() public view returns (uint8) { + return nodeList.length; + } + + function bit(uint32 self, uint8 index) internal pure returns (uint8) { + return uint8(self >> index & 1); + } + + function setBit(uint32 self, uint8 index) internal pure returns (uint32) { + return self | uint32(1) << index; + } + + // todo add staking (or merge with Validator code) + function addNodeAndStake(address nodeAddress) public returns (uint8) { + require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); + require(unusedNodeId > 0, 'nodeId > 0'); + mapAddrToNodeId[nodeAddress] = SET_ON; + nodeList.push(unusedNodeId); + shuffle(); + return unusedNodeId++; + } + + function removeNode(address nodeAddress) public { + uint8 nodeId = mapAddrToNodeId[nodeAddress]; + if (nodeId == 0) { + revert('no address found'); + } + if (nodeList.length == 0) { + // mapping exists, but node has no short id + delete mapAddrToNodeId[nodeAddress]; + revert('no node id found'); + } + // valid nodeId ; filter it out; don't shrink the storage array because it's expensive + nodeList[nodeId] = 0; + } + + function packShardsToBitmap(uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal view returns (uint32) { + uint32 result; + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + if (shardSet[shard] == SET_ON) { + result = setBit(result, shard); + } + } + console.log('packShardsToBitmap', nodeId, '->', result); + return result; + } + + function unpackBitmapToShards(uint32 bitmap, uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal pure { + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + shardSet[shard] = bit(bitmap, shard) == 1 ? SET_ON : SET_OFF; + } + } + + function distributeUnused(uint8[] memory _unusedArr, + uint8[] memory _nodeList, + uint8[SHARD_COUNT][] memory _nodeShardsSet, + uint8[] memory _nodeModifiedSet, + bool _stopOnAvg, + uint8 _avgPerNode + ) internal { + // 1 take unused, offer it only to poor + NodeDesc[] memory poorList = buildNodeDesc(_nodeList, _nodeShardsSet); + for (uint i = 0; i < _unusedArr.length; i++) { + uint8 shard = _unusedArr[i]; + if (shard == NULL_SHARD) { + continue; + } + // get all nodes from poor to rich + for (uint j = 0; j < poorList.length; j++) { + NodeDesc memory _poor = poorList[j]; + if (_stopOnAvg && _poor.shardCount >= _avgPerNode) { + continue; + } + require(_poor.node != 0); + sortNodesAndSize(poorList); + uint8[SHARD_COUNT] memory poorShardsSet = _nodeShardsSet[_poor.node]; + if (poorShardsSet[shard] == SET_OFF) { + _unusedArr[i] = NULL_SHARD; + + poorShardsSet[shard] = SET_ON; + _poor.shardCount++; + _nodeModifiedSet[_poor.node]++; + break; + } + } + } + } + + function sort(NodeDesc[] memory _arr, int _left, int _right) internal { + int i = _left; + int j = _right; + if (i == j) return; + NodeDesc memory pivot = _arr[uint(_left + (_right - _left) / 2)]; + while (i <= j) { + while (_arr[uint(i)].shardCount < pivot.shardCount) i++; + while (pivot.shardCount < _arr[uint(j)].shardCount) j--; + if (i <= j) { + (_arr[uint(i)], _arr[uint(j)]) = (_arr[uint(j)], _arr[uint(i)]); + i++; + j--; + } + } + if (_left < j) sort(_arr, _left, j); + if (i < _right) sort(_arr, i, _right); + } + + function sortNodesAndSize(NodeDesc[] memory _arr) internal { + sort(_arr, 0, int(_arr.length - 1)); + } + + // todo resort 1 element addtion: bool onlyNewElement , uint8 newElementPos + function buildNodeDesc( + uint8[] memory _nodeList, + uint8[SHARD_COUNT][] memory _nodeShardsSet + ) private pure returns (NodeDesc[] memory) { + NodeDesc[] memory nodeDesc = new NodeDesc[](_nodeList.length); + // init nodeArr + for (uint i = 0; i < _nodeList.length; i++) { + uint8 nodeId = _nodeList[i]; + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; + uint8 count = 0; + for (uint shard = 0; shard < shardSet.length; shard++) { + if (shardSet[shard] == SET_ON) { + count++; + } + } + NodeDesc memory ns = NodeDesc(nodeId, count); + nodeDesc[i] = ns; + } + return nodeDesc; + } + + function calculateAvgPerNode(uint8[] memory _nodeList) public view returns (uint8) { + uint8 nodeCount = uint8(_nodeList.length); + uint8 total = SHARD_COUNT * rf; + uint8 avgPerNode = total / nodeCount; + // Math.ceil + if (total % nodeCount > 0) { + avgPerNode = avgPerNode + 1; + } + return avgPerNode; + } + + function shuffle() public { + uint8[] memory _nodeList = nodeList; + uint8 _rf = rf; + require(_rf >= 1 && _rf <= 20, "bad rf"); + require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); + + uint _maxNode = 0; + for (uint i = 0; i < _nodeList.length; i++) { + uint8 nodeId = _nodeList[i]; + if (nodeId > _maxNode) { + _maxNode = nodeId; + } + } + require(_maxNode < MAX_NODE_ID); + + // copy storage to memory + // nodeShardsSet[i][j] = 1, if nodeI has shard J + // nodeShardsSet[i][j] = 0, if nodeI has no shard J assigned + uint8[] memory _nodeModifiedSet = new uint8[](_maxNode + 1); + // n arrays , each is of SHARD_COUNT size + uint8[SHARD_COUNT][] memory _nodeShardsSet = new uint8[SHARD_COUNT][](_maxNode + 1); + for (uint i = 0; i < _nodeList.length; i++) { + uint8 nodeId = _nodeList[i]; + require(nodeId >= 1, 'nodes are 1 based'); + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; + require(shardSet.length == SHARD_COUNT, 'bad length'); + unpackBitmapToShards(mapNodeToShards[nodeId], _nodeShardsSet, nodeId); + } + + // calculate all possible shards x replication factor; + // a collection of shardIds + // unusedArr = [5, -1, 0, 1]; + // results in: 5,0,1 are in a set, -1 = nothing here + uint8[] memory _unusedArr = new uint8[](_rf * SHARD_COUNT); + uint16 cnt = 0; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + for (uint i = 0; i < _rf; i++) { + _unusedArr[cnt++] = shard; + } + } + + // check unused, and no-longer assigned + for (uint i = 0; i < _nodeList.length; i++) { + uint nodeId = _nodeList[i]; + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; + for (uint shard = 0; shard < SHARD_COUNT; shard++) { // todo wtf is this + // search this shard + if (shardSet[nodeId] == SET_OFF) { + continue; + } + uint8 unusedPos = NULL_SHARD; + for (uint8 j = 0; j < _unusedArr.length; j++) { + if (_unusedArr[j] == shard) { + unusedPos = j; + break; + } + } + // decide + if (unusedPos == NULL_SHARD) { + // over-assigned - this food is no longer available + shardSet[shard] = SET_OFF; + _nodeModifiedSet[nodeId]++; + } else { + // this food is used + _unusedArr[unusedPos] = NULL_SHARD; + } + } + } + + // cleanup unused from empty slots (-1); normally most of them would be empty; + { + uint8 emptyCnt = 0; + for (uint8 j = 0; j < _unusedArr.length; j++) { + if (_unusedArr[j] == NULL_SHARD) { + emptyCnt++; + } + } + uint8[] memory _tmp = new uint8[](_unusedArr.length - emptyCnt); + uint8 dst = 0; + for (uint i = 0; i < _unusedArr.length; i++) { + if (_unusedArr[i] != NULL_SHARD) { + _tmp[dst] = _unusedArr[i]; + dst++; + } + } + _unusedArr = _tmp; + } + + uint8 avgPerNode = calculateAvgPerNode(_nodeList); + + // 1 take unused, offer it only to poor + distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); + + // 2. every node that is richer than some AVG - SHOULD try to give to the poor, + // starting from the poorest first + NodeDesc[] memory poorList = buildNodeDesc(_nodeList, _nodeShardsSet); + NodeDesc[] memory richList = new NodeDesc[](poorList.length); // copy + for (uint i = 0; i < poorList.length; i++) { + richList[i] = poorList[i]; + } + sortNodesAndSize(richList); + for (uint i = richList.length; i > 0;) { + i--; + NodeDesc memory rich = richList[i]; + if (rich.shardCount < avgPerNode / 2) { + continue; + } + sortNodesAndSize(poorList); // resort after every donation + uint8[SHARD_COUNT] memory richShardsSet = _nodeShardsSet[rich.node]; + // every item from the end of the queue (to minimize the data moves) + for (uint shard = richShardsSet.length; shard > 0; ) { + shard--; + // to every poor + for (uint j = 0; j < poorList.length && j < i; j++) { // todo is j < i correct ??????? + NodeDesc memory poor = poorList[j]; + uint8[SHARD_COUNT] memory poorShardsSet = _nodeShardsSet[poor.node]; + if (rich.shardCount > poor.shardCount + 1 && poorShardsSet[shard] == SET_OFF) { + richShardsSet[shard] = SET_OFF; + rich.shardCount--; + _nodeModifiedSet[rich.node]++; + + poorShardsSet[shard] = SET_ON; + poor.shardCount++; + _nodeModifiedSet[poor.node]++; + break; + } + } + } + } + + // 3 take unused food, offer it to everyone + distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, false, avgPerNode); + + // 4 save to storage , only modified nodes + uint8 _modifiedNodes = 0; + { + for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { + if (_nodeModifiedSet[node] > 0) { + mapNodeToShards[node] = packShardsToBitmap(_nodeShardsSet, node); + _modifiedNodes++; + } + } + } + // 5 send events + { + uint8[] memory _modifiedNodesArr = new uint8[](_modifiedNodes); + uint pos = 0; + for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { + if (_nodeModifiedSet[nodeId] > 0) { + _modifiedNodesArr[pos++] = nodeId; + } + } + emit SNodeMappingChanged(_modifiedNodesArr); + } + } +} diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts new file mode 100644 index 0000000..de01ef5 --- /dev/null +++ b/smart-contracts/test/Storage.test.ts @@ -0,0 +1,46 @@ +import {time, loadFixture} from "@nomicfoundation/hardhat-network-helpers"; +import {anyValue} from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +import "@nomicfoundation/hardhat-chai-matchers"; +import "@nomiclabs/hardhat-ethers"; +import {expect} from "chai"; +import {ethers} from "hardhat"; +import {Contract} from "ethers"; +import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; + +let info = console.log; + +class DeployInfo { + storageCt: Contract; + owner: SignerWithAddress; +} + +async function state1(): Promise { + info('building snapshot'); + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); + + const storageCtFactory = await ethers.getContractFactory("StorageV1"); + const storageCt = await storageCtFactory.deploy(); + + return {storageCt, owner}; +} + +describe("StorageTest", function () { + it("Test1", async function () { + const {storageCt, owner} = await loadFixture(state1); + expect(storageCt.address).to.be.properAddress; + + let t1 = await storageCt.addNodeAndStake('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'); + await expect(t1).to.emit(storageCt, "SNodeMappingChanged") + .withArgs([1]); + + let nodeCount = await storageCt.nodeListLength(); + info('node count is ' , nodeCount); + for (let i = 0; i < nodeCount; i++) { + let nodeId = storageCt + } + + info('finished test1.'); + + }); +}); \ No newline at end of file From c6cca9728746a422124280f0d9bf086dcbd05f38 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 1 Sep 2023 12:55:32 +0400 Subject: [PATCH 26/84] add: Storage.sol (2) --- smart-contracts/contracts/Storage.sol | 115 +++++++++++++++++++++-- smart-contracts/test/Storage.test.ts | 129 +++++++++++++++++++++++--- 2 files changed, 222 insertions(+), 22 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index be47afc..0670ee1 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -1,6 +1,9 @@ //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; -import "hardhat/console.sol"; // todo remove + +// todo remove +import "hardhat/console.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; /* @@ -43,12 +46,12 @@ map after: Map(3) { } - +TODO reuse ids when nodes come and go (!) TODO ? use bitmaps for storing subscriptions use uint128 data type https://github.com/ethereum/solidity-examples/blob/master/src/bits/Bits.sol */ -contract StorageV1 { +contract StorageV1 is Ownable2StepUpgradeable { // node address -> nodeId (short address) // ex: 0xAAAAAAAAA -> 1 mapping(address => uint8) public mapAddrToNodeId; @@ -67,6 +70,8 @@ contract StorageV1 { // dynamic, // ex: 1....20 uint8 public rf = 1; + // if 5 nodes join, we will set rf to 5 and then it won't grow + uint8 public RF_AUTOADJUST_LIMIT = 5; // 0 to turn off // active nodeIds // nodeIds are 1-based @@ -88,8 +93,36 @@ contract StorageV1 { event SNodeMappingChanged(uint8[] nodeList); + // ADMIN FUNCTIONS + + // allows to set replication factor manually; however this is limited by node count; + function overrideRf(uint8 _rf) public onlyOwner { + require(_rf <= nodeList.length, 'rf is limited by node count'); + rf = _rf; + RF_AUTOADJUST_LIMIT = 0; + } + + // allows to set + function setNodeShardsByAddr(address _nodeAddress, uint32 bitmap) public onlyOwner { + uint8 node = mapAddrToNodeId[_nodeAddress]; + require(node > 0, 'node address is not registered'); + mapNodeToShards[node] = bitmap; + } + + function shuffle() public onlyOwner returns (uint8) { + return _shuffle(); + } + + // END ADMIN FUNCTIONS + + function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { + uint8 node = mapAddrToNodeId[_nodeAddress]; + require(node > 0, 'no such node'); + return mapNodeToShards[node]; + } + function nodeListLength() public view returns (uint8) { - return nodeList.length; + return uint8(nodeList.length); } function bit(uint32 self, uint8 index) internal pure returns (uint8) { @@ -102,11 +135,18 @@ contract StorageV1 { // todo add staking (or merge with Validator code) function addNodeAndStake(address nodeAddress) public returns (uint8) { + console.log('addNodeAndStake', nodeAddress); require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0, 'nodeId > 0'); mapAddrToNodeId[nodeAddress] = SET_ON; nodeList.push(unusedNodeId); - shuffle(); + // add more copies of the data if the network can handle it, unless we get enough + if (rf < RF_AUTOADJUST_LIMIT && rf < nodeList.length) { + rf++; +// console.log('rf is now', rf); + } + _shuffle(); + console.log('addNodeAndStake finished'); return unusedNodeId++; } @@ -132,11 +172,12 @@ contract StorageV1 { result = setBit(result, shard); } } - console.log('packShardsToBitmap', nodeId, '->', result); +// console.log('packShardsToBitmap', nodeId, '->', result); return result; } - function unpackBitmapToShards(uint32 bitmap, uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal pure { + function unpackBitmapToShards(uint32 bitmap, uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal view { +// console.log('unpacking', nodeId,'value', bitmap); uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { shardSet[shard] = bit(bitmap, shard) == 1 ? SET_ON : SET_OFF; @@ -172,6 +213,9 @@ contract StorageV1 { poorShardsSet[shard] = SET_ON; _poor.shardCount++; _nodeModifiedSet[_poor.node]++; + // todo REMOVE +// console.log(shard, ': unused ->', _poor.node); + break; } } @@ -233,15 +277,20 @@ contract StorageV1 { return avgPerNode; } - function shuffle() public { + function _shuffle() private returns (uint8) { uint8[] memory _nodeList = nodeList; uint8 _rf = rf; require(_rf >= 1 && _rf <= 20, "bad rf"); require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); uint _maxNode = 0; + +// console.log('node ids available:'); for (uint i = 0; i < _nodeList.length; i++) { uint8 nodeId = _nodeList[i]; + + // todo REMOVE +// console.log('nodeId', nodeId); if (nodeId > _maxNode) { _maxNode = nodeId; } @@ -257,10 +306,23 @@ contract StorageV1 { for (uint i = 0; i < _nodeList.length; i++) { uint8 nodeId = _nodeList[i]; require(nodeId >= 1, 'nodes are 1 based'); + unpackBitmapToShards(mapNodeToShards[nodeId], _nodeShardsSet, nodeId); + uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; require(shardSet.length == SHARD_COUNT, 'bad length'); - unpackBitmapToShards(mapNodeToShards[nodeId], _nodeShardsSet, nodeId); } + // todo remove +// console.log('after unpacking from storage'); +// for (uint8 i = 0; i < _nodeList.length; i++) { +// uint8 nodeId = _nodeList[i]; +// +// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; +// for(uint8 k = 0; k 0; ) { + for (uint shard = richShardsSet.length; shard > 0;) { shard--; // to every poor for (uint j = 0; j < poorList.length && j < i; j++) { // todo is j < i correct ??????? @@ -383,9 +475,12 @@ contract StorageV1 { for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { if (_nodeModifiedSet[nodeId] > 0) { _modifiedNodesArr[pos++] = nodeId; +// console.log('shuffle() node modified', nodeId); } } +// console.log('emitting ', _modifiedNodesArr.length); emit SNodeMappingChanged(_modifiedNodesArr); } + return _modifiedNodes; } } diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index de01ef5..7c711f5 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -3,11 +3,14 @@ import {anyValue} from "@nomicfoundation/hardhat-chai-matchers/withArgs"; import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; import {expect} from "chai"; +import {assert} from "chai"; import {ethers} from "hardhat"; import {Contract} from "ethers"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +import {BitUtil} from "./uitlz/bitUtil"; + +let debug = console.log; -let info = console.log; class DeployInfo { storageCt: Contract; @@ -15,7 +18,7 @@ class DeployInfo { } async function state1(): Promise { - info('building snapshot'); + debug('building snapshot'); // Contracts are deployed using the first signer/account by default const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); @@ -25,22 +28,124 @@ async function state1(): Promise { return {storageCt, owner}; } +let storageCt; + +async function assertRf(e: number) { + const actualRf = await storageCt.rf(); + console.log('assert actual rf', e); + assert.equal(actualRf, e); +} + +async function assertNodeListLength(e: number) { + const nodeListLength = await storageCt.nodeListLength(); + console.log('assert actual nodeListLength', nodeListLength); + assert.equal(nodeListLength, e); +} + +async function assertMapping(addr: string, shardsAssigned: number[]) { + assert.deepEqual( + BitUtil.bitsToPositions( + await storageCt.getNodeShardsByAddr(addr)), + shardsAssigned); + console.log(`assert ${addr} has good mapping`); +} + +let nodes = [null]; +for (let i = 1; i <= 100; i++) { + nodes.push('0x' + i.toString().padStart(40, '0')); +} + + describe("StorageTest", function () { - it("Test1", async function () { - const {storageCt, owner} = await loadFixture(state1); + + beforeEach(async () => { + const state = await loadFixture(state1); + storageCt = state.storageCt; expect(storageCt.address).to.be.properAddress; + }) - let t1 = await storageCt.addNodeAndStake('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'); - await expect(t1).to.emit(storageCt, "SNodeMappingChanged") - .withArgs([1]); + it("TestBasic", async function () { + console.log(nodes[1]); + let t1 = await storageCt.addNodeAndStake(nodes[1]); + await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([1]); let nodeCount = await storageCt.nodeListLength(); - info('node count is ' , nodeCount); - for (let i = 0; i < nodeCount; i++) { - let nodeId = storageCt - } + debug('node count is ', nodeCount); + assert.equal(nodeCount, 1); + + const n1shards: number = await storageCt.getNodeShardsByAddr(nodes[1]); + debug('node shards:', n1shards.toString(2)); + debug('node shards:', BitUtil.bitsToPositions(n1shards)); - info('finished test1.'); + debug('finished test1.'); }); + + it('test0node', async () => { + await assertRf(1); + assert.equal(await storageCt.nodeListLength(), 0); + assert.equal(await storageCt.SHARD_COUNT(), 32); + }) + + it('test1node', async () => { + let t1 = await storageCt.addNodeAndStake(nodes[1]); + await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([1]); + assertMapping(nodes[1], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]); + }) + + it('test1node_add234', async () => { + await assertRf(1); + await assertNodeListLength(0); + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 3; nodeId++) { + // add 1 node + const addr = nodes[nodeId]; + console.log('test adds ', addr); + let t1 = await storageCt.addNodeAndStake(addr); + await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([nodeId]); + nodeCount++; + // check that replication count incremented + await assertRf(nodeCount); + await assertNodeListLength(nodeCount); + // check that event affected only this one node + + // check that all nodes up to this one have the same mapping to all shards + for (let i = 1; i <= nodeId; i++) { + await assertMapping(nodes[i], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]); + } + + // we have 5 nodes +/* { + let t1 = await storageCt.addNodeAndStake(nodes[6]); + await assertRf(5); + for (let i = 1; i <= nodeId; i++) { + console.log(BitUtil.bitsToPositions(await storageCt.getNodeShardsByAddr(nodes[i]))); + } + + }*/ + } + + /* + let t2 = await storageCt.addNodeAndStake(nodes[2]); + await assertRf(2); + await expect(t2).to.emit(storageCt, "SNodeMappingChanged").withArgs([2]); + await assertMapping(nodes[1], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]); + await assertMapping(nodes[2], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]);*/ + }) }); \ No newline at end of file From eec322775fa1a5d91e9724abb0db1da0641e1998 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 1 Sep 2023 20:04:37 +0400 Subject: [PATCH 27/84] add: Storage.sol (3) - tests --- smart-contracts/contracts/Storage.sol | 32 ++- smart-contracts/test/Storage.test.ts | 239 +++++++++++++----- smart-contracts/test/TestHelper.ts | 114 +++++---- smart-contracts/test/ValidatorContractTest.ts | 14 +- smart-contracts/test/uitlz/bitUtil.ts | 61 +++++ smart-contracts/test/uitlz/collectionUtil.ts | 41 +++ 6 files changed, 367 insertions(+), 134 deletions(-) create mode 100644 smart-contracts/test/uitlz/bitUtil.ts create mode 100644 smart-contracts/test/uitlz/collectionUtil.ts diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 0670ee1..9d3e550 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -17,10 +17,11 @@ we have M amount of vshards at the start (a predefined value) the algorithm should ensure that - a network maintains exactly [replication factor] amount of chunks in total on all nodes - if a node joins/leaves the data is re-distributed -- replication factor can change - it go up (no more than # of nodes in total) and go down to 1 +- replication factor can change - it goes up (no more than # of nodes in total) and goes down to 1 - re-distribution should affect the least amount of nodes possible - re-distribution should favor grabbing fresh shards instead of old ones (assigned to the node a long time ago) - difference between node with most vshards and least vshards should stay as close to ±1 as possible +- specifically for this contract: first N nodes will raise replication factor to RF_AUTOADJUST_LIMIT; Re-sharding works like this: @@ -47,15 +48,12 @@ map after: Map(3) { TODO reuse ids when nodes come and go (!) + delete should be in nodeAddrList, nodeIdList TODO ? use bitmaps for storing subscriptions use uint128 data type https://github.com/ethereum/solidity-examples/blob/master/src/bits/Bits.sol */ contract StorageV1 is Ownable2StepUpgradeable { - // node address -> nodeId (short address) - // ex: 0xAAAAAAAAA -> 1 - mapping(address => uint8) public mapAddrToNodeId; - // number of shards; // this value should not change after deploy // also this should match data type in mapNodeToShards (uint32/64/128/256) @@ -73,10 +71,15 @@ contract StorageV1 is Ownable2StepUpgradeable { // if 5 nodes join, we will set rf to 5 and then it won't grow uint8 public RF_AUTOADJUST_LIMIT = 5; // 0 to turn off + // NODE DATA + // node address -> nodeId (short address) + // ex: 0xAAAAAAAAA -> 1 + mapping(address => uint8) public mapAddrToNodeId; + address[] public nodeAddrList; // active nodeIds // nodeIds are 1-based // ex: [1,2,3] - uint8[] public nodeList; + uint8[] public nodeIdList; // nodeId -> shards // shards are 0-based @@ -97,7 +100,7 @@ contract StorageV1 is Ownable2StepUpgradeable { // allows to set replication factor manually; however this is limited by node count; function overrideRf(uint8 _rf) public onlyOwner { - require(_rf <= nodeList.length, 'rf is limited by node count'); + require(_rf <= nodeIdList.length, 'rf is limited by node count'); rf = _rf; RF_AUTOADJUST_LIMIT = 0; } @@ -121,8 +124,8 @@ contract StorageV1 is Ownable2StepUpgradeable { return mapNodeToShards[node]; } - function nodeListLength() public view returns (uint8) { - return uint8(nodeList.length); + function nodeCount() public view returns (uint8) { + return uint8(nodeIdList.length); } function bit(uint32 self, uint8 index) internal pure returns (uint8) { @@ -139,9 +142,10 @@ contract StorageV1 is Ownable2StepUpgradeable { require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0, 'nodeId > 0'); mapAddrToNodeId[nodeAddress] = SET_ON; - nodeList.push(unusedNodeId); + nodeIdList.push(unusedNodeId); + nodeAddrList.push(nodeAddress); // add more copies of the data if the network can handle it, unless we get enough - if (rf < RF_AUTOADJUST_LIMIT && rf < nodeList.length) { + if (rf < RF_AUTOADJUST_LIMIT && rf < nodeIdList.length) { rf++; // console.log('rf is now', rf); } @@ -155,13 +159,13 @@ contract StorageV1 is Ownable2StepUpgradeable { if (nodeId == 0) { revert('no address found'); } - if (nodeList.length == 0) { + if (nodeIdList.length == 0) { // mapping exists, but node has no short id delete mapAddrToNodeId[nodeAddress]; revert('no node id found'); } // valid nodeId ; filter it out; don't shrink the storage array because it's expensive - nodeList[nodeId] = 0; + nodeIdList[nodeId] = 0; } function packShardsToBitmap(uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal view returns (uint32) { @@ -278,7 +282,7 @@ contract StorageV1 is Ownable2StepUpgradeable { } function _shuffle() private returns (uint8) { - uint8[] memory _nodeList = nodeList; + uint8[] memory _nodeList = nodeIdList; uint8 _rf = rf; require(_rf >= 1 && _rf <= 20, "bad rf"); require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 7c711f5..0277651 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -5,9 +5,12 @@ import "@nomiclabs/hardhat-ethers"; import {expect} from "chai"; import {assert} from "chai"; import {ethers} from "hardhat"; -import {Contract} from "ethers"; +import {Contract, ContractTransaction} from "ethers"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {BitUtil} from "./uitlz/bitUtil"; +import {TestHelper as t} from "./TestHelper"; +import {CollectionUtil} from "./uitlz/collectionUtil"; +import {NodeStatus} from "./ValidatorContractHelper"; let debug = console.log; @@ -28,25 +31,138 @@ async function state1(): Promise { return {storageCt, owner}; } -let storageCt; +let ct: StorageContract & Contract; + +/*assertCorrectReplicationFactor() { + let shardToCnt = new Map; + for (const [nodeId, shards] of this.map) { + for (const sh of shards) { + let counter = shardToCnt.get(sh); + counter = counter == null ? 1 : ++counter; + shardToCnt.set(sh, counter); + } + } + if (this.nodeCount == 0) { + return; + } + for (let sh = 1; sh <= this.shardCount; sh++) { + if (shardToCnt.get(sh) != this.rf) { + throw new Error(`not enough shards for ${sh}`); + } + } +}*/ + +interface StorageContract { + + nodeAddrList(pos: number): Promise; + + rf(): Promise; + + getNodeShardsByAddr(addr: string): Promise; + + nodeCount(): Promise; + + addNodeAndStake(addr: string): Promise; + + SHARD_COUNT(): Promise; +} + +// read everything from the contract state to ease the testing +class State { + rf: number; + nodeList = new Set(); + map: Map> = new Map(); + shardCount: number; + + public static async readFromEvm(): Promise { + let s = new State(); + s.rf = await ct.rf(); + s.shardCount = await ct.SHARD_COUNT(); + let nodeCount = await ct.nodeCount(); + for (let i = 0; i < nodeCount; i++) { + let addr = await ct.nodeAddrList(i); + let shardsBitSet = await ct.getNodeShardsByAddr(addr); + let shardsIntArr = BitUtil.bitsToPositions(shardsBitSet); + let shardsIntSet = CollectionUtil.arrayToSet(shardsIntArr); + s.map.set(addr, shardsIntSet); + s.nodeList.add(addr); + console.log(addr, '->', CollectionUtil.setToArray(shardsIntSet)); + } + return s; + } + + checkRf(e: number) { + console.log('assert rf', e); + assert.equal(this.rf, e); + } + + checkNodeCount(e: number) { + console.log('assert nodeCount', e); + assert.equal(this.nodeList.size, e); + } + + assertMapping(addr: string, shardsAssigned: number[]) { + assert.deepEqual(CollectionUtil.setToArray(this.map.get(addr)), shardsAssigned); + console.log(`assert ${addr} has good mapping`); + } + + checkDistribution() { + let minSize = 100000000000; + let maxSize = 0; + for (const [node, shards] of this.map) { + minSize = Math.min(minSize, shards.size); + maxSize = Math.max(maxSize, shards.size); + } + const delta = maxSize - minSize; + console.log('assert maxdistance', delta) + assert.isTrue(delta <= 1, `maxdistance > 1`); + this.assertCorrectReplicationFactor(); + } + + assertCorrectReplicationFactor() { + let shardToCnt = new Map; + for (const [nodeId, shards] of this.map) { + for (const sh of shards) { + let counter = shardToCnt.get(sh); + counter = counter == null ? 1 : ++counter; + shardToCnt.set(sh, counter); + } + } + if (this.nodeList.size == 0) { + return; + } + for (let sh = 0; sh < this.shardCount; sh++) { + const actualCnt = shardToCnt.get(sh); + if (actualCnt != this.rf) { + throw new Error(`incorrect number of shards for shard: ${sh} , ` + + `got ${actualCnt} expected ${this.rf}`); + } + } + } +} async function assertRf(e: number) { - const actualRf = await storageCt.rf(); + const actualRf = await ct.rf(); console.log('assert actual rf', e); assert.equal(actualRf, e); } async function assertNodeListLength(e: number) { - const nodeListLength = await storageCt.nodeListLength(); + const nodeListLength = await ct.nodeCount(); console.log('assert actual nodeListLength', nodeListLength); assert.equal(nodeListLength, e); } + +/* + + +*/ + + async function assertMapping(addr: string, shardsAssigned: number[]) { - assert.deepEqual( - BitUtil.bitsToPositions( - await storageCt.getNodeShardsByAddr(addr)), - shardsAssigned); + const nodeShardsByAddr = await ct.getNodeShardsByAddr(addr); + assert.deepEqual(BitUtil.bitsToPositions(nodeShardsByAddr), shardsAssigned); console.log(`assert ${addr} has good mapping`); } @@ -60,92 +176,89 @@ describe("StorageTest", function () { beforeEach(async () => { const state = await loadFixture(state1); - storageCt = state.storageCt; - expect(storageCt.address).to.be.properAddress; + ct = state.storageCt; + expect(ct.address).to.be.properAddress; }) it("TestBasic", async function () { console.log(nodes[1]); - let t1 = await storageCt.addNodeAndStake(nodes[1]); - await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([1]); - - let nodeCount = await storageCt.nodeListLength(); - debug('node count is ', nodeCount); - assert.equal(nodeCount, 1); - - const n1shards: number = await storageCt.getNodeShardsByAddr(nodes[1]); - debug('node shards:', n1shards.toString(2)); - debug('node shards:', BitUtil.bitsToPositions(n1shards)); - - debug('finished test1.'); - + let tx = await ct.addNodeAndStake(nodes[1]); + await expect(tx).to.emit(ct, "SNodeMappingChanged").withArgs([1]); + let s = await State.readFromEvm(); + s.checkNodeCount(1); + s.checkRf(1); }); it('test0node', async () => { - await assertRf(1); - assert.equal(await storageCt.nodeListLength(), 0); - assert.equal(await storageCt.SHARD_COUNT(), 32); + let s = await State.readFromEvm(); + s.checkRf(1); + assert.equal(await ct.nodeCount(), 0); + assert.equal(await ct.SHARD_COUNT(), 32); }) - it('test1node', async () => { - let t1 = await storageCt.addNodeAndStake(nodes[1]); - await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([1]); - assertMapping(nodes[1], + it('test1node-', async () => { + let t1 = await ct.addNodeAndStake(nodes[1]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([1]); + let s = await State.readFromEvm(); + s.checkRf(1); + s.checkNodeCount(1); + s.assertMapping(nodes[1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]); }) - it('test1node_add234', async () => { - await assertRf(1); - await assertNodeListLength(0); + it('test_1to5_6to10', async () => { + let s = await State.readFromEvm(); + s.checkRf(1); + s.checkNodeCount(0); + s.checkDistribution(); + let nodeCount = 0; - for (let nodeId = 1; nodeId <= 3; nodeId++) { + // add 5 nodes , every should get the same shards + // because replication factor increments also to 5 + for (let nodeId = 1; nodeId <= 5; nodeId++) { // add 1 node const addr = nodes[nodeId]; console.log('test adds ', addr); - let t1 = await storageCt.addNodeAndStake(addr); - await expect(t1).to.emit(storageCt, "SNodeMappingChanged").withArgs([nodeId]); + let t1 = await ct.addNodeAndStake(addr); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodeId]); nodeCount++; // check that replication count incremented - await assertRf(nodeCount); - await assertNodeListLength(nodeCount); // check that event affected only this one node - // check that all nodes up to this one have the same mapping to all shards + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); for (let i = 1; i <= nodeId; i++) { - await assertMapping(nodes[i], + s.assertMapping(nodes[i], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]); } + } - // we have 5 nodes -/* { - let t1 = await storageCt.addNodeAndStake(nodes[6]); - await assertRf(5); - for (let i = 1; i <= nodeId; i++) { - console.log(BitUtil.bitsToPositions(await storageCt.getNodeShardsByAddr(nodes[i]))); - } + // we have 5 nodes + await assertRf(5); + await assertNodeListLength(5); - }*/ + // add 6 to 10 + for (let nodeId = 6; nodeId <= 10; nodeId++) { + { + let t1 = await ct.addNodeAndStake(nodes[nodeId]); + await t.confirmTransaction(t1); + nodeCount++; + let s = await State.readFromEvm(); + s.checkRf(5); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } } + // END TEST + }); + - /* - let t2 = await storageCt.addNodeAndStake(nodes[2]); - await assertRf(2); - await expect(t2).to.emit(storageCt, "SNodeMappingChanged").withArgs([2]); - await assertMapping(nodes[1], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31]); - await assertMapping(nodes[2], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31]);*/ - }) }); \ No newline at end of file diff --git a/smart-contracts/test/TestHelper.ts b/smart-contracts/test/TestHelper.ts index 5c1dd0b..4cca5f9 100644 --- a/smart-contracts/test/TestHelper.ts +++ b/smart-contracts/test/TestHelper.ts @@ -1,72 +1,76 @@ import {BigNumber, ContractTransaction} from "ethers"; -import {expect} from "chai"; +import {expect, assert} from "chai"; import {ValidatorV1} from "../typechain-types"; import {Event} from "@ethersproject/contracts/src.ts"; export class TestHelper { - static hasAllFields(obj: any, sampleObj: any, - checkValues: boolean, - throwEx: boolean = false): boolean { - for (const key in sampleObj) { - if (sampleObj.hasOwnProperty(key)) { - if (!obj.hasOwnProperty(key)) { - if (throwEx) { - throw Error(`missing field ${key}`); - } else { - return false; - } + static hasAllFields(obj: any, sampleObj: any, + checkValues: boolean, + throwEx: boolean = false): boolean { + for (const key in sampleObj) { + if (sampleObj.hasOwnProperty(key)) { + if (!obj.hasOwnProperty(key)) { + if (throwEx) { + throw Error(`missing field ${key}`); + } else { + return false; + } - } - let val = obj[key]; - let expectedVal = sampleObj[key]; - // if(val instanceof BigNumber) { - // val = val.toString(); - // expectedVal = expectedVal.toString(); - // } - if (checkValues && val != expectedVal) { - if (throwEx) { - console.log(`${val.constructor.name} ${expectedVal.constructor.name}`) - throw Error(`invalid field ${key} with value ${val}, expected ${expectedVal}`); - } else { - return false; - } - - } - } } - return true; + let val = obj[key]; + let expectedVal = sampleObj[key]; + // console.log('val is ', val); + // console.log('expectedval is ', expectedVal); + // if(val instanceof BigNumber) { + // val = val.toString(); + // expectedVal = expectedVal.toString(); + // } + if (checkValues/*val != expectedVal*/) { + assert.deepEqual(val, expectedVal, + `assert failed: invalid field ${key} with value ${val}, expected ${expectedVal}`); + return false; + /*if (throwEx) { + console.log(`${val.constructor.name} ${expectedVal.constructor.name}`) + throw Error(`invalid field ${key} with value ${val}, expected ${expectedVal}`); + } else { + return false; + }*/ + } + } } + return true; + } - static async confirmTransaction(tx: ContractTransaction) { - expect((await tx.wait(1)).status).to.be.equal(1); - } + static async confirmTransaction(tx: ContractTransaction) { + expect((await tx.wait(1)).status).to.be.equal(1); + } - static async filterEventsFromTransaction(contract: ValidatorV1, tx: ContractTransaction, - eventName: string): Promise { - const receipt = await tx.wait(); - return receipt.events.filter((event) => event.event === eventName && event.address === contract.address); - } + static async filterEventsFromTransaction(contract: ValidatorV1, tx: ContractTransaction, + eventName: string): Promise { + const receipt = await tx.wait(); + return receipt.events.filter((event) => event.event === eventName && event.address === contract.address); + } - /** - * Expects that contract transaction (tx) contains a specified event (sample) at specified index (index) - */ - static async expectEvent(tx: ContractTransaction, index:number, sample: any) { - return TestHelper.expectEventEx(tx, "NodeStatusChanged", index, sample); - } + /** + * Expects that contract transaction (tx) contains a specified event (sample) at specified index (index) + */ + static async expectEvent(tx: ContractTransaction, index: number, sample: any) { + return TestHelper.expectEventEx(tx, "NodeStatusChanged", index, sample); + } - static async expectEventFirst(tx: ContractTransaction, sample: any) { - return TestHelper.expectEventEx(tx, "NodeStatusChanged", 0, sample); - } + static async expectEventFirst(tx: ContractTransaction, sample: any) { + return TestHelper.expectEventEx(tx, "NodeStatusChanged", 0, sample); + } - static async expectEventEx(tx: ContractTransaction, eventName:string, index:number, sample: any) { - await TestHelper.confirmTransaction(tx); - const receipt = await tx.wait(); - let fileteredEvents = receipt.events.filter((event) => event.event === eventName /*&& event.address === contract.address*/); - for (let i = 0; i < fileteredEvents.length; i++) { - console.log(`event[${i}] -> ${fileteredEvents[i].args}`); - } - TestHelper.hasAllFields(fileteredEvents[index].args, sample, true, true); + static async expectEventEx(tx: ContractTransaction, eventName: string, index: number, sample: any) { + await TestHelper.confirmTransaction(tx); + const receipt = await tx.wait(); + let fileteredEvents = receipt.events.filter((event) => event.event === eventName /*&& event.address === contract.address*/); + for (let i = 0; i < fileteredEvents.length; i++) { + console.log(`event[${i}] -> ${fileteredEvents[i].args}`); } + TestHelper.hasAllFields(fileteredEvents[index].args, sample, true, true); + } } \ No newline at end of file diff --git a/smart-contracts/test/ValidatorContractTest.ts b/smart-contracts/test/ValidatorContractTest.ts index d686c74..a5cce02 100644 --- a/smart-contracts/test/ValidatorContractTest.ts +++ b/smart-contracts/test/ValidatorContractTest.ts @@ -12,6 +12,7 @@ import {NodeStatus, ValidatorContractHelper} from "./ValidatorContractHelper"; import {BigNumber} from "ethers"; import {JsonRpcClient} from "hardhat/internal/hardhat-network/jsonrpc/client"; +let info = console.log; export class State1 { pushContract: PushToken; @@ -31,8 +32,17 @@ export class State1 { const ptFactory = await ethers.getContractFactory("PushToken"); const pushContract = await ptFactory.deploy(); - const valFactory = await ethers.getContractFactory("ValidatorV1"); - const valContract = await valFactory.deploy(pushContract.address); + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushContract.address, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + info(`deployed proxy: ${validatorV1Proxy.address}`); + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + console.log(`deployed impl: ${validatorV1Impl}`); + + // const valFactory = await ethers.getContractFactory("ValidatorV1"); + const valContract = validatorV1Impl; await pushContract.mint(owner.address, ethers.utils.parseEther("100")); // owner can spend 1000000000000000 diff --git a/smart-contracts/test/uitlz/bitUtil.ts b/smart-contracts/test/uitlz/bitUtil.ts new file mode 100644 index 0000000..cf9db74 --- /dev/null +++ b/smart-contracts/test/uitlz/bitUtil.ts @@ -0,0 +1,61 @@ +import {CollectionUtil} from "./collectionUtil"; + +export class BitUtil { + /** + * XORs 2 buffers, byte by byte: src = src XOR add + * 1 modifies src + * 2 returns srs || src's resized copy in case there is no room for add bytes + * + * @param src + * @param add + */ + public static xor(src: Buffer, add: Buffer): Buffer { + if (src == null && add == null) { + return Buffer.alloc(0) + } else if (add == null) { + return src + } else if (src == null) { + src = new Buffer(add.length) + add.copy(src, 0, 0, add.length) + return src + } + let target = src + if (add.length > src.length) { + target = new Buffer(add.length) + src.copy(target, 0, 0, src.length) + } + var length = Math.min(target.length, add.length) + for (var i = 0; i < length; ++i) { + target[i] = target[i] ^ add[i] + } + return target + } + + public static strToBase64(value: string): string { + return Buffer.from(value).toString('base64') + } + + public static base64ToStr(value: string): string { + return Buffer.from(value, 'base64').toString('utf8') + } + + + public static getBit(number:number, bitOffset:number) { + return (number & (1 << bitOffset)) === 0 ? 0 : 1; + } + + public static bitsToPositions(number: number): number[] { + // return null; + const result: number[] = []; + let position = 0; + while (number !== 0) { + if ((number & 1) === 1) { + result.push(position); + } + number = number >>> 1; + position++; + } + CollectionUtil.sortNumbersAsc(result); + return result; + } +} diff --git a/smart-contracts/test/uitlz/collectionUtil.ts b/smart-contracts/test/uitlz/collectionUtil.ts new file mode 100644 index 0000000..7101ee4 --- /dev/null +++ b/smart-contracts/test/uitlz/collectionUtil.ts @@ -0,0 +1,41 @@ +export class CollectionUtil { + public static arrayToMap(arr: V[], keyField: K): Map { + if (arr == null || arr.length == 0) { + return new Map() + } + return new Map(arr.map((value) => [value[keyField], value])) + } + + public static arrayToSet(arr: V[]): Set { + return new Set(arr) + } + + public static arrayToFields(arr: V[], keyField: K): Set { + const arrayOfFields = arr.map((obj) => obj[keyField]) + return new Set(arrayOfFields) + } + + public static findIndex(arr: V[], filter: (item: V) => boolean): number { + if (arr == null) { + return -1 + } + return arr.findIndex(filter) + } + + public static setToArray(set: Set): V[] { + return Array.from(set.keys()) + } + + public static intersectSets(set1: Set, set2: Set): Set { + return new Set([...set1].filter(x => set2.has(x))); + } + + public static sortNumbersAsc(array:number[]) { + if(array==null || array.length==0) { + return; + } + array.sort((a, b) => { + return a - b; + }) + } +} From 81a23dea16b89fc2e387ffd3fd4a3821ad883b17 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 10:32:12 +0400 Subject: [PATCH 28/84] add: Storage.sol - n*n*m version --- smart-contracts/contracts/Storage.sol | 83 +++++++++++++++++++++------ smart-contracts/test/Storage.test.ts | 24 +++++++- smart-contracts/test/TestHelper.ts | 4 +- 3 files changed, 90 insertions(+), 21 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 9d3e550..8b233f6 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.17; // todo remove -import "hardhat/console.sol"; +//import "hardhat/console.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; /* @@ -121,7 +121,9 @@ contract StorageV1 is Ownable2StepUpgradeable { function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { uint8 node = mapAddrToNodeId[_nodeAddress]; require(node > 0, 'no such node'); - return mapNodeToShards[node]; + uint32 result = mapNodeToShards[node]; +// console.log(node, _nodeAddress, ' mapped to ', result); + return result; } function nodeCount() public view returns (uint8) { @@ -138,10 +140,9 @@ contract StorageV1 is Ownable2StepUpgradeable { // todo add staking (or merge with Validator code) function addNodeAndStake(address nodeAddress) public returns (uint8) { - console.log('addNodeAndStake', nodeAddress); +// console.log('addNodeAndStake', nodeAddress); require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0, 'nodeId > 0'); - mapAddrToNodeId[nodeAddress] = SET_ON; nodeIdList.push(unusedNodeId); nodeAddrList.push(nodeAddress); // add more copies of the data if the network can handle it, unless we get enough @@ -149,8 +150,9 @@ contract StorageV1 is Ownable2StepUpgradeable { rf++; // console.log('rf is now', rf); } + mapAddrToNodeId[nodeAddress] = unusedNodeId; _shuffle(); - console.log('addNodeAndStake finished'); +// console.log('addNodeAndStake finished'); return unusedNodeId++; } @@ -248,6 +250,24 @@ contract StorageV1 is Ownable2StepUpgradeable { sort(_arr, 0, int(_arr.length - 1)); } + function resortOneItem(NodeDesc[] memory _arr, uint8 pos, bool increment) internal { + uint8 target; + if (increment) { + target = pos + 1; + while (target <= _arr.length - 1 && _arr[pos].shardCount > _arr[target].shardCount) target++; + } else { + target = pos - 1; + while (target >=0 && _arr[pos].shardCount < _arr[target].shardCount) target--; + } + NodeDesc memory tmp = _arr[target]; + _arr[target] = _arr[pos]; + _arr[pos] = tmp; + // todo remove + for (uint i = 1; i < _arr.length; i++) { + require(_arr[i].shardCount < _arr[i - 1].shardCount, 'sort failed'); + } + } + // todo resort 1 element addtion: bool onlyNewElement , uint8 newElementPos function buildNodeDesc( uint8[] memory _nodeList, @@ -334,8 +354,8 @@ contract StorageV1 is Ownable2StepUpgradeable { // results in: 5,0,1 are in a set, -1 = nothing here uint8[] memory _unusedArr = new uint8[](_rf * SHARD_COUNT); uint16 cnt = 0; - for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - for (uint i = 0; i < _rf; i++) { + for (uint i = 0; i < _rf; i++) { + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { _unusedArr[cnt++] = shard; } } @@ -353,21 +373,21 @@ contract StorageV1 is Ownable2StepUpgradeable { if (shardSet[nodeId] == SET_OFF) { continue; } - uint8 unusedPos = NULL_SHARD; - for (uint8 j = 0; j < _unusedArr.length; j++) { + int unusedPos = - 1; + for (uint j = 0; j < _unusedArr.length; j++) { if (_unusedArr[j] == shard) { - unusedPos = j; + unusedPos = int(j); break; } } // decide - if (unusedPos == NULL_SHARD) { + if (unusedPos == - 1) { // over-assigned - this food is no longer available shardSet[shard] = SET_OFF; _nodeModifiedSet[nodeId]++; } else { // this food is used - _unusedArr[unusedPos] = NULL_SHARD; + _unusedArr[uint(unusedPos)] = NULL_SHARD; } } } @@ -378,8 +398,8 @@ contract StorageV1 is Ownable2StepUpgradeable { // uint8 nodeId = _nodeList[i]; // // uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; -// for(uint8 k = 0; k poor.shardCount + 1 && poorShardsSet[shard] == SET_OFF) { + if (!(rich.shardCount > poor.shardCount + 1)) { + break; + } + if ((poorShardsSet[shard] == SET_OFF)) { +// console.log('rich ', rich.shardCount, ' poor', poor.shardCount); richShardsSet[shard] = SET_OFF; rich.shardCount--; _nodeModifiedSet[rich.node]++; @@ -453,12 +478,32 @@ contract StorageV1 is Ownable2StepUpgradeable { poorShardsSet[shard] = SET_ON; poor.shardCount++; _nodeModifiedSet[poor.node]++; + // todo remove +// console.log(shard, rich.node, '->', poor.node); break; } } } } - + // todo remove +// console.log('after redistribution'); +// for (uint i = 0; i < _nodeList.length; i++) { +// uint8 nodeId = _nodeList[i]; +//// if(nodeId!=1) { +//// break; +//// } +// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; +// uint count = 0; +// for (uint8 k = 0; k < shardSet.length; k++) { +// if (shardSet[k] == SET_ON) { +// console.log(nodeId, ' has ', k); +// count++; +// } +// } +// if (count == 0) { +// console.log(nodeId, ' has nothing'); +// } +// } // 3 take unused food, offer it to everyone distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, false, avgPerNode); @@ -467,7 +512,9 @@ contract StorageV1 is Ownable2StepUpgradeable { { for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { if (_nodeModifiedSet[node] > 0) { - mapNodeToShards[node] = packShardsToBitmap(_nodeShardsSet, node); + uint32 bitmap = packShardsToBitmap(_nodeShardsSet, node); + mapNodeToShards[node] = bitmap; +// console.log(node, ' stores bitmask ', bitmap); _modifiedNodes++; } } diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 0277651..595f331 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -56,6 +56,8 @@ interface StorageContract { nodeAddrList(pos: number): Promise; + nodeIdList(pos: number): Promise; + rf(): Promise; getNodeShardsByAddr(addr: string): Promise; @@ -81,12 +83,13 @@ class State { let nodeCount = await ct.nodeCount(); for (let i = 0; i < nodeCount; i++) { let addr = await ct.nodeAddrList(i); + let nodeId = await ct.nodeIdList(i); let shardsBitSet = await ct.getNodeShardsByAddr(addr); let shardsIntArr = BitUtil.bitsToPositions(shardsBitSet); let shardsIntSet = CollectionUtil.arrayToSet(shardsIntArr); s.map.set(addr, shardsIntSet); s.nodeList.add(addr); - console.log(addr, '->', CollectionUtil.setToArray(shardsIntSet)); + console.log(addr, `node:${nodeId} bitset:${shardsBitSet} -> size:${shardsIntSet.size} `, CollectionUtil.setToArray(shardsIntSet)); } return s; } @@ -207,7 +210,24 @@ describe("StorageTest", function () { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]); - }) + }); + + it('test_5to6', async () => { + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 6; nodeId++) { + if (nodeId === 6) { + console.log('\n'.repeat(5) + '='.repeat(15)) + } + let tx = await ct.addNodeAndStake(nodes[nodeId]); + await t.confirmTransaction(tx); + nodeCount++; + } + let s = await State.readFromEvm(); + s.checkRf(5); + s.checkNodeCount(6); + s.checkDistribution(); + + }); it('test_1to5_6to10', async () => { let s = await State.readFromEvm(); diff --git a/smart-contracts/test/TestHelper.ts b/smart-contracts/test/TestHelper.ts index 4cca5f9..9f6284e 100644 --- a/smart-contracts/test/TestHelper.ts +++ b/smart-contracts/test/TestHelper.ts @@ -43,7 +43,9 @@ export class TestHelper { } static async confirmTransaction(tx: ContractTransaction) { - expect((await tx.wait(1)).status).to.be.equal(1); + const receipt = await tx.wait(1); + expect(receipt.status).to.be.equal(1); + // console.log('tx logs', receipt.logs); } static async filterEventsFromTransaction(contract: ValidatorV1, tx: ContractTransaction, From 19b6670db222709b73129fad0168275f752f6f1c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 15:00:00 +0400 Subject: [PATCH 29/84] add: Storage.sol - opt version (1 test) --- smart-contracts/contracts/Storage.sol | 223 ++++++++++++++++++++------ smart-contracts/test/Storage.test.ts | 18 ++- 2 files changed, 181 insertions(+), 60 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 8b233f6..6db0c99 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.17; // todo remove -//import "hardhat/console.sol"; +import "hardhat/console.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; /* @@ -130,7 +130,7 @@ contract StorageV1 is Ownable2StepUpgradeable { return uint8(nodeIdList.length); } - function bit(uint32 self, uint8 index) internal pure returns (uint8) { + function getBit(uint32 self, uint8 index) internal pure returns (uint8) { return uint8(self >> index & 1); } @@ -170,26 +170,6 @@ contract StorageV1 is Ownable2StepUpgradeable { nodeIdList[nodeId] = 0; } - function packShardsToBitmap(uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal view returns (uint32) { - uint32 result; - uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; - for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - if (shardSet[shard] == SET_ON) { - result = setBit(result, shard); - } - } -// console.log('packShardsToBitmap', nodeId, '->', result); - return result; - } - - function unpackBitmapToShards(uint32 bitmap, uint8[SHARD_COUNT][] memory _nodeShardsSet, uint8 nodeId) internal view { -// console.log('unpacking', nodeId,'value', bitmap); - uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; - for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - shardSet[shard] = bit(bitmap, shard) == 1 ? SET_ON : SET_OFF; - } - } - function distributeUnused(uint8[] memory _unusedArr, uint8[] memory _nodeList, uint8[SHARD_COUNT][] memory _nodeShardsSet, @@ -257,7 +237,7 @@ contract StorageV1 is Ownable2StepUpgradeable { while (target <= _arr.length - 1 && _arr[pos].shardCount > _arr[target].shardCount) target++; } else { target = pos - 1; - while (target >=0 && _arr[pos].shardCount < _arr[target].shardCount) target--; + while (target >= 0 && _arr[pos].shardCount < _arr[target].shardCount) target--; } NodeDesc memory tmp = _arr[target]; _arr[target] = _arr[pos]; @@ -291,14 +271,14 @@ contract StorageV1 is Ownable2StepUpgradeable { } function calculateAvgPerNode(uint8[] memory _nodeList) public view returns (uint8) { - uint8 nodeCount = uint8(_nodeList.length); - uint8 total = SHARD_COUNT * rf; - uint8 avgPerNode = total / nodeCount; + uint8 _nodeCount = uint8(_nodeList.length); + uint8 _total = SHARD_COUNT * rf; + uint8 _avgPerNode = _total / _nodeCount; // Math.ceil - if (total % nodeCount > 0) { - avgPerNode = avgPerNode + 1; + if (_total % _nodeCount > 0) { + _avgPerNode = _avgPerNode + 1; } - return avgPerNode; + return _avgPerNode; } function _shuffle() private returns (uint8) { @@ -307,7 +287,7 @@ contract StorageV1 is Ownable2StepUpgradeable { require(_rf >= 1 && _rf <= 20, "bad rf"); require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); - uint _maxNode = 0; + uint8 _maxNode = 0; // console.log('node ids available:'); for (uint i = 0; i < _nodeList.length; i++) { @@ -322,18 +302,13 @@ contract StorageV1 is Ownable2StepUpgradeable { require(_maxNode < MAX_NODE_ID); // copy storage to memory - // nodeShardsSet[i][j] = 1, if nodeI has shard J - // nodeShardsSet[i][j] = 0, if nodeI has no shard J assigned + // nodeShardsSet[i]: bit(J) = 1, if nodeI has shard J uint8[] memory _nodeModifiedSet = new uint8[](_maxNode + 1); - // n arrays , each is of SHARD_COUNT size - uint8[SHARD_COUNT][] memory _nodeShardsSet = new uint8[SHARD_COUNT][](_maxNode + 1); + uint32[] memory _nodeShardsBitmap = new uint32[](_maxNode + 1); for (uint i = 0; i < _nodeList.length; i++) { uint8 nodeId = _nodeList[i]; require(nodeId >= 1, 'nodes are 1 based'); - unpackBitmapToShards(mapNodeToShards[nodeId], _nodeShardsSet, nodeId); - - uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; - require(shardSet.length == SHARD_COUNT, 'bad length'); + _nodeShardsBitmap[nodeId] = mapNodeToShards[nodeId]; } // todo remove // console.log('after unpacking from storage'); @@ -361,16 +336,16 @@ contract StorageV1 is Ownable2StepUpgradeable { } // todo REMOVE -// console.log('unused after applying rf'); -// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); + console.log('unused after applying rf'); + for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); // check unused, and no-longer assigned for (uint i = 0; i < _nodeList.length; i++) { uint nodeId = _nodeList[i]; - uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; - for (uint shard = 0; shard < SHARD_COUNT; shard++) { // todo wtf is this + uint32 shardmask = _nodeShardsBitmap[nodeId]; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { // todo wtf is this // search this shard - if (shardSet[nodeId] == SET_OFF) { + if (getBit(shardmask, shard) == 0) { continue; } int unusedPos = - 1; @@ -383,7 +358,7 @@ contract StorageV1 is Ownable2StepUpgradeable { // decide if (unusedPos == - 1) { // over-assigned - this food is no longer available - shardSet[shard] = SET_OFF; + _nodeShardsBitmap[nodeId] = setBit(shardmask, shard); _nodeModifiedSet[nodeId]++; } else { // this food is used @@ -392,8 +367,8 @@ contract StorageV1 is Ownable2StepUpgradeable { } } // todo REMOVE -// console.log('unused after removing existing mappings'); -// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused2 ', _unusedArr[i]); + console.log('unused after removing existing mappings'); + for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused2 ', _unusedArr[i]); // for (uint8 i = 0; i < _nodeList.length; i++) { // uint8 nodeId = _nodeList[i]; // @@ -428,10 +403,13 @@ contract StorageV1 is Ownable2StepUpgradeable { // console.log('avg per node', avgPerNode); // 1 take unused, offer it only to poor - distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); + distributeUnused2(_unusedArr, _nodeList, _maxNode, _nodeShardsBitmap, _nodeModifiedSet, 0); +// distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); +// return 0; // todo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + /* // todo remove -// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused3 ', _unusedArr[i]); + for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused3 ', _unusedArr[i]); // for (uint8 i = 0; i < _nodeList.length; i++) { // uint8 nodeId = _nodeList[i]; // @@ -507,14 +485,15 @@ contract StorageV1 is Ownable2StepUpgradeable { // 3 take unused food, offer it to everyone distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, false, avgPerNode); +*/ // 4 save to storage , only modified nodes uint8 _modifiedNodes = 0; { for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { if (_nodeModifiedSet[node] > 0) { - uint32 bitmap = packShardsToBitmap(_nodeShardsSet, node); + uint32 bitmap = _nodeShardsBitmap[node]; mapNodeToShards[node] = bitmap; -// console.log(node, ' stores bitmask ', bitmap); + console.log(node, ' stores bitmask ', bitmap); _modifiedNodes++; } } @@ -526,12 +505,152 @@ contract StorageV1 is Ownable2StepUpgradeable { for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { if (_nodeModifiedSet[nodeId] > 0) { _modifiedNodesArr[pos++] = nodeId; -// console.log('shuffle() node modified', nodeId); + console.log('shuffle() node modified', nodeId); } } -// console.log('emitting ', _modifiedNodesArr.length); + console.log('emitting ', _modifiedNodesArr.length); emit SNodeMappingChanged(_modifiedNodesArr); } return _modifiedNodes; } + + // NEW VERSION + + function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap, int _left, int _right) internal { + int i = _left; + int j = _right; + if (i == j) return; + uint8 pivotCount = _countersMap[uint(_nodesList[uint(_left + (_right - _left) / 2)])]; + while (i <= j) { + while (_countersMap[_nodesList[uint(i)]] < pivotCount) i++; + while (pivotCount < _countersMap[_nodesList[uint(j)]]) j--; + if (i <= j) { + (_nodesList[uint(i)], _nodesList[uint(j)]) = (_nodesList[uint(j)], _nodesList[uint(i)]); + i++; + j--; + } + } + if (_left < j) sortCounters(_nodesList, _countersMap, _left, j); + if (i < _right) sortCounters(_nodesList, _countersMap, i, _right); + } + + function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap) internal { + // todo remove + for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { + require(nodeId < _countersMap.length); + } + + sortCounters(_nodesList, _countersMap, 0, int(_nodesList.length - 1)); + + // todo remove + for (uint i = 0; i < _nodesList.length; i++) { + console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); + } + for (uint i = 1; i < _nodesList.length; i++) { + require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed'); + } + } + + function resortCountersRow(uint8[] memory _nodesList, uint8[] memory _countersMap, uint pos, bool increment) internal { + // todo remove +// console.log('resortCountersRow() total nodes:', _nodesList.length, ' pos:', pos); +// console.log('before sort'); +// for (uint i = 0; i < _nodesList.length; i++) { +// console.log('#', i); +// console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); +// } + + int cur = int(pos); + if (increment) { + while (cur + 1 >= 0 && cur + 1 <= int(_nodesList.length - 1) + && _countersMap[_nodesList[pos]] > _countersMap[_nodesList[uint(cur + 1)]]) { + cur++; + } + } else { + while (cur - 1 >= 0 && cur - 1 <= int(_nodesList.length - 1) + && _countersMap[_nodesList[pos]] < _countersMap[_nodesList[uint(cur - 1)]]) { + cur--; + } + } + if(cur !=int(pos)) { +// console.log('moved to new'); + console.log(uint(pos)); + console.log(uint(cur)); + uint8 tmp = _nodesList[uint(cur)]; + _nodesList[uint(cur)] = _nodesList[pos]; + _nodesList[pos] = tmp; + } + // todo remove +// console.log('after sort'); +// for (uint i = 0; i < _nodesList.length; i++) { +// console.log('#', i); +// console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); +// } + for (uint i = 1; i < _nodesList.length; i++) { + require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed'); + } + } + + function buildCounters( + uint8[] memory _nodeList, + uint8 _maxNode, + uint32[] memory _nodeShardsBitmap + ) private pure returns (uint8[] memory) { + uint8[] memory counters = new uint8[](_maxNode + 1); + // init nodeArr + for (uint i = 0; i < _nodeList.length; i++) { + uint8 nodeId = _nodeList[i]; + uint32 shardmask = _nodeShardsBitmap[nodeId]; + uint8 count = 0; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + if (getBit(shardmask, shard) == 1) { + count++; + } + } + counters[i] = count; + } + return counters; + } + + function distributeUnused2(uint8[] memory _unusedArr, + uint8[] memory _nodeList, + uint8 _maxNode, + uint32[] memory _nodeShardsBitmap, + uint8[] memory _nodeModifiedSet, + uint8 _nodeThreshold + ) internal { + uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); + sortCounters(_nodeList, _countersMap); + // _nodeList is sorted asc + + // with every unused shard + for (uint i = 0; i < _unusedArr.length; i++) { + uint8 shard = _unusedArr[i]; + if (shard == NULL_SHARD) { + continue; + } + + // give it to someone (from poor to rich) and stop (and resort) + for (uint8 j = 0; j < _nodeList.length; j++) { + uint8 nodeId = _nodeList[j]; + if (_nodeThreshold >0 && _countersMap[nodeId] >= _nodeThreshold) { + continue; + } + uint32 shardmask = _nodeShardsBitmap[nodeId]; + uint8 nodeHasShard = getBit(shardmask, shard); + if (nodeHasShard==0) { // todo stopOnAvg ???????????????????????? + _unusedArr[i] = NULL_SHARD; + + _nodeShardsBitmap[nodeId] = setBit(shardmask, shard); + _countersMap[nodeId]++; + _nodeModifiedSet[nodeId]++; + resortCountersRow(_nodeList, _countersMap, j, true); + console.log(shard, ': unused to node ->', nodeId); + console.log('counters', _countersMap[nodeId], 'bitmap', _nodeShardsBitmap[nodeId]); + console.log('nodeModified', _nodeModifiedSet[nodeId]); + break; + } + } + } + } } diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 595f331..8ce1d32 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -183,7 +183,14 @@ describe("StorageTest", function () { expect(ct.address).to.be.properAddress; }) - it("TestBasic", async function () { + it('test0', async () => { + let s = await State.readFromEvm(); + s.checkRf(1); + assert.equal(await ct.nodeCount(), 0); + assert.equal(await ct.SHARD_COUNT(), 32); + }) + + it("test1", async function () { console.log(nodes[1]); let tx = await ct.addNodeAndStake(nodes[1]); await expect(tx).to.emit(ct, "SNodeMappingChanged").withArgs([1]); @@ -192,14 +199,9 @@ describe("StorageTest", function () { s.checkRf(1); }); - it('test0node', async () => { - let s = await State.readFromEvm(); - s.checkRf(1); - assert.equal(await ct.nodeCount(), 0); - assert.equal(await ct.SHARD_COUNT(), 32); - }) - it('test1node-', async () => { + + it('test2', async () => { let t1 = await ct.addNodeAndStake(nodes[1]); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([1]); let s = await State.readFromEvm(); From 7431ddd2942296b996127be18feb7e5d975849bf Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 15:35:06 +0400 Subject: [PATCH 30/84] add: Storage.sol - opt version (demand works) --- smart-contracts/contracts/Storage.sol | 81 +++++++++++++++++++++------ smart-contracts/test/Storage.test.ts | 39 +++++++++---- 2 files changed, 92 insertions(+), 28 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 6db0c99..d3885b0 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -169,7 +169,7 @@ contract StorageV1 is Ownable2StepUpgradeable { // valid nodeId ; filter it out; don't shrink the storage array because it's expensive nodeIdList[nodeId] = 0; } - +/* function distributeUnused(uint8[] memory _unusedArr, uint8[] memory _nodeList, uint8[SHARD_COUNT][] memory _nodeShardsSet, @@ -206,7 +206,7 @@ contract StorageV1 is Ownable2StepUpgradeable { } } } - } + }*/ function sort(NodeDesc[] memory _arr, int _left, int _right) internal { int i = _left; @@ -270,7 +270,8 @@ contract StorageV1 is Ownable2StepUpgradeable { return nodeDesc; } - function calculateAvgPerNode(uint8[] memory _nodeList) public view returns (uint8) { + function calculateAvgPerNode(uint8[] memory _nodeList, uint8[] memory _countersMap + ) public view returns (uint avgPerNode, uint demand) { uint8 _nodeCount = uint8(_nodeList.length); uint8 _total = SHARD_COUNT * rf; uint8 _avgPerNode = _total / _nodeCount; @@ -278,7 +279,22 @@ contract StorageV1 is Ownable2StepUpgradeable { if (_total % _nodeCount > 0) { _avgPerNode = _avgPerNode + 1; } - return _avgPerNode; + uint _demand = 0; + for (uint i = 0; i < _nodeList.length; i++) { + uint8 nodeId = _nodeList[i]; + uint8 shardCount = _countersMap[nodeId]; + if (shardCount < _avgPerNode) { + console.log('checking demand for', nodeId, shardCount); + _demand += _avgPerNode - shardCount; + } + } + + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); + } + + return (_avgPerNode, _demand); } function _shuffle() private returns (uint8) { @@ -399,11 +415,15 @@ contract StorageV1 is Ownable2StepUpgradeable { _unusedArr = _tmp; } - uint8 avgPerNode = calculateAvgPerNode(_nodeList); -// console.log('avg per node', avgPerNode); - // 1 take unused, offer it only to poor - distributeUnused2(_unusedArr, _nodeList, _maxNode, _nodeShardsBitmap, _nodeModifiedSet, 0); + uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); + uint _assignedCounter = distributeUnused2(_unusedArr, _nodeList, _countersMap, _maxNode, _nodeShardsBitmap, _nodeModifiedSet, 0); + uint _avgPerNode; + uint _demand; + (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); + console.log('avgPerNode', _avgPerNode); + console.log('demand', _demand); + // distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); // return 0; // todo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -572,7 +592,7 @@ contract StorageV1 is Ownable2StepUpgradeable { cur--; } } - if(cur !=int(pos)) { + if (cur != int(pos)) { // console.log('moved to new'); console.log(uint(pos)); console.log(uint(cur)); @@ -595,34 +615,41 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8[] memory _nodeList, uint8 _maxNode, uint32[] memory _nodeShardsBitmap - ) private pure returns (uint8[] memory) { - uint8[] memory counters = new uint8[](_maxNode + 1); + ) private view returns (uint8[] memory) { + uint8[] memory _countersMap = new uint8[](_maxNode + 1); // init nodeArr for (uint i = 0; i < _nodeList.length; i++) { uint8 nodeId = _nodeList[i]; uint32 shardmask = _nodeShardsBitmap[nodeId]; + console.log(nodeId, 'has shardmask', shardmask); uint8 count = 0; for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { if (getBit(shardmask, shard) == 1) { count++; } } - counters[i] = count; + _countersMap[nodeId] = count; + } + console.log('buildCounters()'); + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); } - return counters; + + return _countersMap; } function distributeUnused2(uint8[] memory _unusedArr, uint8[] memory _nodeList, + uint8[] memory _countersMap, uint8 _maxNode, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, uint8 _nodeThreshold - ) internal { - uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); + ) internal returns (uint){ sortCounters(_nodeList, _countersMap); // _nodeList is sorted asc - + uint _assignedCounter = 0; // with every unused shard for (uint i = 0; i < _unusedArr.length; i++) { uint8 shard = _unusedArr[i]; @@ -633,18 +660,19 @@ contract StorageV1 is Ownable2StepUpgradeable { // give it to someone (from poor to rich) and stop (and resort) for (uint8 j = 0; j < _nodeList.length; j++) { uint8 nodeId = _nodeList[j]; - if (_nodeThreshold >0 && _countersMap[nodeId] >= _nodeThreshold) { + if (_nodeThreshold > 0 && _countersMap[nodeId] >= _nodeThreshold) { continue; } uint32 shardmask = _nodeShardsBitmap[nodeId]; uint8 nodeHasShard = getBit(shardmask, shard); - if (nodeHasShard==0) { // todo stopOnAvg ???????????????????????? + if (nodeHasShard == 0) { // todo stopOnAvg ???????????????????????? _unusedArr[i] = NULL_SHARD; _nodeShardsBitmap[nodeId] = setBit(shardmask, shard); _countersMap[nodeId]++; _nodeModifiedSet[nodeId]++; resortCountersRow(_nodeList, _countersMap, j, true); + _assignedCounter++; console.log(shard, ': unused to node ->', nodeId); console.log('counters', _countersMap[nodeId], 'bitmap', _nodeShardsBitmap[nodeId]); console.log('nodeModified', _nodeModifiedSet[nodeId]); @@ -652,5 +680,22 @@ contract StorageV1 is Ownable2StepUpgradeable { } } } + console.log('distributeUnused2 counters'); + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); + } + + return _assignedCounter; + } + + function calculateDemand(uint8[] memory _unusedArr, + uint8[] memory _nodeList, + uint8 _maxNode, + uint32[] memory _nodeShardsBitmap, + uint8[] memory _nodeModifiedSet, + uint8 _nodeThreshold + ) internal { + } } diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 8ce1d32..b2f54ef 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -197,16 +197,6 @@ describe("StorageTest", function () { let s = await State.readFromEvm(); s.checkNodeCount(1); s.checkRf(1); - }); - - - - it('test2', async () => { - let t1 = await ct.addNodeAndStake(nodes[1]); - await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([1]); - let s = await State.readFromEvm(); - s.checkRf(1); - s.checkNodeCount(1); s.assertMapping(nodes[1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, @@ -214,6 +204,35 @@ describe("StorageTest", function () { 30, 31]); }); + + + it('test2', async () => { + { + let t1 = await ct.addNodeAndStake(nodes[1]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([1]); + let s = await State.readFromEvm(); + s.checkRf(1); + s.checkNodeCount(1); + s.assertMapping(nodes[1], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]); + } + { + let t1 = await ct.addNodeAndStake(nodes[2]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([2]); + let s = await State.readFromEvm(); + s.checkRf(2); + s.checkNodeCount(2); + s.assertMapping(nodes[2], + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]); + } + }); + it('test_5to6', async () => { let nodeCount = 0; for (let nodeId = 1; nodeId <= 6; nodeId++) { From dd2a1fd55ddba445022b3ba81432fcfcd8fe4292 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 17:47:43 +0400 Subject: [PATCH 31/84] add: Storage.sol - opt version (distributeFromRightToLeft) --- smart-contracts/contracts/Storage.sol | 102 ++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 15 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index d3885b0..73016b6 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -130,14 +130,18 @@ contract StorageV1 is Ownable2StepUpgradeable { return uint8(nodeIdList.length); } - function getBit(uint32 self, uint8 index) internal pure returns (uint8) { + function getBit(uint32 self, uint8 index) private pure returns (uint8) { return uint8(self >> index & 1); } - function setBit(uint32 self, uint8 index) internal pure returns (uint32) { + function setBit(uint32 self, uint8 index) private pure returns (uint32) { return self | uint32(1) << index; } + function clearBit(uint32 self, uint8 index) private pure returns (uint32) { + return self & ~(uint32(1) << index); + } + // todo add staking (or merge with Validator code) function addNodeAndStake(address nodeAddress) public returns (uint8) { // console.log('addNodeAndStake', nodeAddress); @@ -208,7 +212,7 @@ contract StorageV1 is Ownable2StepUpgradeable { } }*/ - function sort(NodeDesc[] memory _arr, int _left, int _right) internal { + function sort(NodeDesc[] memory _arr, int _left, int _right) private { int i = _left; int j = _right; if (i == j) return; @@ -226,11 +230,11 @@ contract StorageV1 is Ownable2StepUpgradeable { if (i < _right) sort(_arr, i, _right); } - function sortNodesAndSize(NodeDesc[] memory _arr) internal { + function sortNodesAndSize(NodeDesc[] memory _arr) private { sort(_arr, 0, int(_arr.length - 1)); } - function resortOneItem(NodeDesc[] memory _arr, uint8 pos, bool increment) internal { + function resortOneItem(NodeDesc[] memory _arr, uint8 pos, bool increment) private { uint8 target; if (increment) { target = pos + 1; @@ -418,15 +422,26 @@ contract StorageV1 is Ownable2StepUpgradeable { // 1 take unused, offer it only to poor uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); uint _assignedCounter = distributeUnused2(_unusedArr, _nodeList, _countersMap, _maxNode, _nodeShardsBitmap, _nodeModifiedSet, 0); + console.log('distributed shards count:', _assignedCounter); uint _avgPerNode; uint _demand; (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); console.log('avgPerNode', _avgPerNode); console.log('demand', _demand); -// distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); -// return 0; // todo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + while (_demand > 0) { + uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, _maxNode, + _nodeShardsBitmap, _nodeModifiedSet); + if (movedCount > 0) { + console.log('moved', movedCount, _demand); + _demand -= movedCount; + } else { + console.log('moving finished'); + break; + } + } +// distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); /* // todo remove for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused3 ', _unusedArr[i]); @@ -536,7 +551,7 @@ contract StorageV1 is Ownable2StepUpgradeable { // NEW VERSION - function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap, int _left, int _right) internal { + function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap, int _left, int _right) private { int i = _left; int j = _right; if (i == j) return; @@ -554,7 +569,7 @@ contract StorageV1 is Ownable2StepUpgradeable { if (i < _right) sortCounters(_nodesList, _countersMap, i, _right); } - function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap) internal { + function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap) private { // todo remove for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { require(nodeId < _countersMap.length); @@ -571,7 +586,7 @@ contract StorageV1 is Ownable2StepUpgradeable { } } - function resortCountersRow(uint8[] memory _nodesList, uint8[] memory _countersMap, uint pos, bool increment) internal { + function resortCountersRow(uint8[] memory _nodesList, uint8[] memory _countersMap, uint pos, bool increment) private { // todo remove // console.log('resortCountersRow() total nodes:', _nodesList.length, ' pos:', pos); // console.log('before sort'); @@ -646,7 +661,7 @@ contract StorageV1 is Ownable2StepUpgradeable { uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, uint8 _nodeThreshold - ) internal returns (uint){ + ) private returns (uint){ sortCounters(_nodeList, _countersMap); // _nodeList is sorted asc uint _assignedCounter = 0; @@ -689,13 +704,70 @@ contract StorageV1 is Ownable2StepUpgradeable { return _assignedCounter; } - function calculateDemand(uint8[] memory _unusedArr, + // convers bit shard mask (ex: 0b1101) to shard numbers (ex: [0,2,3]) and sorts randomly ([2, 3, 0]) + function bitMaskToRandomShards(uint32 shardmask, uint8[] memory shardList) private { + for (uint i = 0; i < SHARD_COUNT; i++) { + shardList[i] = 0; + } + uint len = 0; + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + if (getBit(shardmask, shard) == 1) { + shardList[len++] = shard; + } + } + for (uint8 i = 0; i < len; i++) { + uint8 rnd = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, i))) % len); + uint8 tmp = shardList[i]; + shardList[i] = shardList[rnd]; + shardList[rnd] = tmp; + } + } + + function distributeFromRightToLeft( uint8[] memory _nodeList, + uint8[] memory _countersMap, uint8 _maxNode, uint32[] memory _nodeShardsBitmap, - uint8[] memory _nodeModifiedSet, - uint8 _nodeThreshold - ) internal { + uint8[] memory _nodeModifiedSet + ) private returns (uint){ + sortCounters(_nodeList, _countersMap); + uint i = 0; + uint j = _nodeList.length - 1; + uint8[] memory transferShards = new uint8[](SHARD_COUNT); + while (i < j) { + uint8 leftNode = _nodeList[i]; +// uint8 leftShardsCount = _countersMap[i]; +// uint32 leftShardsMask = _nodeShardsBitmap[leftNode]; + uint8 rightNode = _nodeList[j]; +// uint8 rightShardsCount = _countersMap[j]; // todo check rich.size > poor.size + 1 +// uint32 rightShardsMask = _nodeShardsBitmap[rightNode]; + uint32 transfer = (_nodeShardsBitmap[leftNode] ^ _nodeShardsBitmap[rightNode]) + & (~_nodeShardsBitmap[rightNode]); + if (transfer != 0) { + // give + bitMaskToRandomShards(transfer, transferShards); + for (uint i = 0; i < transferShards.length; i++) { + uint8 shard = transferShards[i]; + _nodeShardsBitmap[rightNode] = clearBit(rightShardsMask, shard); + _countersMap[rightNode]--; + _nodeModifiedSet[rightNode]++; + resortCountersRow(_nodeList, _countersMap, rightNode, false); + + _nodeShardsBitmap[leftNode] = setBit(leftShardsMask, shard); + _countersMap[leftNode]++; + _nodeModifiedSet[leftNode]++; + resortCountersRow(_nodeList, _countersMap, rightNode, true); + + console.log(shard, rightNode, '->', leftNode); + return 1; + } + } + + + i++; + j--; + } + return 0; } } From 63aa7126ba9ff5259a4fe5730c9d3e5586daa9f7 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 19:05:48 +0400 Subject: [PATCH 32/84] add: Storage.sol - opt version (tests ok) --- smart-contracts/contracts/Storage.sol | 116 +++++++++++++++----------- 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 73016b6..df02a1f 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -211,7 +211,7 @@ contract StorageV1 is Ownable2StepUpgradeable { } } }*/ - +/* function sort(NodeDesc[] memory _arr, int _left, int _right) private { int i = _left; int j = _right; @@ -250,7 +250,7 @@ contract StorageV1 is Ownable2StepUpgradeable { for (uint i = 1; i < _arr.length; i++) { require(_arr[i].shardCount < _arr[i - 1].shardCount, 'sort failed'); } - } + }*/ // todo resort 1 element addtion: bool onlyNewElement , uint8 newElementPos function buildNodeDesc( @@ -429,11 +429,12 @@ contract StorageV1 is Ownable2StepUpgradeable { console.log('avgPerNode', _avgPerNode); console.log('demand', _demand); + console.log('moving started'); while (_demand > 0) { uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, _maxNode, _nodeShardsBitmap, _nodeModifiedSet); if (movedCount > 0) { - console.log('moved', movedCount, _demand); + console.log('moved count/demand', movedCount, _demand); _demand -= movedCount; } else { console.log('moving finished'); @@ -579,51 +580,68 @@ contract StorageV1 is Ownable2StepUpgradeable { // todo remove for (uint i = 0; i < _nodesList.length; i++) { - console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); + console.log(_nodesList[i], 'has shards size:', _countersMap[_nodesList[i]]); } for (uint i = 1; i < _nodesList.length; i++) { - require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed'); + if (!(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]])) { + revert('sort failed'); + } + } } - function resortCountersRow(uint8[] memory _nodesList, uint8[] memory _countersMap, uint pos, bool increment) private { + // todo remove + function assertSorting(uint8[] memory _nodeList, uint8[] memory _countersMap) private { + { + console.log('after sort'); + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); + } + for (uint i = 1; i < _nodeList.length; i++) { + require(_countersMap[_nodeList[i]] >= _countersMap[_nodeList[i - 1]], 'sort failed (2)'); + } + } + } + + function resortCountersRow(uint8[] memory _nodeList, uint8[] memory _countersMap, uint pos, bool increment) private { // todo remove -// console.log('resortCountersRow() total nodes:', _nodesList.length, ' pos:', pos); -// console.log('before sort'); -// for (uint i = 0; i < _nodesList.length; i++) { -// console.log('#', i); -// console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); -// } + console.log('resortCountersRow() total nodes:', _nodeList.length, ' pos:', pos); + console.log('before sort'); + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); + } int cur = int(pos); if (increment) { - while (cur + 1 >= 0 && cur + 1 <= int(_nodesList.length - 1) - && _countersMap[_nodesList[pos]] > _countersMap[_nodesList[uint(cur + 1)]]) { + while (cur + 1 >= 0 && cur + 1 <= int(_nodeList.length - 1) + && _countersMap[_nodeList[pos]] > _countersMap[_nodeList[uint(cur + 1)]]) { cur++; } } else { - while (cur - 1 >= 0 && cur - 1 <= int(_nodesList.length - 1) - && _countersMap[_nodesList[pos]] < _countersMap[_nodesList[uint(cur - 1)]]) { + while (cur - 1 >= 0 && cur - 1 <= int(_nodeList.length - 1) + && _countersMap[_nodeList[pos]] < _countersMap[_nodeList[uint(cur - 1)]]) { cur--; } } if (cur != int(pos)) { -// console.log('moved to new'); + console.log('moved to new'); console.log(uint(pos)); console.log(uint(cur)); - uint8 tmp = _nodesList[uint(cur)]; - _nodesList[uint(cur)] = _nodesList[pos]; - _nodesList[pos] = tmp; + uint8 tmp = _nodeList[uint(cur)]; + _nodeList[uint(cur)] = _nodeList[pos]; + _nodeList[pos] = tmp; } // todo remove -// console.log('after sort'); -// for (uint i = 0; i < _nodesList.length; i++) { -// console.log('#', i); -// console.log(_nodesList[i], 'has shards size', _countersMap[_nodesList[i]]); -// } - for (uint i = 1; i < _nodesList.length; i++) { - require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed'); + console.log('after sort'); + for (uint i = 0; i < _nodeList.length; i++) { + console.log('#', i); + console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); } +// for (uint i = 1; i < _nodesList.length; i++) { +// require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed (2)'); +// } } function buildCounters( @@ -731,40 +749,38 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8[] memory _nodeModifiedSet ) private returns (uint){ sortCounters(_nodeList, _countersMap); - uint i = 0; uint j = _nodeList.length - 1; uint8[] memory transferShards = new uint8[](SHARD_COUNT); while (i < j) { uint8 leftNode = _nodeList[i]; -// uint8 leftShardsCount = _countersMap[i]; -// uint32 leftShardsMask = _nodeShardsBitmap[leftNode]; uint8 rightNode = _nodeList[j]; -// uint8 rightShardsCount = _countersMap[j]; // todo check rich.size > poor.size + 1 -// uint32 rightShardsMask = _nodeShardsBitmap[rightNode]; uint32 transfer = (_nodeShardsBitmap[leftNode] ^ _nodeShardsBitmap[rightNode]) - & (~_nodeShardsBitmap[rightNode]); + & (~_nodeShardsBitmap[leftNode]); + console.log('>>>>> starting moving from/to', rightNode, leftNode); + console.log('***** shardBitmaps from/to/transfer', transfer, _nodeShardsBitmap[rightNode], _nodeShardsBitmap[leftNode]); if (transfer != 0) { // give - bitMaskToRandomShards(transfer, transferShards); - for (uint i = 0; i < transferShards.length; i++) { - uint8 shard = transferShards[i]; - _nodeShardsBitmap[rightNode] = clearBit(rightShardsMask, shard); - _countersMap[rightNode]--; - _nodeModifiedSet[rightNode]++; - resortCountersRow(_nodeList, _countersMap, rightNode, false); - - _nodeShardsBitmap[leftNode] = setBit(leftShardsMask, shard); - _countersMap[leftNode]++; - _nodeModifiedSet[leftNode]++; - resortCountersRow(_nodeList, _countersMap, rightNode, true); - - console.log(shard, rightNode, '->', leftNode); - return 1; - } - } + bitMaskToRandomShards(transfer, transferShards); // todo get only one random value !!!!!!!!! + uint8 shard = transferShards[0]; + _nodeShardsBitmap[rightNode] = clearBit(_nodeShardsBitmap[rightNode], shard); + _countersMap[rightNode]--; + _nodeModifiedSet[rightNode]++; + _nodeShardsBitmap[leftNode] = setBit(_nodeShardsBitmap[leftNode], shard); + _countersMap[leftNode]++; + _nodeModifiedSet[leftNode]++; + resortCountersRow(_nodeList, _countersMap, i, true); + resortCountersRow(_nodeList, _countersMap, j, false); + + // todo remove + assertSorting(_nodeList, _countersMap); + + console.log(rightNode, '->', leftNode); + console.log('<<<<< done moving shard ', shard); + return 1; + } i++; j--; } From c9df3deaaa9a183f7e450f87ccb77a6fcd07c62c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 2 Sep 2023 21:17:55 +0400 Subject: [PATCH 33/84] add: Storage.sol - opt version (delete nodes, better random values) --- smart-contracts/contracts/Storage.sol | 134 +++++++------------------- 1 file changed, 35 insertions(+), 99 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index df02a1f..39a54a1 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -46,12 +46,6 @@ map after: Map(3) { 3 => Set(7) { 1, 2, 3, 4, 7, 9, 10 } } - -TODO reuse ids when nodes come and go (!) - delete should be in nodeAddrList, nodeIdList -TODO ? use bitmaps for storing subscriptions - use uint128 data type https://github.com/ethereum/solidity-examples/blob/master/src/bits/Bits.sol - */ contract StorageV1 is Ownable2StepUpgradeable { // number of shards; @@ -63,6 +57,7 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8 public constant SET_OFF = 0; uint8 public constant NULL_SHARD = 255; // shard id that does not exists uint8 public constant MAX_NODE_ID = 254; // max nod + uint8 public constant NULL_NODE = 0; // replication factor - how many copies of the same shard should be served by the network // dynamic, @@ -170,88 +165,34 @@ contract StorageV1 is Ownable2StepUpgradeable { delete mapAddrToNodeId[nodeAddress]; revert('no node id found'); } - // valid nodeId ; filter it out; don't shrink the storage array because it's expensive - nodeIdList[nodeId] = 0; - } -/* - function distributeUnused(uint8[] memory _unusedArr, - uint8[] memory _nodeList, - uint8[SHARD_COUNT][] memory _nodeShardsSet, - uint8[] memory _nodeModifiedSet, - bool _stopOnAvg, - uint8 _avgPerNode - ) internal { - // 1 take unused, offer it only to poor - NodeDesc[] memory poorList = buildNodeDesc(_nodeList, _nodeShardsSet); - for (uint i = 0; i < _unusedArr.length; i++) { - uint8 shard = _unusedArr[i]; - if (shard == NULL_SHARD) { - continue; - } - // get all nodes from poor to rich - for (uint j = 0; j < poorList.length; j++) { - NodeDesc memory _poor = poorList[j]; - if (_stopOnAvg && _poor.shardCount >= _avgPerNode) { - continue; - } - require(_poor.node != 0); - sortNodesAndSize(poorList); - uint8[SHARD_COUNT] memory poorShardsSet = _nodeShardsSet[_poor.node]; - if (poorShardsSet[shard] == SET_OFF) { - _unusedArr[i] = NULL_SHARD; + // valid nodeId ; - poorShardsSet[shard] = SET_ON; - _poor.shardCount++; - _nodeModifiedSet[_poor.node]++; - // todo REMOVE -// console.log(shard, ': unused ->', _poor.node); + // cleanup shards + delete mapNodeToShards[nodeId]; - break; - } + // cleanup ids + uint nodeIdLen = nodeIdList.length; + for (uint i = 0; i < nodeIdLen; i++) { + if (nodeIdList[i] == nodeId) { + // shrink array + nodeIdList[i] = nodeIdList[nodeIdLen - 1]; + nodeIdList.pop(); + break; } } - }*/ -/* - function sort(NodeDesc[] memory _arr, int _left, int _right) private { - int i = _left; - int j = _right; - if (i == j) return; - NodeDesc memory pivot = _arr[uint(_left + (_right - _left) / 2)]; - while (i <= j) { - while (_arr[uint(i)].shardCount < pivot.shardCount) i++; - while (pivot.shardCount < _arr[uint(j)].shardCount) j--; - if (i <= j) { - (_arr[uint(i)], _arr[uint(j)]) = (_arr[uint(j)], _arr[uint(i)]); - i++; - j--; + + // cleanup addresses + uint nodeAddrLen = nodeAddrList.length; + for (uint i = 0; i < nodeAddrLen; i++) { + if (nodeAddrList[i] == nodeAddress) { + // shrink array + nodeAddrList[i] = nodeAddrList[nodeAddrLen - 1]; + nodeAddrList.pop(); + break; } } - if (_left < j) sort(_arr, _left, j); - if (i < _right) sort(_arr, i, _right); - } - - function sortNodesAndSize(NodeDesc[] memory _arr) private { - sort(_arr, 0, int(_arr.length - 1)); } - function resortOneItem(NodeDesc[] memory _arr, uint8 pos, bool increment) private { - uint8 target; - if (increment) { - target = pos + 1; - while (target <= _arr.length - 1 && _arr[pos].shardCount > _arr[target].shardCount) target++; - } else { - target = pos - 1; - while (target >= 0 && _arr[pos].shardCount < _arr[target].shardCount) target--; - } - NodeDesc memory tmp = _arr[target]; - _arr[target] = _arr[pos]; - _arr[pos] = tmp; - // todo remove - for (uint i = 1; i < _arr.length; i++) { - require(_arr[i].shardCount < _arr[i - 1].shardCount, 'sort failed'); - } - }*/ - // todo resort 1 element addtion: bool onlyNewElement , uint8 newElementPos function buildNodeDesc( uint8[] memory _nodeList, @@ -434,8 +375,8 @@ contract StorageV1 is Ownable2StepUpgradeable { uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, _maxNode, _nodeShardsBitmap, _nodeModifiedSet); if (movedCount > 0) { - console.log('moved count/demand', movedCount, _demand); _demand -= movedCount; + console.log('moved count/demand', movedCount, _demand); } else { console.log('moving finished'); break; @@ -722,23 +663,19 @@ contract StorageV1 is Ownable2StepUpgradeable { return _assignedCounter; } - // convers bit shard mask (ex: 0b1101) to shard numbers (ex: [0,2,3]) and sorts randomly ([2, 3, 0]) - function bitMaskToRandomShards(uint32 shardmask, uint8[] memory shardList) private { - for (uint i = 0; i < SHARD_COUNT; i++) { - shardList[i] = 0; - } - uint len = 0; - for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - if (getBit(shardmask, shard) == 1) { - shardList[len++] = shard; + // convers bit shard mask (ex: 0b1101) to shard numbers (ex: [0,2,3]) and gets a random one (ex: 2) + function bitMaskToRandomShard(uint32 shardmask, uint8[SHARD_COUNT] memory shardList) private returns (uint8) { + uint8 pos = 0; + uint8 shard = 0; + while (shardmask != 0) { + if (shardmask & 1 == 1) { + shardList[pos++] = shard; } + shardmask >>= 1; + shard++; } - for (uint8 i = 0; i < len; i++) { - uint8 rnd = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, i))) % len); - uint8 tmp = shardList[i]; - shardList[i] = shardList[rnd]; - shardList[rnd] = tmp; - } + uint8 rnd = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, shard, shardmask, pos))) % pos); + return shardList[rnd]; } function distributeFromRightToLeft( @@ -751,7 +688,7 @@ contract StorageV1 is Ownable2StepUpgradeable { sortCounters(_nodeList, _countersMap); uint i = 0; uint j = _nodeList.length - 1; - uint8[] memory transferShards = new uint8[](SHARD_COUNT); + uint8[SHARD_COUNT] memory tmp; while (i < j) { uint8 leftNode = _nodeList[i]; uint8 rightNode = _nodeList[j]; @@ -761,8 +698,7 @@ contract StorageV1 is Ownable2StepUpgradeable { console.log('***** shardBitmaps from/to/transfer', transfer, _nodeShardsBitmap[rightNode], _nodeShardsBitmap[leftNode]); if (transfer != 0) { // give - bitMaskToRandomShards(transfer, transferShards); // todo get only one random value !!!!!!!!! - uint8 shard = transferShards[0]; + uint8 shard = bitMaskToRandomShard(transfer, tmp); _nodeShardsBitmap[rightNode] = clearBit(_nodeShardsBitmap[rightNode], shard); _countersMap[rightNode]--; _nodeModifiedSet[rightNode]++; From 5889c1933188b6ca78b06f95385ccae84517c70b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 4 Sep 2023 14:13:28 +0400 Subject: [PATCH 34/84] add: Storage.sol - delete node tests (1) --- smart-contracts/contracts/Storage.sol | 227 ++++++++------------------ smart-contracts/test/Storage.test.ts | 121 ++++++++------ 2 files changed, 139 insertions(+), 209 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 39a54a1..1ea97f7 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -56,48 +56,49 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8 public constant SET_ON = 1; // for set we use uint8(1) as on, and uint8(0) as off uint8 public constant SET_OFF = 0; uint8 public constant NULL_SHARD = 255; // shard id that does not exists - uint8 public constant MAX_NODE_ID = 254; // max nod + uint8 public constant MAX_NODE_ID = 254; // max node uint8 public constant NULL_NODE = 0; + // ----------------------------- STATE -------------------------------------------------- // replication factor - how many copies of the same shard should be served by the network // dynamic, // ex: 1....20 - uint8 public rf = 1; + uint8 public rf = 0; // if 5 nodes join, we will set rf to 5 and then it won't grow - uint8 public RF_AUTOADJUST_LIMIT = 5; // 0 to turn off + uint8 public RF_TARGET = 5; // 0 to turn off - // NODE DATA - // node address -> nodeId (short address) - // ex: 0xAAAAAAAAA -> 1 - mapping(address => uint8) public mapAddrToNodeId; - address[] public nodeAddrList; // active nodeIds // nodeIds are 1-based // ex: [1,2,3] + // NULL_NODE = EMPTY uint8[] public nodeIdList; + // NULL_NODE = EMPTY + mapping(uint8 => address) public mapNodeIdToAddr; + // nodeId -> shards // shards are 0-based // ex: 1 -> 0,1,2 mapping(uint8 => uint32) public mapNodeToShards; - uint8 private unusedNodeId = 1; + // NODE DATA + // node address -> nodeId (short address) + // ex: 0xAAAAAAAAA -> 1 + mapping(address => uint8) public mapAddrToNodeId; + uint8 private unusedNodeId = 1; - struct NodeDesc { - uint8 node; - uint8 shardCount; - } + // ----------------------------- EVENTS -------------------------------------------------- - event SNodeMappingChanged(uint8[] nodeList); + event SNodeMappingChanged(address[] nodeList); - // ADMIN FUNCTIONS + // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- // allows to set replication factor manually; however this is limited by node count; function overrideRf(uint8 _rf) public onlyOwner { require(_rf <= nodeIdList.length, 'rf is limited by node count'); rf = _rf; - RF_AUTOADJUST_LIMIT = 0; + RF_TARGET = 0; } // allows to set @@ -111,7 +112,8 @@ contract StorageV1 is Ownable2StepUpgradeable { return _shuffle(); } - // END ADMIN FUNCTIONS + // ----------------------------- IMPL -------------------------------------------------- + function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { uint8 node = mapAddrToNodeId[_nodeAddress]; @@ -142,14 +144,16 @@ contract StorageV1 is Ownable2StepUpgradeable { // console.log('addNodeAndStake', nodeAddress); require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0, 'nodeId > 0'); - nodeIdList.push(unusedNodeId); - nodeAddrList.push(nodeAddress); + uint8 newNodeId = unusedNodeId++; + nodeIdList.push(newNodeId); + mapNodeIdToAddr[newNodeId] = nodeAddress; + mapAddrToNodeId[nodeAddress] = newNodeId; + mapNodeToShards[newNodeId] = 0; // for safety only // add more copies of the data if the network can handle it, unless we get enough - if (rf < RF_AUTOADJUST_LIMIT && rf < nodeIdList.length) { + if (RF_TARGET != 0 && rf < RF_TARGET && rf < nodeIdList.length) { rf++; // console.log('rf is now', rf); } - mapAddrToNodeId[nodeAddress] = unusedNodeId; _shuffle(); // console.log('addNodeAndStake finished'); return unusedNodeId++; @@ -157,7 +161,7 @@ contract StorageV1 is Ownable2StepUpgradeable { function removeNode(address nodeAddress) public { uint8 nodeId = mapAddrToNodeId[nodeAddress]; - if (nodeId == 0) { + if (nodeId == NULL_NODE) { revert('no address found'); } if (nodeIdList.length == 0) { @@ -182,44 +186,22 @@ contract StorageV1 is Ownable2StepUpgradeable { } // cleanup addresses - uint nodeAddrLen = nodeAddrList.length; - for (uint i = 0; i < nodeAddrLen; i++) { - if (nodeAddrList[i] == nodeAddress) { - // shrink array - nodeAddrList[i] = nodeAddrList[nodeAddrLen - 1]; - nodeAddrList.pop(); - break; - } - } - } - - // todo resort 1 element addtion: bool onlyNewElement , uint8 newElementPos - function buildNodeDesc( - uint8[] memory _nodeList, - uint8[SHARD_COUNT][] memory _nodeShardsSet - ) private pure returns (NodeDesc[] memory) { - NodeDesc[] memory nodeDesc = new NodeDesc[](_nodeList.length); - // init nodeArr - for (uint i = 0; i < _nodeList.length; i++) { - uint8 nodeId = _nodeList[i]; - uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; - uint8 count = 0; - for (uint shard = 0; shard < shardSet.length; shard++) { - if (shardSet[shard] == SET_ON) { - count++; - } - } - NodeDesc memory ns = NodeDesc(nodeId, count); - nodeDesc[i] = ns; + delete mapNodeIdToAddr[nodeId]; + if (RF_TARGET != 0 && rf > nodeIdList.length) { + rf--; +// console.log('rf is now', rf); } - return nodeDesc; + address[] memory _arr = new address[](1); + _arr[0] = nodeAddress; + emit SNodeMappingChanged(_arr); + _shuffle(); } function calculateAvgPerNode(uint8[] memory _nodeList, uint8[] memory _countersMap ) public view returns (uint avgPerNode, uint demand) { uint8 _nodeCount = uint8(_nodeList.length); uint8 _total = SHARD_COUNT * rf; - uint8 _avgPerNode = _total / _nodeCount; + uint8 _avgPerNode = _nodeCount == 0 ? 0 : _total / _nodeCount; // Math.ceil if (_total % _nodeCount > 0) { _avgPerNode = _avgPerNode + 1; @@ -245,7 +227,7 @@ contract StorageV1 is Ownable2StepUpgradeable { function _shuffle() private returns (uint8) { uint8[] memory _nodeList = nodeIdList; uint8 _rf = rf; - require(_rf >= 1 && _rf <= 20, "bad rf"); + require(_rf >= 0 && _rf <= MAX_NODE_ID, "bad rf"); require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); uint8 _maxNode = 0; @@ -360,109 +342,32 @@ contract StorageV1 is Ownable2StepUpgradeable { _unusedArr = _tmp; } - // 1 take unused, offer it only to poor - uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); - uint _assignedCounter = distributeUnused2(_unusedArr, _nodeList, _countersMap, _maxNode, _nodeShardsBitmap, _nodeModifiedSet, 0); - console.log('distributed shards count:', _assignedCounter); - uint _avgPerNode; - uint _demand; - (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); - console.log('avgPerNode', _avgPerNode); - console.log('demand', _demand); - - console.log('moving started'); - while (_demand > 0) { - uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, _maxNode, - _nodeShardsBitmap, _nodeModifiedSet); - if (movedCount > 0) { - _demand -= movedCount; - console.log('moved count/demand', movedCount, _demand); - } else { - console.log('moving finished'); - break; - } - } - -// distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, true, avgPerNode); - /* - // todo remove - for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused3 ', _unusedArr[i]); -// for (uint8 i = 0; i < _nodeList.length; i++) { -// uint8 nodeId = _nodeList[i]; -// -// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[i]; -// for(uint8 k = 0; k 0;) { - i--; - NodeDesc memory rich = richList[i]; - if (rich.shardCount < avgPerNode / 2) { - continue; - } - sortNodesAndSize(poorList); // resort after every donation - uint8[SHARD_COUNT] memory richShardsSet = _nodeShardsSet[rich.node]; - // every item from the end of the queue (to minimize the data moves) - for (uint shard = richShardsSet.length; shard > 0;) { - shard--; - // to every poor - for (uint j = 0; j < poorList.length && j < i; j++) { // todo is j < i correct ??????? - NodeDesc memory poor = poorList[j]; - uint8[SHARD_COUNT] memory poorShardsSet = _nodeShardsSet[poor.node]; - if (!(rich.shardCount > poor.shardCount + 1)) { - break; - } - if ((poorShardsSet[shard] == SET_OFF)) { -// console.log('rich ', rich.shardCount, ' poor', poor.shardCount); - richShardsSet[shard] = SET_OFF; - rich.shardCount--; - _nodeModifiedSet[rich.node]++; - - poorShardsSet[shard] = SET_ON; - poor.shardCount++; - _nodeModifiedSet[poor.node]++; - // todo remove -// console.log(shard, rich.node, '->', poor.node); - break; - } + if (nodeIdList.length > 0) { + // 1 take unused and share + uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); + uint _assignedCounter = distributeUnused2(_unusedArr, _nodeList, _countersMap, _nodeShardsBitmap, _nodeModifiedSet, 0); + console.log('distributed shards count:', _assignedCounter); + uint _avgPerNode; + uint _demand; + (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); + console.log('avgPerNode', _avgPerNode); + console.log('demand', _demand); + + // 2 take from rich and share, until the demand kpi is reached + console.log('moving started'); + while (_demand > 0) { + uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, + _nodeShardsBitmap, _nodeModifiedSet); + if (movedCount > 0) { + _demand -= movedCount; + console.log('moved count/demand', movedCount, _demand); + } else { + console.log('moving finished'); + break; } } } - // todo remove -// console.log('after redistribution'); -// for (uint i = 0; i < _nodeList.length; i++) { -// uint8 nodeId = _nodeList[i]; -//// if(nodeId!=1) { -//// break; -//// } -// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; -// uint count = 0; -// for (uint8 k = 0; k < shardSet.length; k++) { -// if (shardSet[k] == SET_ON) { -// console.log(nodeId, ' has ', k); -// count++; -// } -// } -// if (count == 0) { -// console.log(nodeId, ' has nothing'); -// } -// } - // 3 take unused food, offer it to everyone - distributeUnused(_unusedArr, _nodeList, _nodeShardsSet, _nodeModifiedSet, false, avgPerNode); -*/ // 4 save to storage , only modified nodes uint8 _modifiedNodes = 0; { @@ -477,16 +382,16 @@ contract StorageV1 is Ownable2StepUpgradeable { } // 5 send events { - uint8[] memory _modifiedNodesArr = new uint8[](_modifiedNodes); + address[] memory _modifiedAddrArr = new address[](_modifiedNodes); uint pos = 0; for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { if (_nodeModifiedSet[nodeId] > 0) { - _modifiedNodesArr[pos++] = nodeId; + _modifiedAddrArr[pos++] = mapNodeIdToAddr[nodeId]; console.log('shuffle() node modified', nodeId); } } - console.log('emitting ', _modifiedNodesArr.length); - emit SNodeMappingChanged(_modifiedNodesArr); + console.log('emitting ', _modifiedAddrArr.length); + emit SNodeMappingChanged(_modifiedAddrArr); } return _modifiedNodes; } @@ -512,6 +417,9 @@ contract StorageV1 is Ownable2StepUpgradeable { } function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap) private { + if (_nodesList.length == 0) { + return; + } // todo remove for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { require(nodeId < _countersMap.length); @@ -616,7 +524,6 @@ contract StorageV1 is Ownable2StepUpgradeable { function distributeUnused2(uint8[] memory _unusedArr, uint8[] memory _nodeList, uint8[] memory _countersMap, - uint8 _maxNode, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, uint8 _nodeThreshold @@ -681,10 +588,12 @@ contract StorageV1 is Ownable2StepUpgradeable { function distributeFromRightToLeft( uint8[] memory _nodeList, uint8[] memory _countersMap, - uint8 _maxNode, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet ) private returns (uint){ + if (_nodeList.length == 0) { + return 0; + } sortCounters(_nodeList, _countersMap); uint i = 0; uint j = _nodeList.length - 1; diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index b2f54ef..6c433ed 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -13,6 +13,11 @@ import {CollectionUtil} from "./uitlz/collectionUtil"; import {NodeStatus} from "./ValidatorContractHelper"; let debug = console.log; +let ct: StorageContract & Contract; +let nodes = [null]; +for (let i = 1; i <= 100; i++) { + nodes.push('0x' + i.toString().padStart(40, '0')); +} class DeployInfo { @@ -31,31 +36,13 @@ async function state1(): Promise { return {storageCt, owner}; } -let ct: StorageContract & Contract; - -/*assertCorrectReplicationFactor() { - let shardToCnt = new Map; - for (const [nodeId, shards] of this.map) { - for (const sh of shards) { - let counter = shardToCnt.get(sh); - counter = counter == null ? 1 : ++counter; - shardToCnt.set(sh, counter); - } - } - if (this.nodeCount == 0) { - return; - } - for (let sh = 1; sh <= this.shardCount; sh++) { - if (shardToCnt.get(sh) != this.rf) { - throw new Error(`not enough shards for ${sh}`); - } - } -}*/ interface StorageContract { nodeAddrList(pos: number): Promise; + mapNodeIdToAddr(nodeId:number): Promise; + nodeIdList(pos: number): Promise; rf(): Promise; @@ -66,7 +53,16 @@ interface StorageContract { addNodeAndStake(addr: string): Promise; + removeNode(addr:string): Promise; + SHARD_COUNT(): Promise; + + // admin functions + + overrideRf(number): Promise; + + shuffle(): Promise; + } // read everything from the contract state to ease the testing @@ -82,14 +78,14 @@ class State { s.shardCount = await ct.SHARD_COUNT(); let nodeCount = await ct.nodeCount(); for (let i = 0; i < nodeCount; i++) { - let addr = await ct.nodeAddrList(i); let nodeId = await ct.nodeIdList(i); + let addr = await ct.mapNodeIdToAddr(nodeId); let shardsBitSet = await ct.getNodeShardsByAddr(addr); let shardsIntArr = BitUtil.bitsToPositions(shardsBitSet); let shardsIntSet = CollectionUtil.arrayToSet(shardsIntArr); s.map.set(addr, shardsIntSet); s.nodeList.add(addr); - console.log(addr, `node:${nodeId} bitset:${shardsBitSet} -> size:${shardsIntSet.size} `, CollectionUtil.setToArray(shardsIntSet)); + console.log(`node:${nodeId} addr:${addr} bitset:${shardsBitSet} -> size:${shardsIntSet.size} `, CollectionUtil.setToArray(shardsIntSet)); } return s; } @@ -157,25 +153,7 @@ async function assertNodeListLength(e: number) { } -/* - - -*/ - - -async function assertMapping(addr: string, shardsAssigned: number[]) { - const nodeShardsByAddr = await ct.getNodeShardsByAddr(addr); - assert.deepEqual(BitUtil.bitsToPositions(nodeShardsByAddr), shardsAssigned); - console.log(`assert ${addr} has good mapping`); -} - -let nodes = [null]; -for (let i = 1; i <= 100; i++) { - nodes.push('0x' + i.toString().padStart(40, '0')); -} - - -describe("StorageTest", function () { +describe("StorageTestAutoRf", function () { beforeEach(async () => { const state = await loadFixture(state1); @@ -185,7 +163,7 @@ describe("StorageTest", function () { it('test0', async () => { let s = await State.readFromEvm(); - s.checkRf(1); + s.checkRf(0); assert.equal(await ct.nodeCount(), 0); assert.equal(await ct.SHARD_COUNT(), 32); }) @@ -193,7 +171,7 @@ describe("StorageTest", function () { it("test1", async function () { console.log(nodes[1]); let tx = await ct.addNodeAndStake(nodes[1]); - await expect(tx).to.emit(ct, "SNodeMappingChanged").withArgs([1]); + await expect(tx).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); let s = await State.readFromEvm(); s.checkNodeCount(1); s.checkRf(1); @@ -205,11 +183,10 @@ describe("StorageTest", function () { }); - it('test2', async () => { { let t1 = await ct.addNodeAndStake(nodes[1]); - await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([1]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); let s = await State.readFromEvm(); s.checkRf(1); s.checkNodeCount(1); @@ -221,7 +198,7 @@ describe("StorageTest", function () { } { let t1 = await ct.addNodeAndStake(nodes[2]); - await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([2]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); let s = await State.readFromEvm(); s.checkRf(2); s.checkNodeCount(2); @@ -252,7 +229,7 @@ describe("StorageTest", function () { it('test_1to5_6to10', async () => { let s = await State.readFromEvm(); - s.checkRf(1); + s.checkRf(0); s.checkNodeCount(0); s.checkDistribution(); @@ -264,7 +241,7 @@ describe("StorageTest", function () { const addr = nodes[nodeId]; console.log('test adds ', addr); let t1 = await ct.addNodeAndStake(addr); - await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodeId]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([addr]); nodeCount++; // check that replication count incremented // check that event affected only this one node @@ -283,8 +260,9 @@ describe("StorageTest", function () { } // we have 5 nodes - await assertRf(5); - await assertNodeListLength(5); + let s1 = await State.readFromEvm(); + s1.checkRf(5); + s1.checkNodeCount(5); // add 6 to 10 for (let nodeId = 6; nodeId <= 10; nodeId++) { @@ -302,4 +280,47 @@ describe("StorageTest", function () { }); +}); + + +describe("StorageTestNoAutoRf", function () { + + beforeEach(async () => { + const state = await loadFixture(state1); + ct = state.storageCt; + expect(ct.address).to.be.properAddress; + }) + + it('test_add2_remove2', async () => { + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 2; nodeId++) { + const addr = nodes[nodeId]; + console.log('test adds ', addr); + let t1 = await ct.addNodeAndStake(addr); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[nodeId]]); + nodeCount++; + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + { + let t1 = ct.removeNode(nodes[1]); + nodeCount--; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); // raised by delete + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + { + let t1 = ct.removeNode(nodes[2]); + nodeCount--; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); // raised by delete + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + }) }); \ No newline at end of file From 6501dbdc1b526baecbcd75253413ea0d3812968e Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 5 Sep 2023 10:33:14 +0400 Subject: [PATCH 35/84] add: Storage.sol - large amount of nodes, tests, upgradable, uint8 issues --- smart-contracts/contracts/Storage.sol | 245 ++++++++++++++----------- smart-contracts/hardhat.config.ts | 14 +- smart-contracts/package.json | 2 +- smart-contracts/test/Storage.test.ts | 253 ++++++++++++++++++++++---- 4 files changed, 372 insertions(+), 142 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 1ea97f7..39dfe09 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.17; // todo remove import "hardhat/console.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; /* @@ -47,7 +48,7 @@ map after: Map(3) { } */ -contract StorageV1 is Ownable2StepUpgradeable { +contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // number of shards; // this value should not change after deploy // also this should match data type in mapNodeToShards (uint32/64/128/256) @@ -63,9 +64,9 @@ contract StorageV1 is Ownable2StepUpgradeable { // replication factor - how many copies of the same shard should be served by the network // dynamic, // ex: 1....20 - uint8 public rf = 0; + uint8 public rf; // if 5 nodes join, we will set rf to 5 and then it won't grow - uint8 public RF_TARGET = 5; // 0 to turn off + uint8 public rfTarget; // 0 to turn off // active nodeIds // nodeIds are 1-based @@ -86,19 +87,48 @@ contract StorageV1 is Ownable2StepUpgradeable { // ex: 0xAAAAAAAAA -> 1 mapping(address => uint8) public mapAddrToNodeId; - uint8 private unusedNodeId = 1; + uint8 private unusedNodeId; + + address public validatorContract; + + uint16 public protocolVersion; // ----------------------------- EVENTS -------------------------------------------------- event SNodeMappingChanged(address[] nodeList); + // ----------------------------- UPGRADABLE -------------------------------------------------- + + // an empty constructor; constructor is replaced with initialize() + constructor() { + } + + // called only once when a proxy gets deployed; for updates use reinitializer + function initialize( + uint16 protocolVersion_, + address validatorContract_, + uint8 rfTarget_ + ) initializer public { + // init libraries + __UUPSUpgradeable_init(); + __Ownable_init_unchained(); + + unusedNodeId = 1; + rf = 0; + protocolVersion = protocolVersion_; + rfTarget = rfTarget_; + validatorContract = validatorContract_; + } + + function _authorizeUpgrade(address) internal override onlyOwner {} + // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- // allows to set replication factor manually; however this is limited by node count; function overrideRf(uint8 _rf) public onlyOwner { - require(_rf <= nodeIdList.length, 'rf is limited by node count'); +// require(_rf <= nodeIdList.length, 'rf is limited by node count'); rf = _rf; - RF_TARGET = 0; + rfTarget = 0; } // allows to set @@ -112,54 +142,35 @@ contract StorageV1 is Ownable2StepUpgradeable { return _shuffle(); } - // ----------------------------- IMPL -------------------------------------------------- - - - function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { - uint8 node = mapAddrToNodeId[_nodeAddress]; - require(node > 0, 'no such node'); - uint32 result = mapNodeToShards[node]; -// console.log(node, _nodeAddress, ' mapped to ', result); - return result; - } + // ----------------------------- VALIDATOR FUNCTIONS -------------------------------------------------- - function nodeCount() public view returns (uint8) { - return uint8(nodeIdList.length); - } - - function getBit(uint32 self, uint8 index) private pure returns (uint8) { - return uint8(self >> index & 1); - } - - function setBit(uint32 self, uint8 index) private pure returns (uint32) { - return self | uint32(1) << index; - } - - function clearBit(uint32 self, uint8 index) private pure returns (uint32) { - return self & ~(uint32(1) << index); + modifier onlyV() { + require(validatorContract == _msgSender() || owner() == _msgSender(), + "Ownable: caller is not the owner"); + _; } // todo add staking (or merge with Validator code) - function addNodeAndStake(address nodeAddress) public returns (uint8) { + function addNodeAndStake(address nodeAddress) public onlyV returns (uint8) { // console.log('addNodeAndStake', nodeAddress); require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); - require(unusedNodeId > 0, 'nodeId > 0'); + require(unusedNodeId > 0 && unusedNodeId < MAX_NODE_ID, 'nodeId > 0 && nodeId < max'); uint8 newNodeId = unusedNodeId++; nodeIdList.push(newNodeId); mapNodeIdToAddr[newNodeId] = nodeAddress; mapAddrToNodeId[nodeAddress] = newNodeId; mapNodeToShards[newNodeId] = 0; // for safety only // add more copies of the data if the network can handle it, unless we get enough - if (RF_TARGET != 0 && rf < RF_TARGET && rf < nodeIdList.length) { + if (rfTarget != 0 && rf < rfTarget && rf < nodeIdList.length) { rf++; // console.log('rf is now', rf); } _shuffle(); // console.log('addNodeAndStake finished'); - return unusedNodeId++; + return unusedNodeId; } - function removeNode(address nodeAddress) public { + function removeNode(address nodeAddress) public onlyV { uint8 nodeId = mapAddrToNodeId[nodeAddress]; if (nodeId == NULL_NODE) { revert('no address found'); @@ -184,10 +195,11 @@ contract StorageV1 is Ownable2StepUpgradeable { break; } } + unusedNodeId--; // cleanup addresses delete mapNodeIdToAddr[nodeId]; - if (RF_TARGET != 0 && rf > nodeIdList.length) { + if (rfTarget != 0 && rf > nodeIdList.length) { rf--; // console.log('rf is now', rf); } @@ -197,11 +209,38 @@ contract StorageV1 is Ownable2StepUpgradeable { _shuffle(); } + // ----------------------------- IMPL -------------------------------------------------- + + function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { + uint8 node = mapAddrToNodeId[_nodeAddress]; + require(node > 0, 'no such node'); + uint32 result = mapNodeToShards[node]; +// console.log(node, _nodeAddress, ' mapped to ', result); + return result; + } + + function nodeCount() public view returns (uint8) { + return uint8(nodeIdList.length); + } + + function getBit(uint32 self, uint8 index) private pure returns (uint8) { + return uint8(self >> index & 1); + } + + function setBit(uint32 self, uint8 index) private pure returns (uint32) { + return self | uint32(1) << index; + } + + function clearBit(uint32 self, uint8 index) private pure returns (uint32) { + return self & ~(uint32(1) << index); + } + + function calculateAvgPerNode(uint8[] memory _nodeList, uint8[] memory _countersMap ) public view returns (uint avgPerNode, uint demand) { - uint8 _nodeCount = uint8(_nodeList.length); - uint8 _total = SHARD_COUNT * rf; - uint8 _avgPerNode = _nodeCount == 0 ? 0 : _total / _nodeCount; + uint _nodeCount = uint8(_nodeList.length); + uint _total = uint(SHARD_COUNT) * rf; + uint _avgPerNode = _nodeCount == 0 ? 0 : _total / _nodeCount; // Math.ceil if (_total % _nodeCount > 0) { _avgPerNode = _avgPerNode + 1; @@ -211,22 +250,22 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8 nodeId = _nodeList[i]; uint8 shardCount = _countersMap[nodeId]; if (shardCount < _avgPerNode) { - console.log('checking demand for', nodeId, shardCount); +// console.log('checking demand for', nodeId, shardCount); _demand += _avgPerNode - shardCount; } } - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } +// for (uint i = 0; i < _nodeList.length; i++) { +// console.log('#', i); +// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); +// } return (_avgPerNode, _demand); } function _shuffle() private returns (uint8) { uint8[] memory _nodeList = nodeIdList; - uint8 _rf = rf; + uint _rf = rf; require(_rf >= 0 && _rf <= MAX_NODE_ID, "bad rf"); require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); @@ -271,7 +310,7 @@ contract StorageV1 is Ownable2StepUpgradeable { // unusedArr = [5, -1, 0, 1]; // results in: 5,0,1 are in a set, -1 = nothing here uint8[] memory _unusedArr = new uint8[](_rf * SHARD_COUNT); - uint16 cnt = 0; + uint cnt = 0; for (uint i = 0; i < _rf; i++) { for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { _unusedArr[cnt++] = shard; @@ -279,8 +318,8 @@ contract StorageV1 is Ownable2StepUpgradeable { } // todo REMOVE - console.log('unused after applying rf'); - for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); +// console.log('unused after applying rf'); +// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); // check unused, and no-longer assigned for (uint i = 0; i < _nodeList.length; i++) { @@ -310,8 +349,8 @@ contract StorageV1 is Ownable2StepUpgradeable { } } // todo REMOVE - console.log('unused after removing existing mappings'); - for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused2 ', _unusedArr[i]); +// console.log('unused after removing existing mappings'); +// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused2 ', _unusedArr[i]); // for (uint8 i = 0; i < _nodeList.length; i++) { // uint8 nodeId = _nodeList[i]; // @@ -325,14 +364,14 @@ contract StorageV1 is Ownable2StepUpgradeable { // cleanup unused from empty slots (-1); normally most of them would be empty; { - uint8 emptyCnt = 0; + uint emptyCnt = 0; for (uint j = 0; j < _unusedArr.length; j++) { if (_unusedArr[j] == NULL_SHARD) { emptyCnt++; } } uint8[] memory _tmp = new uint8[](_unusedArr.length - emptyCnt); - uint8 dst = 0; + uint dst = 0; for (uint i = 0; i < _unusedArr.length; i++) { if (_unusedArr[i] != NULL_SHARD) { _tmp[dst] = _unusedArr[i]; @@ -354,15 +393,15 @@ contract StorageV1 is Ownable2StepUpgradeable { console.log('demand', _demand); // 2 take from rich and share, until the demand kpi is reached - console.log('moving started'); +// console.log('moving started'); while (_demand > 0) { uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, _nodeShardsBitmap, _nodeModifiedSet); if (movedCount > 0) { _demand -= movedCount; - console.log('moved count/demand', movedCount, _demand); +// console.log('moved count/demand', movedCount, _demand); } else { - console.log('moving finished'); +// console.log('moving finished'); break; } } @@ -390,7 +429,7 @@ contract StorageV1 is Ownable2StepUpgradeable { console.log('shuffle() node modified', nodeId); } } - console.log('emitting ', _modifiedAddrArr.length); + console.log('emitting X events:', _modifiedAddrArr.length); emit SNodeMappingChanged(_modifiedAddrArr); } return _modifiedNodes; @@ -421,22 +460,22 @@ contract StorageV1 is Ownable2StepUpgradeable { return; } // todo remove - for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { - require(nodeId < _countersMap.length); - } +// for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { +// require(nodeId < _countersMap.length); +// } sortCounters(_nodesList, _countersMap, 0, int(_nodesList.length - 1)); // todo remove - for (uint i = 0; i < _nodesList.length; i++) { - console.log(_nodesList[i], 'has shards size:', _countersMap[_nodesList[i]]); - } - for (uint i = 1; i < _nodesList.length; i++) { - if (!(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]])) { - revert('sort failed'); - } - - } +// for (uint i = 0; i < _nodesList.length; i++) { +// console.log(_nodesList[i], 'has shards size:', _countersMap[_nodesList[i]]); +// } +// for (uint i = 1; i < _nodesList.length; i++) { +// if (!(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]])) { +// revert('sort failed'); +// } +// +// } } // todo remove @@ -455,39 +494,39 @@ contract StorageV1 is Ownable2StepUpgradeable { function resortCountersRow(uint8[] memory _nodeList, uint8[] memory _countersMap, uint pos, bool increment) private { // todo remove - console.log('resortCountersRow() total nodes:', _nodeList.length, ' pos:', pos); - console.log('before sort'); - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } +// console.log('resortCountersRow() total nodes:', _nodeList.length, ' pos:', pos); +// console.log('before sort'); +// for (uint i = 0; i < _nodeList.length; i++) { +// console.log('#', i); +// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); +// } int cur = int(pos); if (increment) { - while (cur + 1 >= 0 && cur + 1 <= int(_nodeList.length - 1) + while ((cur + 1) >= 0 && (cur + 1) <= int(_nodeList.length - 1) && _countersMap[_nodeList[pos]] > _countersMap[_nodeList[uint(cur + 1)]]) { cur++; } } else { - while (cur - 1 >= 0 && cur - 1 <= int(_nodeList.length - 1) + while ((cur - 1) >= 0 && (cur - 1) <= int(_nodeList.length - 1) && _countersMap[_nodeList[pos]] < _countersMap[_nodeList[uint(cur - 1)]]) { cur--; } } if (cur != int(pos)) { - console.log('moved to new'); - console.log(uint(pos)); - console.log(uint(cur)); +// console.log('moved to new'); +// console.log(uint(pos)); +// console.log(uint(cur)); uint8 tmp = _nodeList[uint(cur)]; _nodeList[uint(cur)] = _nodeList[pos]; _nodeList[pos] = tmp; } // todo remove - console.log('after sort'); - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } +// console.log('after sort'); +// for (uint i = 0; i < _nodeList.length; i++) { +// console.log('#', i); +// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); +// } // for (uint i = 1; i < _nodesList.length; i++) { // require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed (2)'); // } @@ -503,7 +542,7 @@ contract StorageV1 is Ownable2StepUpgradeable { for (uint i = 0; i < _nodeList.length; i++) { uint8 nodeId = _nodeList[i]; uint32 shardmask = _nodeShardsBitmap[nodeId]; - console.log(nodeId, 'has shardmask', shardmask); +// console.log(nodeId, 'has shardmask', shardmask); uint8 count = 0; for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { if (getBit(shardmask, shard) == 1) { @@ -512,11 +551,11 @@ contract StorageV1 is Ownable2StepUpgradeable { } _countersMap[nodeId] = count; } - console.log('buildCounters()'); - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } +// console.log('buildCounters()'); +// for (uint i = 0; i < _nodeList.length; i++) { +// console.log('#', i); +// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); +// } return _countersMap; } @@ -554,18 +593,18 @@ contract StorageV1 is Ownable2StepUpgradeable { _nodeModifiedSet[nodeId]++; resortCountersRow(_nodeList, _countersMap, j, true); _assignedCounter++; - console.log(shard, ': unused to node ->', nodeId); - console.log('counters', _countersMap[nodeId], 'bitmap', _nodeShardsBitmap[nodeId]); - console.log('nodeModified', _nodeModifiedSet[nodeId]); +// console.log(shard, ': unused to node ->', nodeId); +// console.log('counters', _countersMap[nodeId], 'bitmap', _nodeShardsBitmap[nodeId]); +// console.log('nodeModified', _nodeModifiedSet[nodeId]); break; } } } - console.log('distributeUnused2 counters'); - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } +// console.log('distributeUnused2 counters'); +// for (uint i = 0; i < _nodeList.length; i++) { +// console.log('#', i); +// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); +// } return _assignedCounter; } @@ -603,8 +642,8 @@ contract StorageV1 is Ownable2StepUpgradeable { uint8 rightNode = _nodeList[j]; uint32 transfer = (_nodeShardsBitmap[leftNode] ^ _nodeShardsBitmap[rightNode]) & (~_nodeShardsBitmap[leftNode]); - console.log('>>>>> starting moving from/to', rightNode, leftNode); - console.log('***** shardBitmaps from/to/transfer', transfer, _nodeShardsBitmap[rightNode], _nodeShardsBitmap[leftNode]); +// console.log('>>>>> starting moving from/to', rightNode, leftNode); +// console.log('***** shardBitmaps from/to/transfer', transfer, _nodeShardsBitmap[rightNode], _nodeShardsBitmap[leftNode]); if (transfer != 0) { // give uint8 shard = bitMaskToRandomShard(transfer, tmp); @@ -620,10 +659,10 @@ contract StorageV1 is Ownable2StepUpgradeable { resortCountersRow(_nodeList, _countersMap, j, false); // todo remove - assertSorting(_nodeList, _countersMap); +// assertSorting(_nodeList, _countersMap); - console.log(rightNode, '->', leftNode); - console.log('<<<<< done moving shard ', shard); +// console.log(rightNode, '->', leftNode); +// console.log('<<<<< done moving shard ', shard); return 1; } i++; diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index dea1472..2273a9f 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -11,11 +11,21 @@ import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; require("dotenv").config(); const config: HardhatUserConfig = { - solidity: "0.8.17", + solidity: { + version: "0.8.17", + settings: { + optimizer: { + enabled: true, + runs: 1000, + }, + }, + }, // defaultNetwork: "polygon_mumbai", networks: { - hardhat: {}, + hardhat: { + gas: 30000000 + }, polygon_mumbai: { url: "https://rpc-mumbai.maticvigil.com", accounts: [process.env.PRIVATE_KEY_POLYGON_TESTNET_MUMBAI] diff --git a/smart-contracts/package.json b/smart-contracts/package.json index 95f4fd7..b397bae 100644 --- a/smart-contracts/package.json +++ b/smart-contracts/package.json @@ -3,7 +3,7 @@ "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^1.0.5", "@nomicfoundation/hardhat-toolbox": "^2.0.1", - "hardhat": "^2.12.7" + "hardhat": "^2.17.2" }, "dependencies": { "@nomiclabs/hardhat-etherscan": "^3.1.5", diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 6c433ed..177572b 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -14,34 +14,19 @@ import {NodeStatus} from "./ValidatorContractHelper"; let debug = console.log; let ct: StorageContract & Contract; +let ctAsOwner: StorageContract & Contract; + let nodes = [null]; -for (let i = 1; i <= 100; i++) { +for (let i = 1; i <= 254; i++) { nodes.push('0x' + i.toString().padStart(40, '0')); } -class DeployInfo { - storageCt: Contract; - owner: SignerWithAddress; -} - -async function state1(): Promise { - debug('building snapshot'); - // Contracts are deployed using the first signer/account by default - const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); - - const storageCtFactory = await ethers.getContractFactory("StorageV1"); - const storageCt = await storageCtFactory.deploy(); - - return {storageCt, owner}; -} - - interface StorageContract { nodeAddrList(pos: number): Promise; - mapNodeIdToAddr(nodeId:number): Promise; + mapNodeIdToAddr(nodeId: number): Promise; nodeIdList(pos: number): Promise; @@ -53,7 +38,7 @@ interface StorageContract { addNodeAndStake(addr: string): Promise; - removeNode(addr:string): Promise; + removeNode(addr: string): Promise; SHARD_COUNT(): Promise; @@ -65,6 +50,36 @@ interface StorageContract { } +type TypedStorageContract = StorageContract & Contract; + +class DeployInfo { + storageCt: TypedStorageContract; + owner: SignerWithAddress; +} + +async function state1(): Promise { + debug('building snapshot'); + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); + + let protocolVersion = 1; + let validatorContract = '0x' + '0'.repeat(40); + let rfTarget = 0; + const factory = await ethers.getContractFactory("StorageV1"); + const proxyCt: TypedStorageContract = await upgrades.deployProxy(factory, + [protocolVersion, validatorContract, rfTarget], + {kind: "uups"}); + await proxyCt.deployed(); + debug(`deployed proxy: ${proxyCt.address}`); + let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); + debug(`deployed impl: ${implCt}`); + + // const storageCtFactory = await ethers.getContractFactory("StorageV1"); + // const storageCt = await storageCtFactory.deploy(); + return {storageCt: proxyCt, owner}; +} + + // read everything from the contract state to ease the testing class State { rf: number; @@ -85,7 +100,8 @@ class State { let shardsIntSet = CollectionUtil.arrayToSet(shardsIntArr); s.map.set(addr, shardsIntSet); s.nodeList.add(addr); - console.log(`node:${nodeId} addr:${addr} bitset:${shardsBitSet} -> size:${shardsIntSet.size} `, CollectionUtil.setToArray(shardsIntSet)); + const nodeIdFixed = (nodeId + '').padStart(3, ' '); + console.log(`node`, nodeIdFixed, addr, CollectionUtil.setToArray(shardsIntSet)); } return s; } @@ -105,7 +121,7 @@ class State { console.log(`assert ${addr} has good mapping`); } - checkDistribution() { + checkDistribution(expectedRf: number = -1) { let minSize = 100000000000; let maxSize = 0; for (const [node, shards] of this.map) { @@ -115,10 +131,10 @@ class State { const delta = maxSize - minSize; console.log('assert maxdistance', delta) assert.isTrue(delta <= 1, `maxdistance > 1`); - this.assertCorrectReplicationFactor(); + this.assertCorrectReplicationFactor(expectedRf); } - assertCorrectReplicationFactor() { + assertCorrectReplicationFactor(expectedRf: number = -1) { let shardToCnt = new Map; for (const [nodeId, shards] of this.map) { for (const sh of shards) { @@ -130,9 +146,12 @@ class State { if (this.nodeList.size == 0) { return; } + if (expectedRf == -1) { + expectedRf = this.rf; + } for (let sh = 0; sh < this.shardCount; sh++) { const actualCnt = shardToCnt.get(sh); - if (actualCnt != this.rf) { + if (actualCnt != expectedRf) { throw new Error(`incorrect number of shards for shard: ${sh} , ` + `got ${actualCnt} expected ${this.rf}`); } @@ -152,14 +171,16 @@ async function assertNodeListLength(e: number) { assert.equal(nodeListLength, e); } +async function beforeEachInit() { + const state = await loadFixture(state1); + ct = state.storageCt; + ctAsOwner = ct.connect(state.owner); + expect(ct.address).to.be.properAddress; +} describe("StorageTestAutoRf", function () { - beforeEach(async () => { - const state = await loadFixture(state1); - ct = state.storageCt; - expect(ct.address).to.be.properAddress; - }) + beforeEach(beforeEachInit) it('test0', async () => { let s = await State.readFromEvm(); @@ -279,19 +300,48 @@ describe("StorageTestAutoRf", function () { // END TEST }); + it('test_add2_remove2', async () => { + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 2; nodeId++) { + const addr = nodes[nodeId]; + console.log('test adds ', addr); + let t1 = await ct.addNodeAndStake(addr); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[nodeId]]); + nodeCount++; + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + { + let t1 = ct.removeNode(nodes[1]); + nodeCount--; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); // raised by delete + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + { + let t1 = ct.removeNode(nodes[2]); + nodeCount--; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); // raised by delete + let s = await State.readFromEvm(); + s.checkRf(nodeCount); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + }) }); describe("StorageTestNoAutoRf", function () { - beforeEach(async () => { - const state = await loadFixture(state1); - ct = state.storageCt; - expect(ct.address).to.be.properAddress; - }) + beforeEach(beforeEachInit) - it('test_add2_remove2', async () => { + it('rf2_test_add2_remove2', async () => { + await ctAsOwner.overrideRf(2); // now replication factor never changes let nodeCount = 0; for (let nodeId = 1; nodeId <= 2; nodeId++) { const addr = nodes[nodeId]; @@ -322,5 +372,136 @@ describe("StorageTestNoAutoRf", function () { s.checkNodeCount(nodeCount); s.checkDistribution(); } + }); + + + it('rf2_test20nodes_2join_1leave', async () => { + await ctAsOwner.overrideRf(2); // now replication factor never changes + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 3; nodeId++) { + const addr = nodes[nodeId]; + let t1 = await ct.addNodeAndStake(addr); + nodeCount++; + await t.confirmTransaction(t1); + let s = await State.readFromEvm(); + s.checkRf(2); + s.checkNodeCount(nodeCount); + if (nodeId >= 2) { + s.checkDistribution(); + } + } + let s = await State.readFromEvm(); + s.checkRf(2); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + for (let nodeId = 4; nodeId <= 20; nodeId++) { + if (nodeId % 3 === 0) { + { + const addr = nodes[nodeId]; + let t1 = await ct.addNodeAndStake(addr); + nodeCount++; + await t.confirmTransaction(t1); + } + { + let t1 = await ct.removeNode(nodes[nodeId - 1]); + nodeCount--; + await t.confirmTransaction(t1); + } + } else { + { + const addr = nodes[nodeId]; + let t1 = await ct.addNodeAndStake(addr); + nodeCount++; + await t.confirmTransaction(t1); + } + } + let s = await State.readFromEvm(); + s.checkRf(2); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } }) +}); + + +describe('StorageTestBig', function () { + + beforeEach(beforeEachInit); + + let nodeCount = 0; + + async function addNode(nodeId: number) { + { + const addr = nodes[nodeId]; + assert.isTrue(addr!=null); + let t1 = await ct.addNodeAndStake(addr); + nodeCount++; + await t.confirmTransaction(t1); + } + } + + async function removeNode(nodeId: number) { + const addr = nodes[nodeId]; + assert.isTrue(addr!=null); + let t1 = await ct.removeNode(addr); + nodeCount--; + await t.confirmTransaction(t1); + } + + async function setRf(rf: number) { + await ctAsOwner.overrideRf(rf); + await ctAsOwner.shuffle(); + } + + it('test_rf8_n8', async () => { + await setRf(5); + for (let nodeCount = 1; nodeCount <= 200; nodeCount++) { + await addNode(nodeCount); + let s = await State.readFromEvm(); + s.checkNodeCount(nodeCount); + s.checkDistribution(Math.min(nodeCount, 5)); + } + }); + + it('test_all_kinds', async () => { + await ctAsOwner.overrideRf(2); // now replication factor never changes + + for (let shardCount of [32]) { // always 32 in the contract + console.log('%s testing shardcount: %d', '-'.repeat(30), shardCount); + + // nodes = 1..40 , rf = 1..40 40..1 + for (let nodeCount = 1; nodeCount <= 40; nodeCount++) { + await addNode(nodeCount); + for (let rf = 1; rf <= nodeCount; rf++) { + console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); + if (nodeCount >= rf) { + await setRf(rf); + } + } + for (let rf = 40; rf >= 1; rf--) { + console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); + if (nodeCount >= rf) { + await ctAsOwner.overrideRf(rf); + } + } + } + + // nodes = 40..1 , rf = 1..40 40..1 + for (let nodeCount = 40; nodeCount >= 1; nodeCount--) { + await removeNode(nodeCount); + for (let rf = 1; rf <= nodeCount; rf++) { + console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); + if (nodeCount >= rf) { + await ctAsOwner.overrideRf(rf); + } + } + for (let rf = 40; rf >= 1; rf--) { + console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); + if (nodeCount >= rf) { + await ctAsOwner.overrideRf(rf); + } + } + } + } + }).timeout(600000); }); \ No newline at end of file From 8faa7410906159987cea08968d88077493b16045 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 5 Sep 2023 12:56:11 +0400 Subject: [PATCH 36/84] add: Storage.sol - efficient add/delete of a node --- smart-contracts/contracts/Storage.sol | 192 ++++++++++++++++---------- smart-contracts/test/Storage.test.ts | 69 +++++---- 2 files changed, 161 insertions(+), 100 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 39dfe09..3dcc31e 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -17,15 +17,16 @@ we have M amount of vshards at the start (a predefined value) the algorithm should ensure that - a network maintains exactly [replication factor] amount of chunks in total on all nodes -- if a node joins/leaves the data is re-distributed +- if a node joins/leaves the data is re-distributed (the goal is to minimize gas gosts here) - replication factor can change - it goes up (no more than # of nodes in total) and goes down to 1 -- re-distribution should affect the least amount of nodes possible -- re-distribution should favor grabbing fresh shards instead of old ones (assigned to the node a long time ago) +- re-distribution should affect the least amount of nodes possible (optional goal) +- re-distribution should favor grabbing fresh shards instead of old ones (optional goal) - difference between node with most vshards and least vshards should stay as close to ±1 as possible -- specifically for this contract: first N nodes will raise replication factor to RF_AUTOADJUST_LIMIT; +- registration of first N nodes will raise replication factor to rfTarget; +- an event is emitted stating which nodes have been modified -Re-sharding works like this: +Example: maxshards = 6 , shard is a data range hosted by a node in the db, rf = 1, replication factor - how many copies should be there on different nodes, nodes = 1, node count @@ -65,6 +66,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // dynamic, // ex: 1....20 uint8 public rf; + bool public rfChangedByAdmin; // only for admin calling shuffle manually // if 5 nodes join, we will set rf to 5 and then it won't grow uint8 public rfTarget; // 0 to turn off @@ -126,8 +128,9 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // allows to set replication factor manually; however this is limited by node count; function overrideRf(uint8 _rf) public onlyOwner { -// require(_rf <= nodeIdList.length, 'rf is limited by node count'); + require(_rf <= nodeIdList.length, 'rf is limited by node count'); rf = _rf; + rfChangedByAdmin = true; rfTarget = 0; } @@ -138,8 +141,20 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { mapNodeToShards[node] = bitmap; } - function shuffle() public onlyOwner returns (uint8) { - return _shuffle(); + function shuffle() public onlyOwner returns (uint) { + uint result = _shuffle(rfChangedByAdmin, false, 0); + rfChangedByAdmin = false; + return result; + } + + function getAllNodeShards(address[] memory nodeAddr) public view returns (uint32[] memory) { + uint32[] memory nodeMasks = new uint32[](nodeAddr.length); + for (uint i = 0; i < nodeAddr.length; i++) { + uint8 nodeId = mapAddrToNodeId[nodeAddr[i]]; + uint32 shardmask = mapNodeToShards[nodeId]; + nodeMasks[i] = shardmask; + } + return nodeMasks; } // ----------------------------- VALIDATOR FUNCTIONS -------------------------------------------------- @@ -150,8 +165,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { _; } - // todo add staking (or merge with Validator code) - function addNodeAndStake(address nodeAddress) public onlyV returns (uint8) { + function addNode(address nodeAddress) public onlyV returns (uint8) { // console.log('addNodeAndStake', nodeAddress); require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0 && unusedNodeId < MAX_NODE_ID, 'nodeId > 0 && nodeId < max'); @@ -161,11 +175,16 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { mapAddrToNodeId[nodeAddress] = newNodeId; mapNodeToShards[newNodeId] = 0; // for safety only // add more copies of the data if the network can handle it, unless we get enough + bool rfChanged_ = rfChangedByAdmin; // for admin + if (rfChanged_) { + rfChangedByAdmin = false; + } if (rfTarget != 0 && rf < rfTarget && rf < nodeIdList.length) { rf++; -// console.log('rf is now', rf); + rfChanged_ = true; + console.log('rf is now', rf); } - _shuffle(); + _shuffle(rfChanged_, false, 0); // console.log('addNodeAndStake finished'); return unusedNodeId; } @@ -199,14 +218,16 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // cleanup addresses delete mapNodeIdToAddr[nodeId]; + bool rfChanged_ = false; if (rfTarget != 0 && rf > nodeIdList.length) { rf--; + rfChanged_ = true; // console.log('rf is now', rf); } address[] memory _arr = new address[](1); _arr[0] = nodeAddress; emit SNodeMappingChanged(_arr); - _shuffle(); + _shuffle(rfChanged_, true, 0); } // ----------------------------- IMPL -------------------------------------------------- @@ -263,7 +284,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return (_avgPerNode, _demand); } - function _shuffle() private returns (uint8) { + function _shuffle(bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private returns (uint8) { uint8[] memory _nodeList = nodeIdList; uint _rf = rf; require(_rf >= 0 && _rf <= MAX_NODE_ID, "bad rf"); @@ -304,12 +325,88 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // } // } // } + uint8[] memory _unusedArr = buildUnused(_nodeList, _nodeShardsBitmap, _nodeModifiedSet, + _rf, rfChanged_, nodeRemoved_, removedNodeShardmask_); + + if (nodeIdList.length > 0) { + // 1 take unused and share + uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); + uint _assignedCounter = distributeUnused(_unusedArr, _nodeList, _countersMap, _nodeShardsBitmap, _nodeModifiedSet, 0); + console.log('distributed shards count:', _assignedCounter); + uint _avgPerNode; + uint _demand; + (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); + console.log('avgPerNode', _avgPerNode); + console.log('demand', _demand); + + // 2 take from rich and share, until the demand kpi is reached +// console.log('moving started'); + while (_demand > 0) { + uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, + _nodeShardsBitmap, _nodeModifiedSet); + if (movedCount > 0) { + _demand -= movedCount; +// console.log('moved count/demand', movedCount, _demand); + } else { +// console.log('moving finished'); + break; + } + } + } + + // 4 save to storage , only modified nodes + uint8 _modifiedNodes = 0; + { + for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { + if (_nodeModifiedSet[node] > 0) { + uint32 bitmap = _nodeShardsBitmap[node]; + mapNodeToShards[node] = bitmap; + console.log(node, ' stores bitmask ', bitmap); + _modifiedNodes++; + } + } + } + // 5 send events + { + address[] memory _modifiedAddrArr = new address[](_modifiedNodes); + uint pos = 0; + for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { + if (_nodeModifiedSet[nodeId] > 0) { + _modifiedAddrArr[pos++] = mapNodeIdToAddr[nodeId]; + console.log('shuffle() node modified', nodeId); + } + } + console.log('emitting X events:', _modifiedAddrArr.length); + emit SNodeMappingChanged(_modifiedAddrArr); + } + return _modifiedNodes; + } - // calculate all possible shards x replication factor; + function buildUnused(uint8[] memory _nodeList, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, + uint _rf, bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private returns (uint8[] memory){ + uint8[] memory _unusedArr; + if (!rfChanged_ && !nodeRemoved_) { + // do nothing - number of unused doesn't change + _unusedArr = new uint8[](0); + console.log('unused - do nothing'); + return _unusedArr; + } + if (nodeRemoved_) { + // only 1 node added to unused + _unusedArr = new uint8[](SHARD_COUNT); + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { + _unusedArr[shard] = getBit(removedNodeShardmask_, shard); + } + console.log('unused - 1 node'); + return _unusedArr; + } + console.log('unused - full recalculation'); + // rf changed - full recalculation O(SHARDCOUNT * RF * NODE_COUNT) + // calculate all possible shards x replication factor; // a collection of shardIds // unusedArr = [5, -1, 0, 1]; // results in: 5,0,1 are in a set, -1 = nothing here - uint8[] memory _unusedArr = new uint8[](_rf * SHARD_COUNT); + _unusedArr = new uint8[](_rf * SHARD_COUNT); uint cnt = 0; for (uint i = 0; i < _rf; i++) { for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { @@ -325,7 +422,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { for (uint i = 0; i < _nodeList.length; i++) { uint nodeId = _nodeList[i]; uint32 shardmask = _nodeShardsBitmap[nodeId]; - for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { // todo wtf is this + for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { // search this shard if (getBit(shardmask, shard) == 0) { continue; @@ -380,63 +477,9 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } _unusedArr = _tmp; } - - if (nodeIdList.length > 0) { - // 1 take unused and share - uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); - uint _assignedCounter = distributeUnused2(_unusedArr, _nodeList, _countersMap, _nodeShardsBitmap, _nodeModifiedSet, 0); - console.log('distributed shards count:', _assignedCounter); - uint _avgPerNode; - uint _demand; - (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); - console.log('avgPerNode', _avgPerNode); - console.log('demand', _demand); - - // 2 take from rich and share, until the demand kpi is reached -// console.log('moving started'); - while (_demand > 0) { - uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, - _nodeShardsBitmap, _nodeModifiedSet); - if (movedCount > 0) { - _demand -= movedCount; -// console.log('moved count/demand', movedCount, _demand); - } else { -// console.log('moving finished'); - break; - } - } - } - - // 4 save to storage , only modified nodes - uint8 _modifiedNodes = 0; - { - for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { - if (_nodeModifiedSet[node] > 0) { - uint32 bitmap = _nodeShardsBitmap[node]; - mapNodeToShards[node] = bitmap; - console.log(node, ' stores bitmask ', bitmap); - _modifiedNodes++; - } - } - } - // 5 send events - { - address[] memory _modifiedAddrArr = new address[](_modifiedNodes); - uint pos = 0; - for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { - if (_nodeModifiedSet[nodeId] > 0) { - _modifiedAddrArr[pos++] = mapNodeIdToAddr[nodeId]; - console.log('shuffle() node modified', nodeId); - } - } - console.log('emitting X events:', _modifiedAddrArr.length); - emit SNodeMappingChanged(_modifiedAddrArr); - } - return _modifiedNodes; + return _unusedArr; } - // NEW VERSION - function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap, int _left, int _right) private { int i = _left; int j = _right; @@ -560,13 +603,16 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return _countersMap; } - function distributeUnused2(uint8[] memory _unusedArr, + function distributeUnused(uint8[] memory _unusedArr, uint8[] memory _nodeList, uint8[] memory _countersMap, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, uint8 _nodeThreshold ) private returns (uint){ + if (_unusedArr.length == 0) { + return 0; + } sortCounters(_nodeList, _countersMap); // _nodeList is sorted asc uint _assignedCounter = 0; diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index 177572b..dabddde 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -36,7 +36,7 @@ interface StorageContract { nodeCount(): Promise; - addNodeAndStake(addr: string): Promise; + addNode(addr: string): Promise; removeNode(addr: string): Promise; @@ -64,7 +64,7 @@ async function state1(): Promise { let protocolVersion = 1; let validatorContract = '0x' + '0'.repeat(40); - let rfTarget = 0; + let rfTarget = 5; const factory = await ethers.getContractFactory("StorageV1"); const proxyCt: TypedStorageContract = await upgrades.deployProxy(factory, [protocolVersion, validatorContract, rfTarget], @@ -135,6 +135,7 @@ class State { } assertCorrectReplicationFactor(expectedRf: number = -1) { + console.log('assert rf', expectedRf); let shardToCnt = new Map; for (const [nodeId, shards] of this.map) { for (const sh of shards) { @@ -191,7 +192,7 @@ describe("StorageTestAutoRf", function () { it("test1", async function () { console.log(nodes[1]); - let tx = await ct.addNodeAndStake(nodes[1]); + let tx = await ct.addNode(nodes[1]); await expect(tx).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); let s = await State.readFromEvm(); s.checkNodeCount(1); @@ -206,7 +207,7 @@ describe("StorageTestAutoRf", function () { it('test2', async () => { { - let t1 = await ct.addNodeAndStake(nodes[1]); + let t1 = await ct.addNode(nodes[1]); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); let s = await State.readFromEvm(); s.checkRf(1); @@ -218,7 +219,7 @@ describe("StorageTestAutoRf", function () { 30, 31]); } { - let t1 = await ct.addNodeAndStake(nodes[2]); + let t1 = await ct.addNode(nodes[2]); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); let s = await State.readFromEvm(); s.checkRf(2); @@ -237,7 +238,7 @@ describe("StorageTestAutoRf", function () { if (nodeId === 6) { console.log('\n'.repeat(5) + '='.repeat(15)) } - let tx = await ct.addNodeAndStake(nodes[nodeId]); + let tx = await ct.addNode(nodes[nodeId]); await t.confirmTransaction(tx); nodeCount++; } @@ -261,7 +262,7 @@ describe("StorageTestAutoRf", function () { // add 1 node const addr = nodes[nodeId]; console.log('test adds ', addr); - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([addr]); nodeCount++; // check that replication count incremented @@ -288,7 +289,7 @@ describe("StorageTestAutoRf", function () { // add 6 to 10 for (let nodeId = 6; nodeId <= 10; nodeId++) { { - let t1 = await ct.addNodeAndStake(nodes[nodeId]); + let t1 = await ct.addNode(nodes[nodeId]); await t.confirmTransaction(t1); nodeCount++; let s = await State.readFromEvm(); @@ -305,7 +306,7 @@ describe("StorageTestAutoRf", function () { for (let nodeId = 1; nodeId <= 2; nodeId++) { const addr = nodes[nodeId]; console.log('test adds ', addr); - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[nodeId]]); nodeCount++; let s = await State.readFromEvm(); @@ -346,7 +347,7 @@ describe("StorageTestNoAutoRf", function () { for (let nodeId = 1; nodeId <= 2; nodeId++) { const addr = nodes[nodeId]; console.log('test adds ', addr); - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[nodeId]]); nodeCount++; let s = await State.readFromEvm(); @@ -380,7 +381,7 @@ describe("StorageTestNoAutoRf", function () { let nodeCount = 0; for (let nodeId = 1; nodeId <= 3; nodeId++) { const addr = nodes[nodeId]; - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); nodeCount++; await t.confirmTransaction(t1); let s = await State.readFromEvm(); @@ -398,7 +399,7 @@ describe("StorageTestNoAutoRf", function () { if (nodeId % 3 === 0) { { const addr = nodes[nodeId]; - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); nodeCount++; await t.confirmTransaction(t1); } @@ -410,7 +411,7 @@ describe("StorageTestNoAutoRf", function () { } else { { const addr = nodes[nodeId]; - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); nodeCount++; await t.confirmTransaction(t1); } @@ -434,7 +435,7 @@ describe('StorageTestBig', function () { { const addr = nodes[nodeId]; assert.isTrue(addr!=null); - let t1 = await ct.addNodeAndStake(addr); + let t1 = await ct.addNode(addr); nodeCount++; await t.confirmTransaction(t1); } @@ -448,37 +449,51 @@ describe('StorageTestBig', function () { await t.confirmTransaction(t1); } - async function setRf(rf: number) { + async function setRfAndShuffle(rf: number) { await ctAsOwner.overrideRf(rf); await ctAsOwner.shuffle(); } - it('test_rf8_n8', async () => { - await setRf(5); - for (let nodeCount = 1; nodeCount <= 200; nodeCount++) { + it('test_rfAuto_n1to50', async () => { + for (let nodeCount = 1; nodeCount <= 50; nodeCount++) { await addNode(nodeCount); let s = await State.readFromEvm(); s.checkNodeCount(nodeCount); s.checkDistribution(Math.min(nodeCount, 5)); } - }); + }).timeout(600000); - it('test_all_kinds', async () => { + it('test_rfManual_n1to100', async () => { + for (let nodeCount = 1; nodeCount <= 10; nodeCount++) { + await addNode(nodeCount); + if (nodeCount == 5) { + await setRfAndShuffle(5); // stop auto rf grow on 5 + } + let s = await State.readFromEvm(); + s.checkNodeCount(nodeCount); + s.checkDistribution(Math.min(nodeCount, 5)); + } + }).timeout(600000); + + it('test_rfAll_nAll', async () => { await ctAsOwner.overrideRf(2); // now replication factor never changes + const NODES_TO_TRY = 40; + const RF_TO_TRY = 10; + for (let shardCount of [32]) { // always 32 in the contract console.log('%s testing shardcount: %d', '-'.repeat(30), shardCount); - // nodes = 1..40 , rf = 1..40 40..1 - for (let nodeCount = 1; nodeCount <= 40; nodeCount++) { + // nodes = 1..40 , rf = 1..10 10..1 + for (let nodeCount = 1; nodeCount <= NODES_TO_TRY; nodeCount++) { await addNode(nodeCount); for (let rf = 1; rf <= nodeCount; rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { - await setRf(rf); + await setRfAndShuffle(rf); } } - for (let rf = 40; rf >= 1; rf--) { + for (let rf = RF_TO_TRY; rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); @@ -486,8 +501,8 @@ describe('StorageTestBig', function () { } } - // nodes = 40..1 , rf = 1..40 40..1 - for (let nodeCount = 40; nodeCount >= 1; nodeCount--) { + // nodes = 40..1 , rf = 1..10 10..1 + for (let nodeCount = NODES_TO_TRY; nodeCount >= 1; nodeCount--) { await removeNode(nodeCount); for (let rf = 1; rf <= nodeCount; rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); @@ -495,7 +510,7 @@ describe('StorageTestBig', function () { await ctAsOwner.overrideRf(rf); } } - for (let rf = 40; rf >= 1; rf--) { + for (let rf = RF_TO_TRY; rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); From 6d7f60c0c8f98c7809b766f6e117e7a4dfaedda2 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 5 Sep 2023 15:52:04 +0400 Subject: [PATCH 37/84] add: Storage.sol - all tests ok --- smart-contracts/contracts/Storage.sol | 74 +++++++++++++++++++-------- smart-contracts/test/Storage.test.ts | 60 ++++++++++++++-------- 2 files changed, 93 insertions(+), 41 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 3dcc31e..d0a21b0 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -89,7 +89,10 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ex: 0xAAAAAAAAA -> 1 mapping(address => uint8) public mapAddrToNodeId; + // next free value of nodeId uint8 private unusedNodeId; + // other free values of nodeId (added after delete operation) + uint8[] private unusedNodeIdList; address public validatorContract; @@ -166,31 +169,41 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function addNode(address nodeAddress) public onlyV returns (uint8) { -// console.log('addNodeAndStake', nodeAddress); + console.log('addNode()', nodeAddress); + console.log('unusedNodeId', unusedNodeId); + for (uint i = 0; i < nodeIdList.length; i++) { + console.log(i, nodeIdList[i]); + } require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); require(unusedNodeId > 0 && unusedNodeId < MAX_NODE_ID, 'nodeId > 0 && nodeId < max'); - uint8 newNodeId = unusedNodeId++; + uint8 newNodeId; + uint unusedLenth = unusedNodeIdList.length; + if (unusedLenth > 0) { + newNodeId = unusedNodeIdList[unusedLenth - 1]; + unusedNodeIdList.pop(); + } else { + newNodeId = unusedNodeId++; + } nodeIdList.push(newNodeId); mapNodeIdToAddr[newNodeId] = nodeAddress; mapAddrToNodeId[nodeAddress] = newNodeId; mapNodeToShards[newNodeId] = 0; // for safety only // add more copies of the data if the network can handle it, unless we get enough - bool rfChanged_ = rfChangedByAdmin; // for admin - if (rfChanged_) { - rfChangedByAdmin = false; - } - if (rfTarget != 0 && rf < rfTarget && rf < nodeIdList.length) { - rf++; - rfChanged_ = true; - console.log('rf is now', rf); - } + bool rfChanged_ = adjustRf(1); _shuffle(rfChanged_, false, 0); // console.log('addNodeAndStake finished'); return unusedNodeId; } function removeNode(address nodeAddress) public onlyV { + console.log('removeNode()', nodeAddress); + console.log('unusedNodeId', unusedNodeId); + for (uint i = 0; i < nodeIdList.length; i++) { + console.log(i, nodeIdList[i]); + } + uint8 nodeId = mapAddrToNodeId[nodeAddress]; + unusedNodeIdList.push(nodeId); if (nodeId == NULL_NODE) { revert('no address found'); } @@ -202,6 +215,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // valid nodeId ; // cleanup shards + uint32 nodeShardMask = mapNodeToShards[nodeId]; delete mapNodeToShards[nodeId]; // cleanup ids @@ -209,25 +223,21 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { for (uint i = 0; i < nodeIdLen; i++) { if (nodeIdList[i] == nodeId) { // shrink array - nodeIdList[i] = nodeIdList[nodeIdLen - 1]; + if (i != nodeIdLen - 1) { + nodeIdList[i] = nodeIdList[nodeIdLen - 1]; + } nodeIdList.pop(); break; } } - unusedNodeId--; // cleanup addresses delete mapNodeIdToAddr[nodeId]; - bool rfChanged_ = false; - if (rfTarget != 0 && rf > nodeIdList.length) { - rf--; - rfChanged_ = true; -// console.log('rf is now', rf); - } + bool rfChanged_ = adjustRf(- 1); address[] memory _arr = new address[](1); _arr[0] = nodeAddress; emit SNodeMappingChanged(_arr); - _shuffle(rfChanged_, true, 0); + _shuffle(rfChanged_, true, nodeShardMask); } // ----------------------------- IMPL -------------------------------------------------- @@ -256,6 +266,24 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return self & ~(uint32(1) << index); } + function adjustRf(int adjust) private returns (bool){ + console.log('adjustRf', uint(adjust > 0 ? 1 : 0xFF)); + bool rfChanged_ = rfChangedByAdmin; // if admin changed rf = we need full recalculation + if (rfChanged_) { + rfChangedByAdmin = false; // clear flag + } + int rf_ = int(uint(rf)); + int rfNew_ = rf_ + adjust; + console.log('rf', uint(rf_)); + console.log('rfNew_', uint(rfNew_)); + if (rfTarget != 0 && rfNew_ >= 0 && rfNew_ <= int(uint(rfTarget)) && rfNew_ <= int(nodeIdList.length)) { + rf = uint8(uint(rfNew_)); + rfChanged_ = true; + console.log('rf is now', uint(rfNew_)); + } + console.log('rfChanged_', rfChanged_); + return rfChanged_; + } function calculateAvgPerNode(uint8[] memory _nodeList, uint8[] memory _countersMap ) public view returns (uint avgPerNode, uint demand) { @@ -395,9 +423,13 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // only 1 node added to unused _unusedArr = new uint8[](SHARD_COUNT); for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - _unusedArr[shard] = getBit(removedNodeShardmask_, shard); + _unusedArr[shard] = getBit(removedNodeShardmask_, shard) == 1 ? shard : NULL_SHARD; } + console.log('unused - 1 node'); + console.log('unused after unpacking', removedNodeShardmask_); + for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); + return _unusedArr; } console.log('unused - full recalculation'); diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index dabddde..af09cce 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -342,50 +342,69 @@ describe("StorageTestNoAutoRf", function () { beforeEach(beforeEachInit) it('rf2_test_add2_remove2', async () => { - await ctAsOwner.overrideRf(2); // now replication factor never changes let nodeCount = 0; - for (let nodeId = 1; nodeId <= 2; nodeId++) { + { + let nodeId = 1; const addr = nodes[nodeId]; console.log('test adds ', addr); let t1 = await ct.addNode(addr); - await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[nodeId]]); nodeCount++; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([addr]); + await ctAsOwner.overrideRf(1); // manually set RF let s = await State.readFromEvm(); - s.checkRf(nodeCount); - s.checkNodeCount(nodeCount); + s.checkRf(1); + s.checkNodeCount(1); s.checkDistribution(); } + { + let nodeId = 2; + const addr = nodes[nodeId]; + console.log('test adds ', addr); + let t1 = await ct.addNode(addr); // rf is 1 + nodeCount++; + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1], nodes[2]]); + await ctAsOwner.overrideRf(2); // manually set RF + await ctAsOwner.shuffle(); + // await t.confirmTransaction(t1); + let s = await State.readFromEvm(); + s.checkRf(2); + s.checkNodeCount(2); + s.checkDistribution(); + } + { let t1 = ct.removeNode(nodes[1]); nodeCount--; await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); // raised by delete let s = await State.readFromEvm(); - s.checkRf(nodeCount); + s.checkRf(2); // RF doesn't decrement since it's manual s.checkNodeCount(nodeCount); - s.checkDistribution(); + s.checkDistribution(1); } { let t1 = ct.removeNode(nodes[2]); nodeCount--; await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); // raised by delete let s = await State.readFromEvm(); - s.checkRf(nodeCount); + s.checkRf(2); // RF doesn't decrement since it's manual s.checkNodeCount(nodeCount); - s.checkDistribution(); + s.checkDistribution(0); } }); it('rf2_test20nodes_2join_1leave', async () => { - await ctAsOwner.overrideRf(2); // now replication factor never changes let nodeCount = 0; for (let nodeId = 1; nodeId <= 3; nodeId++) { const addr = nodes[nodeId]; let t1 = await ct.addNode(addr); + if (nodeId == 2) { + await ctAsOwner.overrideRf(2); // manually set RF + await ctAsOwner.shuffle(); + } nodeCount++; await t.confirmTransaction(t1); let s = await State.readFromEvm(); - s.checkRf(2); s.checkNodeCount(nodeCount); if (nodeId >= 2) { s.checkDistribution(); @@ -394,8 +413,9 @@ describe("StorageTestNoAutoRf", function () { let s = await State.readFromEvm(); s.checkRf(2); s.checkNodeCount(nodeCount); - s.checkDistribution(); + s.checkDistribution(2); for (let nodeId = 4; nodeId <= 20; nodeId++) { + console.log('-'.repeat(20), 'adding', nodeId); if (nodeId % 3 === 0) { { const addr = nodes[nodeId]; @@ -419,7 +439,7 @@ describe("StorageTestNoAutoRf", function () { let s = await State.readFromEvm(); s.checkRf(2); s.checkNodeCount(nodeCount); - s.checkDistribution(); + s.checkDistribution(2); } }) }); @@ -434,7 +454,7 @@ describe('StorageTestBig', function () { async function addNode(nodeId: number) { { const addr = nodes[nodeId]; - assert.isTrue(addr!=null); + assert.isTrue(addr != null); let t1 = await ct.addNode(addr); nodeCount++; await t.confirmTransaction(t1); @@ -443,7 +463,7 @@ describe('StorageTestBig', function () { async function removeNode(nodeId: number) { const addr = nodes[nodeId]; - assert.isTrue(addr!=null); + assert.isTrue(addr != null); let t1 = await ct.removeNode(addr); nodeCount--; await t.confirmTransaction(t1); @@ -463,8 +483,8 @@ describe('StorageTestBig', function () { } }).timeout(600000); - it('test_rfManual_n1to100', async () => { - for (let nodeCount = 1; nodeCount <= 10; nodeCount++) { + it('test_rfManual_n1to50', async () => { + for (let nodeCount = 1; nodeCount <= 50; nodeCount++) { await addNode(nodeCount); if (nodeCount == 5) { await setRfAndShuffle(5); // stop auto rf grow on 5 @@ -476,7 +496,7 @@ describe('StorageTestBig', function () { }).timeout(600000); it('test_rfAll_nAll', async () => { - await ctAsOwner.overrideRf(2); // now replication factor never changes + // await ctAsOwner.overrideRf(2); // now replication factor never changes const NODES_TO_TRY = 40; const RF_TO_TRY = 10; @@ -487,7 +507,7 @@ describe('StorageTestBig', function () { // nodes = 1..40 , rf = 1..10 10..1 for (let nodeCount = 1; nodeCount <= NODES_TO_TRY; nodeCount++) { await addNode(nodeCount); - for (let rf = 1; rf <= nodeCount; rf++) { + for (let rf = 1; rf <= RF_TO_TRY; rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await setRfAndShuffle(rf); @@ -504,7 +524,7 @@ describe('StorageTestBig', function () { // nodes = 40..1 , rf = 1..10 10..1 for (let nodeCount = NODES_TO_TRY; nodeCount >= 1; nodeCount--) { await removeNode(nodeCount); - for (let rf = 1; rf <= nodeCount; rf++) { + for (let rf = 1; rf <= RF_TO_TRY; rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); From f87dbeec10acad72c06442c6cb0a8816d945bcb6 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 5 Sep 2023 16:17:54 +0400 Subject: [PATCH 38/84] add: Storage.sol - code cleanup and console.log cleanup --- smart-contracts/contracts/Storage.sol | 547 +++++++++----------------- smart-contracts/test/Storage.test.ts | 8 +- 2 files changed, 200 insertions(+), 355 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index d0a21b0..e82adf1 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -1,8 +1,6 @@ //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.17; -// todo remove -import "hardhat/console.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; @@ -130,18 +128,18 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- // allows to set replication factor manually; however this is limited by node count; - function overrideRf(uint8 _rf) public onlyOwner { - require(_rf <= nodeIdList.length, 'rf is limited by node count'); - rf = _rf; + function overrideRf(uint8 rf_) public onlyOwner { + require(rf_ <= nodeIdList.length, 'rf is limited by node count'); + rf = rf_; rfChangedByAdmin = true; rfTarget = 0; } // allows to set - function setNodeShardsByAddr(address _nodeAddress, uint32 bitmap) public onlyOwner { - uint8 node = mapAddrToNodeId[_nodeAddress]; + function setNodeShardsByAddr(address nodeAddress_, uint32 bitmap_) public onlyOwner { + uint8 node = mapAddrToNodeId[nodeAddress_]; require(node > 0, 'node address is not registered'); - mapNodeToShards[node] = bitmap; + mapNodeToShards[node] = bitmap_; } function shuffle() public onlyOwner returns (uint) { @@ -150,10 +148,10 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return result; } - function getAllNodeShards(address[] memory nodeAddr) public view returns (uint32[] memory) { - uint32[] memory nodeMasks = new uint32[](nodeAddr.length); - for (uint i = 0; i < nodeAddr.length; i++) { - uint8 nodeId = mapAddrToNodeId[nodeAddr[i]]; + function getAllNodeShards(address[] memory nodeAddr_) public view returns (uint32[] memory) { + uint32[] memory nodeMasks = new uint32[](nodeAddr_.length); + for (uint i = 0; i < nodeAddr_.length; i++) { + uint8 nodeId = mapAddrToNodeId[nodeAddr_[i]]; uint32 shardmask = mapNodeToShards[nodeId]; nodeMasks[i] = shardmask; } @@ -168,13 +166,8 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { _; } - function addNode(address nodeAddress) public onlyV returns (uint8) { - console.log('addNode()', nodeAddress); - console.log('unusedNodeId', unusedNodeId); - for (uint i = 0; i < nodeIdList.length; i++) { - console.log(i, nodeIdList[i]); - } - require(mapAddrToNodeId[nodeAddress] == 0, 'address is already registered'); + function addNode(address nodeAddress_) public onlyV returns (uint8) { + require(mapAddrToNodeId[nodeAddress_] == 0, 'address is already registered'); require(unusedNodeId > 0 && unusedNodeId < MAX_NODE_ID, 'nodeId > 0 && nodeId < max'); uint8 newNodeId; uint unusedLenth = unusedNodeIdList.length; @@ -185,46 +178,39 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { newNodeId = unusedNodeId++; } nodeIdList.push(newNodeId); - mapNodeIdToAddr[newNodeId] = nodeAddress; - mapAddrToNodeId[nodeAddress] = newNodeId; + mapNodeIdToAddr[newNodeId] = nodeAddress_; + mapAddrToNodeId[nodeAddress_] = newNodeId; mapNodeToShards[newNodeId] = 0; // for safety only // add more copies of the data if the network can handle it, unless we get enough bool rfChanged_ = adjustRf(1); _shuffle(rfChanged_, false, 0); -// console.log('addNodeAndStake finished'); return unusedNodeId; } - function removeNode(address nodeAddress) public onlyV { - console.log('removeNode()', nodeAddress); - console.log('unusedNodeId', unusedNodeId); - for (uint i = 0; i < nodeIdList.length; i++) { - console.log(i, nodeIdList[i]); - } - - uint8 nodeId = mapAddrToNodeId[nodeAddress]; - unusedNodeIdList.push(nodeId); - if (nodeId == NULL_NODE) { + function removeNode(address nodeAddress_) public onlyV { + uint8 nodeId_ = mapAddrToNodeId[nodeAddress_]; + unusedNodeIdList.push(nodeId_); + if (nodeId_ == NULL_NODE) { revert('no address found'); } if (nodeIdList.length == 0) { // mapping exists, but node has no short id - delete mapAddrToNodeId[nodeAddress]; + delete mapAddrToNodeId[nodeAddress_]; revert('no node id found'); } // valid nodeId ; // cleanup shards - uint32 nodeShardMask = mapNodeToShards[nodeId]; - delete mapNodeToShards[nodeId]; + uint32 nodeShardMask_ = mapNodeToShards[nodeId_]; + delete mapNodeToShards[nodeId_]; // cleanup ids - uint nodeIdLen = nodeIdList.length; - for (uint i = 0; i < nodeIdLen; i++) { - if (nodeIdList[i] == nodeId) { + uint nodeIdLen_ = nodeIdList.length; + for (uint i = 0; i < nodeIdLen_; i++) { + if (nodeIdList[i] == nodeId_) { // shrink array - if (i != nodeIdLen - 1) { - nodeIdList[i] = nodeIdList[nodeIdLen - 1]; + if (i != nodeIdLen_ - 1) { + nodeIdList[i] = nodeIdList[nodeIdLen_ - 1]; } nodeIdList.pop(); break; @@ -232,62 +218,55 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } // cleanup addresses - delete mapNodeIdToAddr[nodeId]; + delete mapNodeIdToAddr[nodeId_]; bool rfChanged_ = adjustRf(- 1); address[] memory _arr = new address[](1); - _arr[0] = nodeAddress; + _arr[0] = nodeAddress_; emit SNodeMappingChanged(_arr); - _shuffle(rfChanged_, true, nodeShardMask); + _shuffle(rfChanged_, true, nodeShardMask_); } // ----------------------------- IMPL -------------------------------------------------- - function getNodeShardsByAddr(address _nodeAddress) public view returns (uint32) { - uint8 node = mapAddrToNodeId[_nodeAddress]; - require(node > 0, 'no such node'); - uint32 result = mapNodeToShards[node]; -// console.log(node, _nodeAddress, ' mapped to ', result); - return result; + function getNodeShardsByAddr(address nodeAddress_) public view returns (uint32) { + uint8 nodeId_ = mapAddrToNodeId[nodeAddress_]; + require(nodeId_ > 0, 'no such node'); + return mapNodeToShards[nodeId_]; } function nodeCount() public view returns (uint8) { return uint8(nodeIdList.length); } - function getBit(uint32 self, uint8 index) private pure returns (uint8) { - return uint8(self >> index & 1); + function getBit(uint32 self_, uint8 index_) private pure returns (uint8) { + return uint8(self_ >> index_ & 1); } - function setBit(uint32 self, uint8 index) private pure returns (uint32) { - return self | uint32(1) << index; + function setBit(uint32 self_, uint8 index_) private pure returns (uint32) { + return self_ | uint32(1) << index_; } - function clearBit(uint32 self, uint8 index) private pure returns (uint32) { - return self & ~(uint32(1) << index); + function clearBit(uint32 self_, uint8 index_) private pure returns (uint32) { + return self_ & ~(uint32(1) << index_); } - function adjustRf(int adjust) private returns (bool){ - console.log('adjustRf', uint(adjust > 0 ? 1 : 0xFF)); + function adjustRf(int adjust_) private returns (bool){ bool rfChanged_ = rfChangedByAdmin; // if admin changed rf = we need full recalculation if (rfChanged_) { rfChangedByAdmin = false; // clear flag } int rf_ = int(uint(rf)); - int rfNew_ = rf_ + adjust; - console.log('rf', uint(rf_)); - console.log('rfNew_', uint(rfNew_)); + int rfNew_ = rf_ + adjust_; if (rfTarget != 0 && rfNew_ >= 0 && rfNew_ <= int(uint(rfTarget)) && rfNew_ <= int(nodeIdList.length)) { rf = uint8(uint(rfNew_)); rfChanged_ = true; - console.log('rf is now', uint(rfNew_)); } - console.log('rfChanged_', rfChanged_); return rfChanged_; } - function calculateAvgPerNode(uint8[] memory _nodeList, uint8[] memory _countersMap - ) public view returns (uint avgPerNode, uint demand) { - uint _nodeCount = uint8(_nodeList.length); + function calculateAvgPerNode(uint8[] memory nodeList_, uint8[] memory countersMap_ + ) public view returns (uint avgPerNode_, uint demand_) { + uint _nodeCount = uint8(nodeList_.length); uint _total = uint(SHARD_COUNT) * rf; uint _avgPerNode = _nodeCount == 0 ? 0 : _total / _nodeCount; // Math.ceil @@ -295,221 +274,161 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { _avgPerNode = _avgPerNode + 1; } uint _demand = 0; - for (uint i = 0; i < _nodeList.length; i++) { - uint8 nodeId = _nodeList[i]; - uint8 shardCount = _countersMap[nodeId]; + for (uint i = 0; i < nodeList_.length; i++) { + uint8 nodeId = nodeList_[i]; + uint8 shardCount = countersMap_[nodeId]; if (shardCount < _avgPerNode) { -// console.log('checking demand for', nodeId, shardCount); _demand += _avgPerNode - shardCount; } } - -// for (uint i = 0; i < _nodeList.length; i++) { -// console.log('#', i); -// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); -// } - return (_avgPerNode, _demand); } function _shuffle(bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private returns (uint8) { - uint8[] memory _nodeList = nodeIdList; - uint _rf = rf; - require(_rf >= 0 && _rf <= MAX_NODE_ID, "bad rf"); - require(_nodeList.length >= 0 && _nodeList.length < NULL_SHARD, "bad node count"); - - uint8 _maxNode = 0; - -// console.log('node ids available:'); - for (uint i = 0; i < _nodeList.length; i++) { - uint8 nodeId = _nodeList[i]; - - // todo REMOVE -// console.log('nodeId', nodeId); - if (nodeId > _maxNode) { - _maxNode = nodeId; + uint8[] memory nodeList_ = nodeIdList; + uint rf_ = rf; + require(rf_ >= 0 && rf_ <= MAX_NODE_ID, "bad rf"); + require(nodeList_.length >= 0 && nodeList_.length < NULL_SHARD, "bad node count"); + + uint8 maxNode_ = 0; + for (uint i = 0; i < nodeList_.length; i++) { + uint8 nodeId = nodeList_[i]; + if (nodeId > maxNode_) { + maxNode_ = nodeId; } } - require(_maxNode < MAX_NODE_ID); + require(maxNode_ < MAX_NODE_ID); // copy storage to memory // nodeShardsSet[i]: bit(J) = 1, if nodeI has shard J - uint8[] memory _nodeModifiedSet = new uint8[](_maxNode + 1); - uint32[] memory _nodeShardsBitmap = new uint32[](_maxNode + 1); - for (uint i = 0; i < _nodeList.length; i++) { - uint8 nodeId = _nodeList[i]; + uint8[] memory nodeModifiedSet_ = new uint8[](maxNode_ + 1); + uint32[] memory nodeShardsBitmap_ = new uint32[](maxNode_ + 1); + for (uint i = 0; i < nodeList_.length; i++) { + uint8 nodeId = nodeList_[i]; require(nodeId >= 1, 'nodes are 1 based'); - _nodeShardsBitmap[nodeId] = mapNodeToShards[nodeId]; + nodeShardsBitmap_[nodeId] = mapNodeToShards[nodeId]; } - // todo remove -// console.log('after unpacking from storage'); -// for (uint8 i = 0; i < _nodeList.length; i++) { -// uint8 nodeId = _nodeList[i]; -// -// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; -// for(uint8 k = 0; k 0) { // 1 take unused and share - uint8[] memory _countersMap = buildCounters(_nodeList, _maxNode, _nodeShardsBitmap); - uint _assignedCounter = distributeUnused(_unusedArr, _nodeList, _countersMap, _nodeShardsBitmap, _nodeModifiedSet, 0); - console.log('distributed shards count:', _assignedCounter); - uint _avgPerNode; - uint _demand; - (_avgPerNode, _demand) = calculateAvgPerNode(_nodeList, _countersMap); - console.log('avgPerNode', _avgPerNode); - console.log('demand', _demand); - + uint8[] memory countersMap_ = buildCounters(nodeList_, maxNode_, nodeShardsBitmap_); + uint assignedCounter_ = distributeUnused(unusedArr_, nodeList_, countersMap_, nodeShardsBitmap_, nodeModifiedSet_, 0); + uint avgPerNode_; + uint demand_; + (avgPerNode_, demand_) = calculateAvgPerNode(nodeList_, countersMap_); // 2 take from rich and share, until the demand kpi is reached -// console.log('moving started'); - while (_demand > 0) { - uint movedCount = distributeFromRightToLeft(_nodeList, _countersMap, - _nodeShardsBitmap, _nodeModifiedSet); - if (movedCount > 0) { - _demand -= movedCount; -// console.log('moved count/demand', movedCount, _demand); + while (demand_ > 0) { + uint movedCount_ = distributeFromRightToLeft(nodeList_, countersMap_, + nodeShardsBitmap_, nodeModifiedSet_); + if (movedCount_ > 0) { + demand_ -= movedCount_; } else { -// console.log('moving finished'); break; } } } // 4 save to storage , only modified nodes - uint8 _modifiedNodes = 0; + uint8 modifiedNodes_ = 0; { - for (uint8 node = 1; node < _nodeModifiedSet.length; node++) { - if (_nodeModifiedSet[node] > 0) { - uint32 bitmap = _nodeShardsBitmap[node]; + for (uint8 node = 1; node < nodeModifiedSet_.length; node++) { + if (nodeModifiedSet_[node] > 0) { + uint32 bitmap = nodeShardsBitmap_[node]; mapNodeToShards[node] = bitmap; - console.log(node, ' stores bitmask ', bitmap); - _modifiedNodes++; + modifiedNodes_++; } } } // 5 send events { - address[] memory _modifiedAddrArr = new address[](_modifiedNodes); + address[] memory modifiedAddrArr_ = new address[](modifiedNodes_); uint pos = 0; - for (uint8 nodeId = 1; nodeId < _nodeModifiedSet.length; nodeId++) { - if (_nodeModifiedSet[nodeId] > 0) { - _modifiedAddrArr[pos++] = mapNodeIdToAddr[nodeId]; - console.log('shuffle() node modified', nodeId); + for (uint8 nodeId = 1; nodeId < nodeModifiedSet_.length; nodeId++) { + if (nodeModifiedSet_[nodeId] > 0) { + modifiedAddrArr_[pos++] = mapNodeIdToAddr[nodeId]; } } - console.log('emitting X events:', _modifiedAddrArr.length); - emit SNodeMappingChanged(_modifiedAddrArr); + emit SNodeMappingChanged(modifiedAddrArr_); } - return _modifiedNodes; + return modifiedNodes_; } - function buildUnused(uint8[] memory _nodeList, uint32[] memory _nodeShardsBitmap, uint8[] memory _nodeModifiedSet, + function buildUnused(uint8[] memory nodeList_, uint32[] memory nodeShardsBitmap_, uint8[] memory nodeModifiedSet_, uint _rf, bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private returns (uint8[] memory){ - uint8[] memory _unusedArr; + uint8[] memory unusedArr_; if (!rfChanged_ && !nodeRemoved_) { // do nothing - number of unused doesn't change - _unusedArr = new uint8[](0); - console.log('unused - do nothing'); - return _unusedArr; + unusedArr_ = new uint8[](0); + return unusedArr_; } if (nodeRemoved_) { // only 1 node added to unused - _unusedArr = new uint8[](SHARD_COUNT); + unusedArr_ = new uint8[](SHARD_COUNT); for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - _unusedArr[shard] = getBit(removedNodeShardmask_, shard) == 1 ? shard : NULL_SHARD; + unusedArr_[shard] = getBit(removedNodeShardmask_, shard) == 1 ? shard : NULL_SHARD; } - - console.log('unused - 1 node'); - console.log('unused after unpacking', removedNodeShardmask_); - for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); - - return _unusedArr; + return unusedArr_; } - console.log('unused - full recalculation'); // rf changed - full recalculation O(SHARDCOUNT * RF * NODE_COUNT) // calculate all possible shards x replication factor; // a collection of shardIds // unusedArr = [5, -1, 0, 1]; // results in: 5,0,1 are in a set, -1 = nothing here - _unusedArr = new uint8[](_rf * SHARD_COUNT); + unusedArr_ = new uint8[](_rf * SHARD_COUNT); uint cnt = 0; for (uint i = 0; i < _rf; i++) { for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { - _unusedArr[cnt++] = shard; + unusedArr_[cnt++] = shard; } } - - // todo REMOVE -// console.log('unused after applying rf'); -// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused ', _unusedArr[i]); - // check unused, and no-longer assigned - for (uint i = 0; i < _nodeList.length; i++) { - uint nodeId = _nodeList[i]; - uint32 shardmask = _nodeShardsBitmap[nodeId]; + for (uint i = 0; i < nodeList_.length; i++) { + uint nodeId_ = nodeList_[i]; + uint32 shardmask_ = nodeShardsBitmap_[nodeId_]; for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { // search this shard - if (getBit(shardmask, shard) == 0) { + if (getBit(shardmask_, shard) == 0) { continue; } - int unusedPos = - 1; - for (uint j = 0; j < _unusedArr.length; j++) { - if (_unusedArr[j] == shard) { - unusedPos = int(j); + int unusedPos_ = - 1; + for (uint j = 0; j < unusedArr_.length; j++) { + if (unusedArr_[j] == shard) { + unusedPos_ = int(j); break; } } // decide - if (unusedPos == - 1) { + if (unusedPos_ == - 1) { // over-assigned - this food is no longer available - _nodeShardsBitmap[nodeId] = setBit(shardmask, shard); - _nodeModifiedSet[nodeId]++; + nodeShardsBitmap_[nodeId_] = setBit(shardmask_, shard); + nodeModifiedSet_[nodeId_]++; } else { // this food is used - _unusedArr[uint(unusedPos)] = NULL_SHARD; + unusedArr_[uint(unusedPos_)] = NULL_SHARD; } } } - // todo REMOVE -// console.log('unused after removing existing mappings'); -// for (uint8 i = 0; i < _unusedArr.length; i++) console.log('unused2 ', _unusedArr[i]); -// for (uint8 i = 0; i < _nodeList.length; i++) { -// uint8 nodeId = _nodeList[i]; -// -// uint8[SHARD_COUNT] memory shardSet = _nodeShardsSet[nodeId]; -// for (uint8 k = 0; k < shardSet.length; k++) { -// if (shardSet[k] == SET_ON) { -// console.log(nodeId, ' had ', k); -// } -// } -// } - // cleanup unused from empty slots (-1); normally most of them would be empty; { - uint emptyCnt = 0; - for (uint j = 0; j < _unusedArr.length; j++) { - if (_unusedArr[j] == NULL_SHARD) { - emptyCnt++; + uint emptyCnt_ = 0; + for (uint j = 0; j < unusedArr_.length; j++) { + if (unusedArr_[j] == NULL_SHARD) { + emptyCnt_++; } } - uint8[] memory _tmp = new uint8[](_unusedArr.length - emptyCnt); - uint dst = 0; - for (uint i = 0; i < _unusedArr.length; i++) { - if (_unusedArr[i] != NULL_SHARD) { - _tmp[dst] = _unusedArr[i]; - dst++; + uint8[] memory tmp_ = new uint8[](unusedArr_.length - emptyCnt_); + uint dst_ = 0; + for (uint i = 0; i < unusedArr_.length; i++) { + if (unusedArr_[i] != NULL_SHARD) { + tmp_[dst_] = unusedArr_[i]; + dst_++; } } - _unusedArr = _tmp; + unusedArr_ = tmp_; } - return _unusedArr; + return unusedArr_; } function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap, int _left, int _right) private { @@ -530,94 +449,43 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { if (i < _right) sortCounters(_nodesList, _countersMap, i, _right); } - function sortCounters(uint8[] memory _nodesList, uint8[] memory _countersMap) private { - if (_nodesList.length == 0) { + function sortCounters(uint8[] memory nodesList_, uint8[] memory countersMap_) private { + if (nodesList_.length == 0) { return; } - // todo remove -// for (uint nodeId = 0; nodeId < _nodesList.length; nodeId++) { -// require(nodeId < _countersMap.length); -// } - - sortCounters(_nodesList, _countersMap, 0, int(_nodesList.length - 1)); - - // todo remove -// for (uint i = 0; i < _nodesList.length; i++) { -// console.log(_nodesList[i], 'has shards size:', _countersMap[_nodesList[i]]); -// } -// for (uint i = 1; i < _nodesList.length; i++) { -// if (!(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]])) { -// revert('sort failed'); -// } -// -// } - } - - // todo remove - function assertSorting(uint8[] memory _nodeList, uint8[] memory _countersMap) private { - { - console.log('after sort'); - for (uint i = 0; i < _nodeList.length; i++) { - console.log('#', i); - console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); - } - for (uint i = 1; i < _nodeList.length; i++) { - require(_countersMap[_nodeList[i]] >= _countersMap[_nodeList[i - 1]], 'sort failed (2)'); - } - } + sortCounters(nodesList_, countersMap_, 0, int(nodesList_.length - 1)); } - function resortCountersRow(uint8[] memory _nodeList, uint8[] memory _countersMap, uint pos, bool increment) private { - // todo remove -// console.log('resortCountersRow() total nodes:', _nodeList.length, ' pos:', pos); -// console.log('before sort'); -// for (uint i = 0; i < _nodeList.length; i++) { -// console.log('#', i); -// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); -// } - - int cur = int(pos); - if (increment) { - while ((cur + 1) >= 0 && (cur + 1) <= int(_nodeList.length - 1) - && _countersMap[_nodeList[pos]] > _countersMap[_nodeList[uint(cur + 1)]]) { + function resortCountersRow(uint8[] memory nodeList_, uint8[] memory countersMap_, uint pos_, bool increment_) private { + int cur = int(pos_); + if (increment_) { + while ((cur + 1) >= 0 && (cur + 1) <= int(nodeList_.length - 1) + && countersMap_[nodeList_[pos_]] > countersMap_[nodeList_[uint(cur + 1)]]) { cur++; } } else { - while ((cur - 1) >= 0 && (cur - 1) <= int(_nodeList.length - 1) - && _countersMap[_nodeList[pos]] < _countersMap[_nodeList[uint(cur - 1)]]) { + while ((cur - 1) >= 0 && (cur - 1) <= int(nodeList_.length - 1) + && countersMap_[nodeList_[pos_]] < countersMap_[nodeList_[uint(cur - 1)]]) { cur--; } } - if (cur != int(pos)) { -// console.log('moved to new'); -// console.log(uint(pos)); -// console.log(uint(cur)); - uint8 tmp = _nodeList[uint(cur)]; - _nodeList[uint(cur)] = _nodeList[pos]; - _nodeList[pos] = tmp; + if (cur != int(pos_)) { + uint8 tmp = nodeList_[uint(cur)]; + nodeList_[uint(cur)] = nodeList_[pos_]; + nodeList_[pos_] = tmp; } - // todo remove -// console.log('after sort'); -// for (uint i = 0; i < _nodeList.length; i++) { -// console.log('#', i); -// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); -// } -// for (uint i = 1; i < _nodesList.length; i++) { -// require(_countersMap[_nodesList[i]] >= _countersMap[_nodesList[i - 1]], 'sort failed (2)'); -// } } function buildCounters( - uint8[] memory _nodeList, - uint8 _maxNode, - uint32[] memory _nodeShardsBitmap + uint8[] memory nodeList_, + uint8 maxNode_, + uint32[] memory nodeShardsBitmap_ ) private view returns (uint8[] memory) { - uint8[] memory _countersMap = new uint8[](_maxNode + 1); + uint8[] memory _countersMap = new uint8[](maxNode_ + 1); // init nodeArr - for (uint i = 0; i < _nodeList.length; i++) { - uint8 nodeId = _nodeList[i]; - uint32 shardmask = _nodeShardsBitmap[nodeId]; -// console.log(nodeId, 'has shardmask', shardmask); + for (uint i = 0; i < nodeList_.length; i++) { + uint8 nodeId = nodeList_[i]; + uint32 shardmask = nodeShardsBitmap_[nodeId]; uint8 count = 0; for (uint8 shard = 0; shard < SHARD_COUNT; shard++) { if (getBit(shardmask, shard) == 1) { @@ -626,121 +494,98 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } _countersMap[nodeId] = count; } -// console.log('buildCounters()'); -// for (uint i = 0; i < _nodeList.length; i++) { -// console.log('#', i); -// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); -// } - return _countersMap; } - function distributeUnused(uint8[] memory _unusedArr, - uint8[] memory _nodeList, - uint8[] memory _countersMap, - uint32[] memory _nodeShardsBitmap, - uint8[] memory _nodeModifiedSet, - uint8 _nodeThreshold + function distributeUnused(uint8[] memory unusedArr_, + uint8[] memory nodeList_, + uint8[] memory countersMap_, + uint32[] memory nodeShardsBitmap_, + uint8[] memory nodeModifiedSet_, + uint8 nodeThreshold_ ) private returns (uint){ - if (_unusedArr.length == 0) { + if (unusedArr_.length == 0) { return 0; } - sortCounters(_nodeList, _countersMap); + sortCounters(nodeList_, countersMap_); // _nodeList is sorted asc - uint _assignedCounter = 0; + uint assignedCounter_ = 0; // with every unused shard - for (uint i = 0; i < _unusedArr.length; i++) { - uint8 shard = _unusedArr[i]; + for (uint i = 0; i < unusedArr_.length; i++) { + uint8 shard = unusedArr_[i]; if (shard == NULL_SHARD) { continue; } // give it to someone (from poor to rich) and stop (and resort) - for (uint8 j = 0; j < _nodeList.length; j++) { - uint8 nodeId = _nodeList[j]; - if (_nodeThreshold > 0 && _countersMap[nodeId] >= _nodeThreshold) { + for (uint8 j = 0; j < nodeList_.length; j++) { + uint8 nodeId_ = nodeList_[j]; + if (nodeThreshold_ > 0 && countersMap_[nodeId_] >= nodeThreshold_) { continue; } - uint32 shardmask = _nodeShardsBitmap[nodeId]; - uint8 nodeHasShard = getBit(shardmask, shard); - if (nodeHasShard == 0) { // todo stopOnAvg ???????????????????????? - _unusedArr[i] = NULL_SHARD; - - _nodeShardsBitmap[nodeId] = setBit(shardmask, shard); - _countersMap[nodeId]++; - _nodeModifiedSet[nodeId]++; - resortCountersRow(_nodeList, _countersMap, j, true); - _assignedCounter++; -// console.log(shard, ': unused to node ->', nodeId); -// console.log('counters', _countersMap[nodeId], 'bitmap', _nodeShardsBitmap[nodeId]); -// console.log('nodeModified', _nodeModifiedSet[nodeId]); + uint32 shardmask_ = nodeShardsBitmap_[nodeId_]; + uint8 nodeHasShard_ = getBit(shardmask_, shard); + if (nodeHasShard_ == 0) { + unusedArr_[i] = NULL_SHARD; + + nodeShardsBitmap_[nodeId_] = setBit(shardmask_, shard); + countersMap_[nodeId_]++; + nodeModifiedSet_[nodeId_]++; + resortCountersRow(nodeList_, countersMap_, j, true); + assignedCounter_++; break; } } } -// console.log('distributeUnused2 counters'); -// for (uint i = 0; i < _nodeList.length; i++) { -// console.log('#', i); -// console.log(_nodeList[i], 'has shards size', _countersMap[_nodeList[i]]); -// } - - return _assignedCounter; + return assignedCounter_; } // convers bit shard mask (ex: 0b1101) to shard numbers (ex: [0,2,3]) and gets a random one (ex: 2) - function bitMaskToRandomShard(uint32 shardmask, uint8[SHARD_COUNT] memory shardList) private returns (uint8) { - uint8 pos = 0; - uint8 shard = 0; - while (shardmask != 0) { - if (shardmask & 1 == 1) { - shardList[pos++] = shard; + function bitMaskToRandomShard(uint32 shardmask_, uint8[SHARD_COUNT] memory shardList_) private returns (uint8) { + uint8 pos_ = 0; + uint8 shard_ = 0; + while (shardmask_ != 0) { + if (shardmask_ & 1 == 1) { + shardList_[pos_++] = shard_; } - shardmask >>= 1; - shard++; + shardmask_ >>= 1; + shard_++; } - uint8 rnd = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, shard, shardmask, pos))) % pos); - return shardList[rnd]; + uint8 rnd = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, shard_, shardmask_, pos_))) % pos_); + return shardList_[rnd]; } function distributeFromRightToLeft( - uint8[] memory _nodeList, - uint8[] memory _countersMap, - uint32[] memory _nodeShardsBitmap, - uint8[] memory _nodeModifiedSet + uint8[] memory nodeList_, + uint8[] memory countersMap_, + uint32[] memory nodeShardsBitmap_, + uint8[] memory nodeModifiedSet_ ) private returns (uint){ - if (_nodeList.length == 0) { + if (nodeList_.length == 0) { return 0; } - sortCounters(_nodeList, _countersMap); + sortCounters(nodeList_, countersMap_); uint i = 0; - uint j = _nodeList.length - 1; + uint j = nodeList_.length - 1; uint8[SHARD_COUNT] memory tmp; while (i < j) { - uint8 leftNode = _nodeList[i]; - uint8 rightNode = _nodeList[j]; - uint32 transfer = (_nodeShardsBitmap[leftNode] ^ _nodeShardsBitmap[rightNode]) - & (~_nodeShardsBitmap[leftNode]); -// console.log('>>>>> starting moving from/to', rightNode, leftNode); -// console.log('***** shardBitmaps from/to/transfer', transfer, _nodeShardsBitmap[rightNode], _nodeShardsBitmap[leftNode]); - if (transfer != 0) { + uint8 leftNode_ = nodeList_[i]; + uint8 rightNode_ = nodeList_[j]; + uint32 transfer_ = (nodeShardsBitmap_[leftNode_] ^ nodeShardsBitmap_[rightNode_]) + & (~nodeShardsBitmap_[leftNode_]); + if (transfer_ != 0) { // give - uint8 shard = bitMaskToRandomShard(transfer, tmp); - _nodeShardsBitmap[rightNode] = clearBit(_nodeShardsBitmap[rightNode], shard); - _countersMap[rightNode]--; - _nodeModifiedSet[rightNode]++; - - _nodeShardsBitmap[leftNode] = setBit(_nodeShardsBitmap[leftNode], shard); - _countersMap[leftNode]++; - _nodeModifiedSet[leftNode]++; - - resortCountersRow(_nodeList, _countersMap, i, true); - resortCountersRow(_nodeList, _countersMap, j, false); + uint8 shard = bitMaskToRandomShard(transfer_, tmp); + nodeShardsBitmap_[rightNode_] = clearBit(nodeShardsBitmap_[rightNode_], shard); + countersMap_[rightNode_]--; + nodeModifiedSet_[rightNode_]++; - // todo remove -// assertSorting(_nodeList, _countersMap); + nodeShardsBitmap_[leftNode_] = setBit(nodeShardsBitmap_[leftNode_], shard); + countersMap_[leftNode_]++; + nodeModifiedSet_[leftNode_]++; -// console.log(rightNode, '->', leftNode); -// console.log('<<<<< done moving shard ', shard); + resortCountersRow(nodeList_, countersMap_, i, true); + resortCountersRow(nodeList_, countersMap_, j, false); return 1; } i++; diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/Storage.test.ts index af09cce..d380e4a 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/Storage.test.ts @@ -507,13 +507,13 @@ describe('StorageTestBig', function () { // nodes = 1..40 , rf = 1..10 10..1 for (let nodeCount = 1; nodeCount <= NODES_TO_TRY; nodeCount++) { await addNode(nodeCount); - for (let rf = 1; rf <= RF_TO_TRY; rf++) { + for (let rf = 1; rf <= Math.min(nodeCount, RF_TO_TRY); rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await setRfAndShuffle(rf); } } - for (let rf = RF_TO_TRY; rf >= 1; rf--) { + for (let rf = Math.min(nodeCount, RF_TO_TRY); rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); @@ -524,13 +524,13 @@ describe('StorageTestBig', function () { // nodes = 40..1 , rf = 1..10 10..1 for (let nodeCount = NODES_TO_TRY; nodeCount >= 1; nodeCount--) { await removeNode(nodeCount); - for (let rf = 1; rf <= RF_TO_TRY; rf++) { + for (let rf = 1; rf <= Math.min(nodeCount, RF_TO_TRY); rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); } } - for (let rf = RF_TO_TRY; rf >= 1; rf--) { + for (let rf = Math.min(nodeCount, RF_TO_TRY); rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { await ctAsOwner.overrideRf(rf); From 5ff182d234501a2dbb8bcf7cb98d69b2959ffb78 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 5 Sep 2023 16:53:03 +0400 Subject: [PATCH 39/84] add: remove unused contrat tests (1) --- smart-contracts/README.md | 10 ++ smart-contracts/contracts/Storage.sol | 2 +- smart-contracts/test/DStorageTest.ts | 129 ------------------ ...SignatureTestTest.ts => Signature.test.ts} | 0 smart-contracts/test/StandaloneEthersTest.ts | 0 ...torage.test.ts => StorageContract.test.ts} | 12 +- ...tractTest.ts => ValidatorContract.test.ts} | 8 +- ...orContractHelper.ts => ValidatorHelper.ts} | 6 +- .../{contracts => tmp}/DStorageV1.sol.tmp | 0 9 files changed, 23 insertions(+), 144 deletions(-) delete mode 100644 smart-contracts/test/DStorageTest.ts rename smart-contracts/test/{SignatureTestTest.ts => Signature.test.ts} (100%) delete mode 100644 smart-contracts/test/StandaloneEthersTest.ts rename smart-contracts/test/{Storage.test.ts => StorageContract.test.ts} (98%) rename smart-contracts/test/{ValidatorContractTest.ts => ValidatorContract.test.ts} (98%) rename smart-contracts/test/{ValidatorContractHelper.ts => ValidatorHelper.ts} (89%) rename smart-contracts/{contracts => tmp}/DStorageV1.sol.tmp (100%) diff --git a/smart-contracts/README.md b/smart-contracts/README.md index 04d331b..8f0170a 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -1,10 +1,20 @@ # Validator contract ## 1 How to run tests (uses embedded EVM, it resets for every test case) +all tests ```shell npx hardhat test ``` +Storage.sol tests +```shell +# for normal tests +npx hardhat test --grep StorageTestAutoRf +npx hardhat test --grep StorageTestNoAutoRf +# for fuzzy tests (takes 5-15min) +npx hardhat test --grep StorageTestBig +``` + ## 2 How to set up the local env Run an empty local hardhat EVM as a DEDICATED SEPARATE PROCESS diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index e82adf1..dbd2a49 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -47,7 +47,7 @@ map after: Map(3) { } */ -contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { +contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { // number of shards; // this value should not change after deploy // also this should match data type in mapNodeToShards (uint32/64/128/256) diff --git a/smart-contracts/test/DStorageTest.ts b/smart-contracts/test/DStorageTest.ts deleted file mode 100644 index e38edab..0000000 --- a/smart-contracts/test/DStorageTest.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { time, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; -import "@nomicfoundation/hardhat-chai-matchers"; -import "@nomiclabs/hardhat-ethers"; -import { expect } from "chai"; -import { ethers } from "hardhat"; - -describe.skip("DSTorageV1", function () { - // We define a fixture to reuse the same setup in every test. - // We use loadFixture to run this setup once, snapshot that state, - // and reset Hardhat Network to that snapshot in every test. - async function deployDStorageandToken() { - // Contracts are deployed using the first signer/account by default - const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); - - const PushToken = await ethers.getContractFactory("PushToken"); - const pushToken = await PushToken.deploy(); - - const DStorageV1 = await ethers.getContractFactory("DStorageV1"); - const dstoragev1 = await DStorageV1.deploy(pushToken.address); - - await pushToken.mint(owner.address, ethers.utils.parseEther("100")); - await pushToken.approve(dstoragev1.address, ethers.utils.parseEther("1000000000000000")); - - return { pushToken, dstoragev1 , owner, otherAccount, thirdAccount }; - } - - describe("Deployment", function () { - it("Should deploy DSTorageV1 and PushToken", async function () { - const { pushToken, dstoragev1 } = await loadFixture(deployDStorageandToken); - - // Check that the DSTorageV1 contract was deployed - expect(dstoragev1.address).to.be.properAddress; - - // Check that the PushToken contract was deployed - expect(pushToken.address).to.be.properAddress; - }); - - it("Should mint Push tokens to address", async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - - //mint 100 tokens to owner - await pushToken.mint(owner.address, ethers.utils.parseEther("100")); - - // Check that the owner has 100 Push tokens - expect(await pushToken.balanceOf(owner.address)).greaterThan(ethers.utils.parseEther("0")); - }); - }); - - describe("Registering SNodes", function () { - it("User should be able to register SNode if collateral is sufficient",async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - expect(await dstoragev1.registerNode(owner?.address,1,"http://snode1:3000",60)).to.emit(dstoragev1, "NodeAdded").withArgs(owner?.address,'SNode',"http://snode1:3000"); - }) - - it("User should be not able to register SNode if collateral is not sufficient",async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.registerNode(owner?.address,1,"http://snode1:3000",50)).to.be.revertedWith('Insufficient collateral for SNODE'); - }) - it("Registering Snodes not possible with same pubkey", async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - console.log("Deploying a SNode from : ",owner?.address); - expect(await dstoragev1.registerNode(owner?.address,1,"http://snode1:3000",60)).to.emit(dstoragev1, "NodeAdded").withArgs(owner?.address,'SNode',"http://snode1:3000"); - console.log("Trying to deploy another SNode from : ",owner?.address); - await expect(dstoragev1.registerNode(owner?.address,1,"http://snode1:3000",60)).to.emit(dstoragev1, "NodeAdded").to.be.revertedWith('a node with pubKey is already defined'); - }) - }); - - describe("Registering VNodes", function () { - - it("User should be able to register VNode",async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - expect(await dstoragev1.registerNode(owner?.address,0,"http://vnode1:4000",100)).to.emit(dstoragev1, "NodeAdded").withArgs(owner?.address,0,"http://vnode1:4000"); - }) - - it("User should not be able to register VNode if collateral is insufficient",async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.registerNode(owner?.address,0,"http://vnode1:4000",60)).to.emit(dstoragev1, "NodeAdded").to.be.revertedWith('Insufficient collateral for VNODE'); - }) - - it("Registering Vnodes not possible with same pubkey", async function(){ - const { pushToken, dstoragev1, owner } = await loadFixture(deployDStorageandToken); - console.log("Deploying a SNode from : ",owner?.address); - expect(await dstoragev1.registerNode(owner?.address,0,"http://vnode1:4000",100)).to.emit(dstoragev1, "NodeAdded").withArgs(owner?.address,'VNode',"http://vnode1:4000"); - console.log("Trying to deploy another SNode from : ",owner?.address); - await expect(dstoragev1.registerNode(owner?.address,0,"http://vnode1:4000",100)).to.emit(dstoragev1, "NodeAdded").to.be.revertedWith('a node with pubKey is already defined'); - - }); - }); - - describe("Transfer contract ownership", function (){ - it("Transfer ownership if the new owner is different", async function (){ - const { pushToken, dstoragev1, owner, otherAccount } = await loadFixture(deployDStorageandToken); - console.log("Old Owner : ",await dstoragev1.owner()); - await expect(dstoragev1.transferOwnership(otherAccount.address)).to.emit(dstoragev1, "LogTransferOwnership"); - console.log("Ownership to be transferred to : ",await dstoragev1.newOwner()); - }); - - it("Transfer ownership is not possible if the new owner is same as old owner", async function (){ - const { pushToken, dstoragev1, owner, otherAccount } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.transferOwnership(owner.address)).to.be.revertedWith('Cannot transfer ownership to the current owner.'); - }); - - it("Transfer ownership is not possible if the new owner is zero address", async function (){ - const { pushToken, dstoragev1, owner, otherAccount } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.transferOwnership(ethers.constants.AddressZero)).to.be.revertedWith('Cannot transfer ownership to address(0)'); - }) - - it("Transfer is only possible by the owner", async function (){ - const { pushToken, dstoragev1, owner, otherAccount } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.connect(otherAccount).transferOwnership(otherAccount.address)).to.be.revertedWith('Only the owner can transfer ownership.'); - }); - }); - - describe("Accepting ownership", function (){ - it("Accepting ownership is only possible by the new owner", async function (){ - const { pushToken, dstoragev1, owner, otherAccount } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.transferOwnership(otherAccount.address)).to.emit(dstoragev1, "LogTransferOwnership"); - await expect(dstoragev1.connect(otherAccount).acceptOwnership()).to.emit(dstoragev1, "LogAcceptOwnership"); - }); - - it("Accepting ownership is not possible by any other address", async function (){ - const { pushToken, dstoragev1, owner, otherAccount, thirdAccount } = await loadFixture(deployDStorageandToken); - await expect(dstoragev1.transferOwnership(otherAccount.address)).to.emit(dstoragev1, "LogTransferOwnership"); - await expect(dstoragev1.connect(thirdAccount).acceptOwnership()).to.be.revertedWith('Only the new owner can accept the ownership.'); - }); - }); - -}); \ No newline at end of file diff --git a/smart-contracts/test/SignatureTestTest.ts b/smart-contracts/test/Signature.test.ts similarity index 100% rename from smart-contracts/test/SignatureTestTest.ts rename to smart-contracts/test/Signature.test.ts diff --git a/smart-contracts/test/StandaloneEthersTest.ts b/smart-contracts/test/StandaloneEthersTest.ts deleted file mode 100644 index e69de29..0000000 diff --git a/smart-contracts/test/Storage.test.ts b/smart-contracts/test/StorageContract.test.ts similarity index 98% rename from smart-contracts/test/Storage.test.ts rename to smart-contracts/test/StorageContract.test.ts index d380e4a..d313aea 100644 --- a/smart-contracts/test/Storage.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -10,7 +10,7 @@ import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {BitUtil} from "./uitlz/bitUtil"; import {TestHelper as t} from "./TestHelper"; import {CollectionUtil} from "./uitlz/collectionUtil"; -import {NodeStatus} from "./ValidatorContractHelper"; +import {NodeStatus} from "./ValidatorHelper"; let debug = console.log; let ct: StorageContract & Contract; @@ -65,7 +65,7 @@ async function state1(): Promise { let protocolVersion = 1; let validatorContract = '0x' + '0'.repeat(40); let rfTarget = 5; - const factory = await ethers.getContractFactory("StorageV1"); + const factory = await ethers.getContractFactory("StorageV2"); const proxyCt: TypedStorageContract = await upgrades.deployProxy(factory, [protocolVersion, validatorContract, rfTarget], {kind: "uups"}); @@ -498,7 +498,7 @@ describe('StorageTestBig', function () { it('test_rfAll_nAll', async () => { // await ctAsOwner.overrideRf(2); // now replication factor never changes - const NODES_TO_TRY = 40; + const NODES_TO_TRY = 10; const RF_TO_TRY = 10; for (let shardCount of [32]) { // always 32 in the contract @@ -516,7 +516,7 @@ describe('StorageTestBig', function () { for (let rf = Math.min(nodeCount, RF_TO_TRY); rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { - await ctAsOwner.overrideRf(rf); + await setRfAndShuffle(rf); } } } @@ -527,13 +527,13 @@ describe('StorageTestBig', function () { for (let rf = 1; rf <= Math.min(nodeCount, RF_TO_TRY); rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { - await ctAsOwner.overrideRf(rf); + await setRfAndShuffle(rf); } } for (let rf = Math.min(nodeCount, RF_TO_TRY); rf >= 1; rf--) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { - await ctAsOwner.overrideRf(rf); + await setRfAndShuffle(rf); } } } diff --git a/smart-contracts/test/ValidatorContractTest.ts b/smart-contracts/test/ValidatorContract.test.ts similarity index 98% rename from smart-contracts/test/ValidatorContractTest.ts rename to smart-contracts/test/ValidatorContract.test.ts index a5cce02..21fe3c9 100644 --- a/smart-contracts/test/ValidatorContractTest.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -8,7 +8,7 @@ import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./TestHelper"; -import {NodeStatus, ValidatorContractHelper} from "./ValidatorContractHelper"; +import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber} from "ethers"; import {JsonRpcClient} from "hardhat/internal/hardhat-network/jsonrpc/client"; @@ -235,7 +235,7 @@ describe("Validator Tests :: A node reports on other node", function () { const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); let message = "0xAA"; - let node1Signature = await ValidatorContractHelper.sign(node1Wallet, message); + let node1Signature = await ValidatorHelper.sign(node1Wallet, message); let signatures = [node1Signature]; console.log(`voteData=${message}, signatures=${signatures}`); // simulate a read only method - just to get method output @@ -267,8 +267,8 @@ describe("Validator Tests :: A node reports on other node", function () { } expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); { - let reportThatNode2IsBad = ValidatorContractHelper.encodeVoteDataToHex(0, node2Wallet.address); - let node1Signature = await ValidatorContractHelper.sign(node1Wallet, reportThatNode2IsBad); + let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, node2Wallet.address); + let node1Signature = await ValidatorHelper.sign(node1Wallet, reportThatNode2IsBad); let signers = [node1Wallet.address]; let signatures = [node1Signature]; console.log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); diff --git a/smart-contracts/test/ValidatorContractHelper.ts b/smart-contracts/test/ValidatorHelper.ts similarity index 89% rename from smart-contracts/test/ValidatorContractHelper.ts rename to smart-contracts/test/ValidatorHelper.ts index b242e5a..1abe9bf 100644 --- a/smart-contracts/test/ValidatorContractHelper.ts +++ b/smart-contracts/test/ValidatorHelper.ts @@ -1,17 +1,16 @@ import {ethers} from "hardhat"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -export class ValidatorContractHelper { +export class ValidatorHelper { static utils = ethers.utils; - static getMessageHashAsInContract(message: string) { let utils = ethers.utils; return utils.keccak256(utils.arrayify(message)); } static async sign(wallet: SignerWithAddress, message: string): Promise { - const hash = ValidatorContractHelper.getMessageHashAsInContract(message); + const hash = ValidatorHelper.getMessageHashAsInContract(message); return await wallet.signMessage(ethers.utils.arrayify(hash)); } @@ -19,7 +18,6 @@ export class ValidatorContractHelper { let abi = ethers.utils.defaultAbiCoder; return abi.encode(["uint8", "address"], [voteAction, targetWallet]); } - } export enum NodeStatus { diff --git a/smart-contracts/contracts/DStorageV1.sol.tmp b/smart-contracts/tmp/DStorageV1.sol.tmp similarity index 100% rename from smart-contracts/contracts/DStorageV1.sol.tmp rename to smart-contracts/tmp/DStorageV1.sol.tmp From 9be44f37f3c869dcb26f2f2e123a68bdaec1582b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 15:33:26 +0400 Subject: [PATCH 40/84] add: Storage.sol setValidatorContract --- smart-contracts/contracts/Storage.sol | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index dbd2a49..e3a8183 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -53,8 +53,6 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { // also this should match data type in mapNodeToShards (uint32/64/128/256) uint8 public constant SHARD_COUNT = 32; - uint8 public constant SET_ON = 1; // for set we use uint8(1) as on, and uint8(0) as off - uint8 public constant SET_OFF = 0; uint8 public constant NULL_SHARD = 255; // shard id that does not exists uint8 public constant MAX_NODE_ID = 254; // max node uint8 public constant NULL_NODE = 0; @@ -92,6 +90,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { // other free values of nodeId (added after delete operation) uint8[] private unusedNodeIdList; + // this is a security check that only validator contract calls our methods address public validatorContract; uint16 public protocolVersion; @@ -158,6 +157,10 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { return nodeMasks; } + function setValidatorContract(address addr_) public onlyOwner { + validatorContract = addr_; + } + // ----------------------------- VALIDATOR FUNCTIONS -------------------------------------------------- modifier onlyV() { @@ -314,7 +317,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { if (nodeIdList.length > 0) { // 1 take unused and share uint8[] memory countersMap_ = buildCounters(nodeList_, maxNode_, nodeShardsBitmap_); - uint assignedCounter_ = distributeUnused(unusedArr_, nodeList_, countersMap_, nodeShardsBitmap_, nodeModifiedSet_, 0); + distributeUnused(unusedArr_, nodeList_, countersMap_, nodeShardsBitmap_, nodeModifiedSet_, 0); uint avgPerNode_; uint demand_; (avgPerNode_, demand_) = calculateAvgPerNode(nodeList_, countersMap_); @@ -356,7 +359,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { } function buildUnused(uint8[] memory nodeList_, uint32[] memory nodeShardsBitmap_, uint8[] memory nodeModifiedSet_, - uint _rf, bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private returns (uint8[] memory){ + uint _rf, bool rfChanged_, bool nodeRemoved_, uint32 removedNodeShardmask_) private pure returns (uint8[] memory){ uint8[] memory unusedArr_; if (!rfChanged_ && !nodeRemoved_) { // do nothing - number of unused doesn't change @@ -456,7 +459,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { sortCounters(nodesList_, countersMap_, 0, int(nodesList_.length - 1)); } - function resortCountersRow(uint8[] memory nodeList_, uint8[] memory countersMap_, uint pos_, bool increment_) private { + function resortCountersRow(uint8[] memory nodeList_, uint8[] memory countersMap_, uint pos_, bool increment_) private pure { int cur = int(pos_); if (increment_) { while ((cur + 1) >= 0 && (cur + 1) <= int(nodeList_.length - 1) @@ -480,7 +483,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { uint8[] memory nodeList_, uint8 maxNode_, uint32[] memory nodeShardsBitmap_ - ) private view returns (uint8[] memory) { + ) private pure returns (uint8[] memory) { uint8[] memory _countersMap = new uint8[](maxNode_ + 1); // init nodeArr for (uint i = 0; i < nodeList_.length; i++) { @@ -541,7 +544,7 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { } // convers bit shard mask (ex: 0b1101) to shard numbers (ex: [0,2,3]) and gets a random one (ex: 2) - function bitMaskToRandomShard(uint32 shardmask_, uint8[SHARD_COUNT] memory shardList_) private returns (uint8) { + function bitMaskToRandomShard(uint32 shardmask_, uint8[SHARD_COUNT] memory shardList_) private view returns (uint8) { uint8 pos_ = 0; uint8 shard_ = 0; while (shardmask_ != 0) { From 69646a9aeed183aafade08757c5146083de4e00a Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 15:34:05 +0400 Subject: [PATCH 41/84] add: fixed ownership tests --- smart-contracts/contracts/Validator.sol | 226 +++-- .../test/ValidatorContract.test.ts | 834 +++++++++--------- 2 files changed, 562 insertions(+), 498 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 50c68be..978100f 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -4,25 +4,64 @@ pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "./Storage.sol"; /* Validator smart contract -Enables a network of Validators +# Enables a network of Validator (V), Storage (S), Delivery (D) nodes +- V performs a multi-sig on a message block within a specified group +- D unpacks message block (a threshold amount of sigs required), +and for every single message: delivers it to the end-users +- S unpacks message block (a threshold amount of sigs required), +and indexes every single message: the message gets copied to every person's inbox +So that later V can query a group of storage nodes responsible for some data range +and show that inbox to the UI. + +# Contracts +All the stacking, node management, slashing is done in this contrect Validator.sol +S has it's own Storage.sol contract, which manages only S shard assignments. + + */ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { - uint16 private protocolVersion; + // ----------------------------- STATE -------------------------------------------------- + + uint16 public protocolVersion; + + /* staking params (effectively constant ) */ - // contract-wide variables - uint256 public vnodeCollateralInPushTokens; - uint32 public REPORT_COUNT_TO_SLASH; - uint32 public SLASH_COLL_PERCENTAGE; - uint32 public SLASH_COUNT_TO_BAN; - uint32 public BAN_COLL_PERCENTAGE; - uint32 public MIN_NODES_FOR_REPORT; + // number of push tokens (18 digits) to stake as Validator (V) + uint256 public minStakeV; + // number of push tokens (18 digits) to stake as Storage (S) + uint256 public minStakeS; + // number of push tokens (18 digits) to stake as Delivery (D) + uint256 public minStakeD; + + /* validator slashing params (effectively constant) + + report = bad behaviour, after REPORT_NODES would report REPORT_CNT_MAX times + we perform a slash + + slash = reduces node collateral for SLASH_PERCENT % + after SLASH_CNT_MAX slashes the node would get a bat + + ban = reduces node collateral for BAN_PERCENT, node address is banned forever + */ + uint32 public REPORT_NODES; + uint32 public REPORT_CNT_MAX; + + uint32 public SLASH_PERCENT; + uint32 public SLASH_CNT_MAX; + + uint32 public BAN_PERCENT; + + /* validator validation params (effectively constant only for V backend) + these parameters control how nodejs processes communicate + for the contract these a simply constants; all the logic is in JS + */ - // backend-wide variables // how many attesters should sign the message block, after validator proposes a block uint8 public attestersRequired; // how many networkRandom objects are required to compute a random value @@ -30,27 +69,24 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random uint8 public nodeRandomPingCount; + // ----------------------------- CONTRACT STATE -------------------------------------------------- + + /* registered nodes params */ - // token storages + // push token used for staking/slashing etc IERC20 pushToken; + // storage contract manages storage node state + address public storageContract; + // node colleciton - address[] nodes; - mapping(address => NodeInfo) nodeMap; - uint256 totalStaked; // push tokens owned by this contract; which have an owner - uint256 totalPenalties; // push tokens owned by this contract; comes from penalties - - /* storage node mapping - namespace 'notif' - 0x25 -> 0x1, 0x2, 0x3 ; - shards are in 0..0x20; nodeids are in 0x..0xFF; we'll use 2 bytes for safety - shard 0x25 is hosted on 0x1, 0x2, 0x3 - */ - mapping(uint8 => uint16[]) notifShardToNodeId; // todo support shards, and reshard on every storage node registration - // this is the next free index, which will be assigned to a new node - uint16 notifShardsMax; + address[] public nodes; + mapping(address => NodeInfo) public nodeMap; + uint public totalStaked; // push tokens owned by this contract; which have an owner + uint public totalPenalties; // push tokens owned by this contract; comes from penalties - /* EVENTS */ + + // ----------------------------- EVENTS -------------------------------------------------- event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); @@ -58,11 +94,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { event NodeRandomMinCountUpdated(uint32 value); event NodeRandomPingCountUpdated(uint32 value); - /* TYPES */ - + // ----------------------------- TYPES -------------------------------------------------- struct NodeInfo { - uint16 shortAddr; + uint16 shortAddr; // todo address ownerWallet; address nodeWallet; // eth wallet NodeType nodeType; @@ -110,15 +145,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address target; } - /* METHODS */ - - function decodeVoteMessage(bytes memory data) private pure returns (VoteMessage memory) { - (VoteAction vote, address target) = abi.decode(data, (VoteAction, address)); - VoteMessage memory result; - result.vote = vote; - result.target = target; - return result; - } + // ----------------------------- UPGRADABLE -------------------------------------------------- // an empty constructor; constructor is replaced with initialize() constructor() { @@ -146,55 +173,81 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); nodeRandomPingCount = nodeRandomPingCount_; - notifShardsMax = 31; - vnodeCollateralInPushTokens = 100; - REPORT_COUNT_TO_SLASH = 2; - SLASH_COLL_PERCENTAGE = 1; - SLASH_COUNT_TO_BAN = 2; - BAN_COLL_PERCENTAGE = 10; - MIN_NODES_FOR_REPORT = 1; + minStakeV = 100; + minStakeS = 100; + minStakeD = 100; + REPORT_CNT_MAX = 2; + SLASH_PERCENT = 1; + SLASH_CNT_MAX = 2; + BAN_PERCENT = 10; + REPORT_NODES = 1; // todo update this on node join } + function _authorizeUpgrade(address) internal override onlyOwner {} + + function getProtocolVersion() public view returns (uint16) { + return protocolVersion; + } + + function getCodeVersion() public pure returns (uint16){ + return 2; + } + // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- + + function setStorageContract(address addr_) public onlyOwner { + storageContract = addr_; + } + + // ----------------------------- IMPL -------------------------------------------------- + + // Registers a new validator node // Locks PUSH tokens ($_token) with $_collateral amount. // A node will run from a _nodeWallet - function registerNodeAndStake(uint256 _nodeTokens, - NodeType _nodeType, string memory _nodeApiBaseUrl, address _nodeWallet) public { - uint256 coll = _nodeTokens; - if (_nodeType == NodeType.VNode) { - require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for VNODE"); - } else if (_nodeType == NodeType.DNode) { - require(coll >= vnodeCollateralInPushTokens, "Insufficient collateral for DNODE"); + // ACCESS: Any node can call this + function registerNodeAndStake(uint256 nodeTokens_, + NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { + uint256 coll = nodeTokens_; + if (nodeType_ == NodeType.VNode) { + require(coll >= minStakeV, "Insufficient collateral for VNODE"); + } else if (nodeType_ == NodeType.DNode) { + require(coll >= minStakeD, "Insufficient collateral for DNODE"); + } else if (nodeType_ == NodeType.SNode) { + require(coll >= minStakeS, "Insufficient collateral for SNODE"); } else { revert("unsupported nodeType "); } - NodeInfo storage old = nodeMap[_nodeWallet]; + NodeInfo storage old = nodeMap[nodeWallet_]; if (old.ownerWallet != address(0)) { revert("a node with pubKey is already defined"); } // check that collateral is allowed to spend uint256 allowed = pushToken.allowance(msg.sender, address(this)); - require(allowed >= _nodeTokens, "_nodeTokens cannot be transferred, check allowance"); + require(allowed >= nodeTokens_, "_nodeTokens cannot be transferred, check allowance"); // new mapping NodeInfo memory n; n.ownerWallet = msg.sender; - n.nodeWallet = _nodeWallet; - n.nodeType = _nodeType; + n.nodeWallet = nodeWallet_; + n.nodeType = nodeType_; n.nodeTokens = coll; - n.nodeApiBaseUrl = _nodeApiBaseUrl; - nodes.push(_nodeWallet); - nodeMap[_nodeWallet] = n; + n.nodeApiBaseUrl = nodeApiBaseUrl_; + nodes.push(nodeWallet_); + nodeMap[nodeWallet_] = n; // take collateral require(pushToken.transferFrom(msg.sender, address(this), coll), "failed to transfer tokens to contract"); totalStaked += coll; // post actions + if(nodeType_ == NodeType.SNode) { + // try to register this node for shard mappings + require(storageContract != address(0), 'no storage contract defined'); + StorageV2 s = StorageV2(storageContract); + s.addNode(nodeWallet_); + } // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); - emit NodeAdded(msg.sender, _nodeWallet, _nodeType, coll, _nodeApiBaseUrl); + emit NodeAdded(msg.sender, nodeWallet_, nodeType_, coll, nodeApiBaseUrl_); } - - /* Complain on an existing node; N attesters can request to report malicious activity for a specific node also slashes if the # of complains meet the required threshold @@ -203,6 +256,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { Returns 1 (number of affected nodes) or 0 (if nothing happened) */ + // ACCESS: Any node can call this function reportNode(bytes memory _message, bytes[] memory _signatures) public returns (uint8) { uint validSigCount = 0; NodeInfo storage callerNodeId = nodeMap[msg.sender]; @@ -216,7 +270,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { validSigCount++; } } - if (validSigCount < MIN_NODES_FOR_REPORT) { + if (validSigCount < REPORT_NODES) { return 0; } VoteMessage memory vm = decodeVoteMessage(_message); @@ -225,11 +279,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { if (targetNode.nodeWallet == address(0)) { revert("a node with _targetPubKey does not exists"); } - return doReportNode(vm, targetNode); + return _reportNode(vm, targetNode); } // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler - function doReportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ + function _reportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); NodeStatus ns = targetNode.status; // 2 check count @@ -239,10 +293,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { revert("unsupported"); } if (ns == NodeStatus.OK || ns == NodeStatus.Slashed) { - if (targetNode.counters.reportCounter >= REPORT_COUNT_TO_SLASH) { + if (targetNode.counters.reportCounter >= REPORT_CNT_MAX) { doSlash(targetNode); } - if (targetNode.counters.slashCounter >= SLASH_COUNT_TO_BAN) { + if (targetNode.counters.slashCounter >= SLASH_CNT_MAX) { doBan(targetNode); } } else if (ns == NodeStatus.BannedAndUnstaked) { @@ -289,6 +343,14 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return delta; } + function decodeVoteMessage(bytes memory data) private pure returns (VoteMessage memory) { + (VoteAction vote, address target) = abi.decode(data, (VoteAction, address)); + VoteMessage memory result; + result.vote = vote; + result.target = target; + return result; + } + function getNodeInfo(address _nodeWallet) public view returns (NodeInfo memory) { return nodeMap[_nodeWallet]; } @@ -306,32 +368,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { targetNode.status = NodeStatus.Slashed; targetNode.counters.reportCounter = 0; targetNode.counters.slashCounter++; - uint256 coll = reduceCollateral(targetNode.nodeWallet, SLASH_COLL_PERCENTAGE); + uint256 coll = reduceCollateral(targetNode.nodeWallet, SLASH_PERCENT); emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll); } function doBan(NodeInfo storage targetNode) private { - reduceCollateral(targetNode.nodeWallet, BAN_COLL_PERCENTAGE); + reduceCollateral(targetNode.nodeWallet, BAN_PERCENT); doUnstake(targetNode); targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } - - /*****************/ - /* UUPS required */ - /*****************/ - - function _authorizeUpgrade(address) internal override onlyOwner {} - - function getProtocolVersion() public view returns (uint16) { - return protocolVersion; - } - - function getCodeVersion() public pure returns (uint16){ - return 2; - } - function updateAttestersRequired(uint8 amount) public onlyOwner { require(amount >= 0 && amount < nodes.length); attestersRequired = amount; @@ -351,7 +398,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } - // a lib that abstracts privKey signature and pubKey+signature checks library SigUtil { @@ -365,7 +411,7 @@ library SigUtil { "\x19Ethereum Signed Message\n" + len(msg) + msg */ return - keccak256( + keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) ); } @@ -409,12 +455,4 @@ library SigUtil { return recoverSigner(ethSignedMessageHash, _signature); } - /**********/ - /* Errors */ - /**********/ - - // todo if(!condition) revert Error1(); - // this produces smaller bytecode - error Error1(); - } \ No newline at end of file diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 21fe3c9..c58ab5e 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -3,437 +3,463 @@ import {loadFixture} from "@nomicfoundation/hardhat-network-helpers"; import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; -import {expect} from "chai"; +import {expect, assert} from "chai"; import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber} from "ethers"; -import {JsonRpcClient} from "hardhat/internal/hardhat-network/jsonrpc/client"; -let info = console.log; +let debug = console.log; + + +async function deployStorageContract(validatorV1Proxy): Promise { + debug('deploying StorageV2') + let validatorContract = validatorV1Proxy.address; + let protocolVersion = 1; + let rfTarget = 5; + const factory = await ethers.getContractFactory("StorageV2"); + const proxyCt = await upgrades.deployProxy(factory, + [protocolVersion, validatorContract, rfTarget], + {kind: "uups"}); + await proxyCt.deployed(); + debug(`deployed proxy: ${proxyCt.address}`); + let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); + debug(`deployed impl: ${implCt}`); + debug('done'); + return proxyCt.address; +} + export class State1 { - pushContract: PushToken; - valContract: ValidatorV1; - owner: SignerWithAddress; - - node1Wallet: SignerWithAddress; - node2Wallet: SignerWithAddress; - - acc1: SignerWithAddress; - acc2: SignerWithAddress; - - static async build() { - // Contracts are deployed using the first signer/account by default - const [owner, node1Wallet, node2Wallet, acc1, acc2] = await ethers.getSigners(); - - const ptFactory = await ethers.getContractFactory("PushToken"); - const pushContract = await ptFactory.deploy(); - - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushContract.address, 1, 1, 1], - {kind: "uups"}); - await validatorV1Proxy.deployed(); - info(`deployed proxy: ${validatorV1Proxy.address}`); - let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); - console.log(`deployed impl: ${validatorV1Impl}`); - - // const valFactory = await ethers.getContractFactory("ValidatorV1"); - const valContract = validatorV1Impl; - - await pushContract.mint(owner.address, ethers.utils.parseEther("100")); - // owner can spend 1000000000000000 - await pushContract - .connect(owner) - .approve(valContract.address, ethers.utils.parseEther("1000000000000000")); - - return { - pushContract: pushContract, - valContract: valContract, - owner: owner, - node1Wallet: node1Wallet, - node2Wallet: node2Wallet, - acc1: acc1, - acc2: acc2 - }; - } + pushContract_: PushToken; + valContract_: ValidatorV1; + owner_: SignerWithAddress; + + node1Wallet_: SignerWithAddress; + node2Wallet_: SignerWithAddress; + + acc1_: SignerWithAddress; + acc2_: SignerWithAddress; + + static async build() { + console.log('building snapshot'); + + debug('deploying ValidatorV1'); + // Contracts are deployed using the first signer/account by default + const [owner, node1Wallet, node2Wallet, acc1, acc2] = await ethers.getSigners(); + + const ptFactory = await ethers.getContractFactory("PushToken"); + const pushContract = await ptFactory.deploy(); + + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushContract.address, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + debug(`deployed proxy: ${validatorV1Proxy.address}`); + + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + console.log(`deployed impl: ${validatorV1Impl}`); + debug('done'); + + const storageProxyAddr = await deployStorageContract(validatorV1Proxy); + + await validatorV1Proxy.setStorageContract(storageProxyAddr); + // const valFactory = await ethers.getContractFactory("ValidatorV1"); + const valContract = validatorV1Proxy; + // + // await pushContract.mint(owner.address, ethers.utils.parseEther("100")); + // // owner can spend 1000000000000000 + // await pushContract + // .connect(owner) + // .approve(valContract.address, ethers.utils.parseEther("1000000000000000")); + + return { + pushContract_: pushContract, + valContract_: valContract, + owner_: owner, + node1Wallet_: node1Wallet, + node2Wallet_: node2Wallet, + acc1_: acc1, + acc2_: acc2 + }; + } } -describe("Validator Transfer contract ownership", function () { - - it("Transfer ownership if the new owner is different", async function () { - const {valContract, acc1} = await loadFixture(State1.build); - console.log("Old Owner : ", await valContract.owner()); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - console.log("Ownership to be transferred to : ", await valContract.newOwner()); - }); - - it("Transfer ownership is not possible if the new owner is same as old owner", async function () { - const {valContract, acc1, owner} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(owner.address)) - .to.be.revertedWith('Cannot transfer ownership to the current owner.'); - }); - - it("Transfer ownership is not possible if the new owner is zero address", async function () { - /*const {valContract, acc1, owner} =*/ - await loadFixture(State1.build); - // await expect(valContract.transferOwnership(ethers.constants.AddressZero)) - // .to.be.revertedWith('Cannot transfer ownership to address(0)'); - }) - - it("Transfer is only possible by the owner", async function () { - const {valContract, acc1, owner} = await loadFixture(State1.build); - await expect(valContract.connect(acc1).transferOwnership(acc1.address)) - .to.be.revertedWith('Only the owner can transfer ownership.'); - }); - - it("Accepting ownership is only possible by the new owner", async function () { - const {valContract, acc1} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(acc1).acceptOwnership()) - .to.emit(valContract, "LogAcceptOwnership"); - }); - it("Accepting ownership is not possible by any other address", async function () { - const {pushContract, valContract, owner, acc1, acc2} = await loadFixture(State1.build); - await expect(valContract.transferOwnership(acc1.address)) - .to.emit(valContract, "LogTransferOwnership"); - await expect(valContract.connect(acc2).acceptOwnership()) - .to.be.revertedWith('Only the new owner can accept the ownership.'); - }); + +describe("vto Valdator ownership", function () { + let valCt:ValidatorV1; + let owner:SignerWithAddress; + let acc1:SignerWithAddress; + let acc2:SignerWithAddress; + + beforeEach(async () => { + const s = await loadFixture(State1.build); + valCt = s.valContract_; + acc1 = s.acc1_; + owner = s.owner_; + acc2 = s.acc2_; + }) + + it('tdi transfer to a different owner', async function () { + + const oldOwner = await valCt.owner(); + assert.notEqual(oldOwner, acc1.address); + + const transferTx = valCt.transferOwnership(acc1.address); + await expect(transferTx).to.emit(valCt, "OwnershipTransferStarted"); + + const acceptTx = valCt.connect(acc1).acceptOwnership(); + await expect(acceptTx).to.emit(valCt, 'OwnershipTransferred'); + const newOwner = await valCt.owner(); + + assert.equal(newOwner, acc1.address); + }); + + it("tbno tranfer by a non-owner", async function () { + const transferTx = valCt.connect(acc1).transferOwnership(acc1.address); + await expect(transferTx).to.be.reverted; + }); + + it("ta3 transfer accepted by 3rd party", async function () { + const transferTx = valCt.transferOwnership(acc1.address); + await expect(transferTx).to.emit(valCt, "OwnershipTransferStarted"); + + const acceptTx = valCt.connect(acc2).acceptOwnership(); + await expect(acceptTx).to.be.reverted; + + }); }); describe("Validator Test1", function () { - it("Deploy Validator contract and Push Contract", async function () { - console.log("ValidatorTest"); - let {pushContract, valContract} = await State1.build(); - expect(pushContract.address).to.be.properAddress; - expect(valContract.address).to.be.properAddress; - console.log(`push contract at `, pushContract.address); - console.log(`validator contract at `, valContract.address); - }); - - it("Register 1 Node, insufficient collateral", async function () { - const {valContract, node1Wallet} = await State1.build(); - await expect(valContract.registerNodeAndStake(50, 0, - "http://snode1:3000", node1Wallet.address)) - .to.be.revertedWith('Insufficient collateral for VNODE'); - }) - - it("Register 1 Node, but not a duplicate public key", async function () { - const {valContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); - { - let t1 = valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - console.log('nodeInfo:', nodeInfo); - } - { - let t1 = valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet.address); - await expect(t1).to.be.revertedWith("a node with pubKey is already defined"); - } - }) - - it("Register 2 Nodes", async function () { - const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); - { - let t1 = valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); - { - let t1 = valContract.registerNodeAndStake(200, 0, - "http://snode2:3000", node2Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node2Wallet.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); - { - let t2 = await valContract.getNodes(); - console.log(t2); - } - }) + it("Deploy Validator contract and Push Contract", async function () { + debug("ValidatorTest"); + let {pushContract_, valContract_} = await State1.build(); + expect(pushContract_.address).to.be.properAddress; + expect(valContract_.address).to.be.properAddress; + debug(`push contract at `, pushContract_.address); + debug(`validator contract at `, valContract_.address); + }); + + it("Register 1 Node, insufficient collateral", async function () { + const {valContract_, node1Wallet_} = await State1.build(); + await expect(valContract_.registerNodeAndStake(50, 0, + "http://snode1:3000", node1Wallet_.address)) + .to.be.revertedWith('Insufficient collateral for VNODE'); + }) + + it("Register 1 Node, but not a duplicate public key", async function () { + const {valContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + { + let t1 = valContract_.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet_.address); + await expect(t1).to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + debug('nodeInfo:', nodeInfo); + } + { + let t1 = valContract_.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet_.address); + await expect(t1).to.be.revertedWith("a node with pubKey is already defined"); + } + }) + + it("Register 2 Nodes", async function () { + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); + { + let t1 = valContract_.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet_.address); + await expect(t1).to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); + { + let t1 = valContract_.registerNodeAndStake(200, 0, + "http://snode2:3000", node2Wallet_.address); + await expect(t1).to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(300); + { + let t2 = await valContract_.getNodes(); + debug(t2); + } + }) }); describe("Tests for TestHelper", function () { - it("testhasfields", async function () { - const object1 = { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }; - - const object2 = { - field1: 'value1', - field2: 'value2', - }; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - { - field1: 'value1', - field2: 'value2', - }, false)).to.be.true; - - expect(t.hasAllFields({ - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, { - field1: 'value_', - field2: 'value2', - }, true)).to.be.false; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - }, - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - true)).to.be.false; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - }, - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - false)).to.be.false; - }); + it("testhasfields", async function () { + const object1 = { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }; + + const object2 = { + field1: 'value1', + field2: 'value2', + }; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + { + field1: 'value1', + field2: 'value2', + }, false)).to.be.true; + + expect(t.hasAllFields({ + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, { + field1: 'value_', + field2: 'value2', + }, true)).to.be.false; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + true)).to.be.false; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + false)).to.be.false; + }); }); describe("Validator Tests :: A node reports on other node", function () { - it("report-tc1", async function () { - const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); - - let message = "0xAA"; - let node1Signature = await ValidatorHelper.sign(node1Wallet, message); - let signatures = [node1Signature]; - console.log(`voteData=${message}, signatures=${signatures}`); - // simulate a read only method - just to get method output - let result1 = await valContract.callStatic.reportNode(message, signatures); - console.log(`result=${result1}`); - expect(result1).to.be.equal(0); - }) - - - it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { - // register node1, node2 - const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); - { - let t1 = valContract.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); - { - let t1 = valContract.registerNodeAndStake(200, 0, - "http://snode2:3000", node2Wallet.address); - await expect(t1).to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node2Wallet.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushContract.balanceOf(valContract.address)).to.be.equal(300); - { - let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, node2Wallet.address); - let node1Signature = await ValidatorHelper.sign(node1Wallet, reportThatNode2IsBad); - let signers = [node1Wallet.address]; - let signatures = [node1Signature]; - console.log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); - - let contractAsNode1 = valContract.connect(node1Wallet); - { - // node1 reports on node2 (1st report) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); - expect(nodeInfo.counters.reportCounter).to.be.equal(1); - - let bn:BigNumber = BigNumber.from(1); - expect(bn instanceof BigNumber).to.be.true; - - await t.expectEventFirst(tx, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 200 - }); - } - { - // node1 reports on node2 (2nd report - slash occurs - NodeStatusChanged event ) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); - console.log(nodeInfo); - expect(nodeInfo.status).to.be.equal(2); // slashed - expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% - expect(nodeInfo.counters.reportCounter).to.be.equal(0); - expect(nodeInfo.counters.slashCounter).to.be.equal(1); - - await t.expectEvent(tx, 0, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 200 - }); - - await t.expectEvent(tx, 1, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Slashed, - nodeTokens: 198 - }); - } - { - // node1 reports on node2 (3rd - NodeStatusChanged event) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); - expect(nodeInfo.counters.reportCounter).to.be.equal(1); - console.log(nodeInfo); - - await t.expectEventFirst(tx, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 198 - }); - } - { - // node1 reports on node2 (4th - 2nd slash occurs - NodeStatusChanged event - // and then ban occurs - NodeStatusChanged event) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - let nodeInfo = await valContract.getNodeInfo(node2Wallet.address); - console.log('4th report'); - console.log(nodeInfo); - expect(nodeInfo.status).to.be.equal(3); // banned - expect(nodeInfo.nodeTokens).to.be.equal(0); // because we unstaked automatically - expect(nodeInfo.counters.reportCounter).to.be.equal(0); - expect(nodeInfo.counters.slashCounter).to.be.equal(2); - console.log('events ', (await tx.wait(1)).events); - await t.expectEvent(tx, 0, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 198 - }); - await t.expectEvent(tx, 1, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.Slashed, - nodeTokens: 196 - }); - await t.expectEvent(tx, 2, { - nodeWallet: node2Wallet.address, - nodeStatus: NodeStatus.BannedAndUnstaked, - nodeTokens: 0 - }); - } - } - }) + it("report-tc1", async function () { + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + + let message = "0xAA"; + let node1Signature = await ValidatorHelper.sign(node1Wallet_, message); + let signatures = [node1Signature]; + debug(`voteData=${message}, signatures=${signatures}`); + // simulate a read only method - just to get method output + let result1 = await valContract_.callStatic.reportNode(message, signatures); + debug(`result=${result1}`); + expect(result1).to.be.equal(0); + }) + + + it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { + // register node1, node2 + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + { + let t1 = valContract_.registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet_.address); + await expect(t1).to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); + { + let t1 = valContract_.registerNodeAndStake(200, 0, + "http://snode2:3000", node2Wallet_.address); + await expect(t1).to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(300); + { + let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, node2Wallet_.address); + let node1Signature = await ValidatorHelper.sign(node1Wallet_, reportThatNode2IsBad); + let signers = [node1Wallet_.address]; + let signatures = [node1Signature]; + debug(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); + + let contractAsNode1 = valContract_.connect(node1Wallet_); + { + // node1 reports on node2 (1st report) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.confirmTransaction(tx); + + let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + expect(nodeInfo.counters.reportCounter).to.be.equal(1); + + let bn: BigNumber = BigNumber.from(1); + expect(bn instanceof BigNumber).to.be.true; + + await t.expectEventFirst(tx, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Reported, + nodeTokens: 200 + }); + } + { + // node1 reports on node2 (2nd report - slash occurs - NodeStatusChanged event ) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.confirmTransaction(tx); + + let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + debug(nodeInfo); + expect(nodeInfo.status).to.be.equal(2); // slashed + expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% + expect(nodeInfo.counters.reportCounter).to.be.equal(0); + expect(nodeInfo.counters.slashCounter).to.be.equal(1); + + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Reported, + nodeTokens: 200 + }); + + await t.expectEvent(tx, 1, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Slashed, + nodeTokens: 198 + }); + } + { + // node1 reports on node2 (3rd - NodeStatusChanged event) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.confirmTransaction(tx); + + let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + expect(nodeInfo.counters.reportCounter).to.be.equal(1); + debug(nodeInfo); + + await t.expectEventFirst(tx, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Reported, + nodeTokens: 198 + }); + } + { + // node1 reports on node2 (4th - 2nd slash occurs - NodeStatusChanged event + // and then ban occurs - NodeStatusChanged event) + let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); + await t.confirmTransaction(tx); + let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + debug('4th report'); + debug(nodeInfo); + expect(nodeInfo.status).to.be.equal(3); // banned + expect(nodeInfo.nodeTokens).to.be.equal(0); // because we unstaked automatically + expect(nodeInfo.counters.reportCounter).to.be.equal(0); + expect(nodeInfo.counters.slashCounter).to.be.equal(2); + debug('events ', (await tx.wait(1)).events); + await t.expectEvent(tx, 0, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Reported, + nodeTokens: 198 + }); + await t.expectEvent(tx, 1, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.Slashed, + nodeTokens: 196 + }); + await t.expectEvent(tx, 2, { + nodeWallet: node2Wallet_.address, + nodeStatus: NodeStatus.BannedAndUnstaked, + nodeTokens: 0 + }); + } + } + }) }); describe("Validator Tests :: Test unstake", function () { - it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { - const {valContract, pushContract, owner, node1Wallet, node2Wallet} = await State1.build(); //await loadFixture(chain1); - // register 1 node (+ check all amounts before and after) - { - let ownerBalanceBefore = await pushContract.balanceOf(owner.address); - let valContractBalanceBefore = await pushContract.balanceOf(valContract.address); - let valContractAllowanceForOwner = await pushContract.allowance(owner.address, valContract.address); - console.log(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); - expect(valContractAllowanceForOwner).to.be.greaterThan(100); - - let tx = await valContract - .connect(owner) - .registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet.address); - await t.confirmTransaction(tx); - - let ownerBalanceAfter = await pushContract.balanceOf(owner.address); - let valContractBalanceAfter = await pushContract.balanceOf(valContract.address); - console.log(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); - expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); - expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); - - await expect(tx) - .to.emit(valContract, "NodeAdded") - .withArgs(owner.address, node1Wallet.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushContract.balanceOf(valContract.address)).to.be.equal(100); - // non-owner calls unstake - { - let tx = valContract - .connect(node2Wallet) - .unstakeNode(node1Wallet.address); - await expect(tx).revertedWith('only owner can unstake a node'); - } - // owner calls unstake - { - let ni1 = await valContract.getNodeInfo(node1Wallet.address); - expect(ni1.status).to.be.equal(0); - expect(ni1.nodeTokens).to.be.equal(100); - - - let ownerBalanceBefore = await pushContract.balanceOf(owner.address); - let valContractBalanceBefore = await pushContract.balanceOf(valContract.address); - console.log(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); - - let tx = await valContract - .connect(owner) - .unstakeNode(node1Wallet.address); - await t.confirmTransaction(tx); - - let nodeInfo = await valContract.getNodeInfo(node1Wallet.address); - expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); - expect(nodeInfo.nodeTokens).to.be.equal(0); - - let ownerBalanceAfter = await pushContract.balanceOf(owner.address); - let valContractBalanceAfter = await pushContract.balanceOf(valContract.address); // todo !!!! - console.log(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); - expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); - expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); - - await expect(tx) - .to.emit(valContract, "NodeStatusChanged") - .withArgs(node1Wallet.address, NodeStatus.Unstaked, 0); - } - - }) + it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + // register 1 node (+ check all amounts before and after) + { + let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); + let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); + let valContractAllowanceForOwner = await pushContract_.allowance(owner_.address, valContract_.address); + debug(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); + expect(valContractAllowanceForOwner).to.be.greaterThan(100); + + let tx = await valContract_ + .connect(owner_) + .registerNodeAndStake(100, 0, + "http://snode1:3000", node1Wallet_.address); + await t.confirmTransaction(tx); + + let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); + let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); + debug(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); + + await expect(tx) + .to.emit(valContract_, "NodeAdded") + .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); + // non-owner calls unstake + { + let tx = valContract_ + .connect(node2Wallet_) + .unstakeNode(node1Wallet_.address); + await expect(tx).revertedWith('only owner can unstake a node'); + } + // owner calls unstake + { + let ni1 = await valContract_.getNodeInfo(node1Wallet_.address); + expect(ni1.status).to.be.equal(0); + expect(ni1.nodeTokens).to.be.equal(100); + + + let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); + let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); + debug(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); + + let tx = await valContract_ + .connect(owner_) + .unstakeNode(node1Wallet_.address); + await t.confirmTransaction(tx); + + let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); + expect(nodeInfo.nodeTokens).to.be.equal(0); + + let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); + let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); // todo !!!! + debug(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); + + await expect(tx) + .to.emit(valContract_, "NodeStatusChanged") + .withArgs(node1Wallet_.address, NodeStatus.Unstaked, 0); + } + + }) }); From aebf0301eb794aa645a28397a28504ecda98fbff Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 15:42:20 +0400 Subject: [PATCH 42/84] add: fixed register node tests --- .../test/ValidatorContract.test.ts | 113 ++++++++++-------- 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index c58ab5e..0fbcc7a 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -11,27 +11,47 @@ import {TestHelper as t} from "./TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber} from "ethers"; -let debug = console.log; +let log = console.log; -async function deployStorageContract(validatorV1Proxy): Promise { - debug('deploying StorageV2') - let validatorContract = validatorV1Proxy.address; +async function deployPushTokenFake():Promise { + const ptFactory = await ethers.getContractFactory("PushToken"); + const pushContract = await ptFactory.deploy(); + return pushContract; +} + +async function deployValidatorContract(pushCt: PushToken) { + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushCt.address, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + log(`deployed proxy: ${validatorV1Proxy.address}`); + + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + log(`deployed impl: ${validatorV1Impl}`); + log('done'); + return validatorV1Proxy; +} + +async function deployStorageContract(valCt:ValidatorV1): Promise { + log('deploying StorageV2') let protocolVersion = 1; let rfTarget = 5; const factory = await ethers.getContractFactory("StorageV2"); const proxyCt = await upgrades.deployProxy(factory, - [protocolVersion, validatorContract, rfTarget], + [protocolVersion, valCt.address, rfTarget], {kind: "uups"}); await proxyCt.deployed(); - debug(`deployed proxy: ${proxyCt.address}`); + log(`deployed proxy: ${proxyCt.address}`); let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); - debug(`deployed impl: ${implCt}`); - debug('done'); + log(`deployed impl: ${implCt}`); + log('done'); return proxyCt.address; } + export class State1 { pushContract_: PushToken; valContract_: ValidatorV1; @@ -44,41 +64,28 @@ export class State1 { acc2_: SignerWithAddress; static async build() { - console.log('building snapshot'); + log('building snapshot'); - debug('deploying ValidatorV1'); + log('deploying ValidatorV1'); // Contracts are deployed using the first signer/account by default const [owner, node1Wallet, node2Wallet, acc1, acc2] = await ethers.getSigners(); - const ptFactory = await ethers.getContractFactory("PushToken"); - const pushContract = await ptFactory.deploy(); - - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushContract.address, 1, 1, 1], - {kind: "uups"}); - await validatorV1Proxy.deployed(); - debug(`deployed proxy: ${validatorV1Proxy.address}`); + const pushCt = await deployPushTokenFake(); - let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); - console.log(`deployed impl: ${validatorV1Impl}`); - debug('done'); + const valCt = await deployValidatorContract(pushCt); - const storageProxyAddr = await deployStorageContract(validatorV1Proxy); + const storeCt = await deployStorageContract(valCt); + await valCt.setStorageContract(storeCt); - await validatorV1Proxy.setStorageContract(storageProxyAddr); - // const valFactory = await ethers.getContractFactory("ValidatorV1"); - const valContract = validatorV1Proxy; - // - // await pushContract.mint(owner.address, ethers.utils.parseEther("100")); - // // owner can spend 1000000000000000 - // await pushContract - // .connect(owner) - // .approve(valContract.address, ethers.utils.parseEther("1000000000000000")); + await pushCt.mint(owner.address, ethers.utils.parseEther("100")); + await pushCt + .connect(owner) + .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); + // todo remove return { - pushContract_: pushContract, - valContract_: valContract, + pushContract_: pushCt, + valContract_: valCt, owner_: owner, node1Wallet_: node1Wallet, node2Wallet_: node2Wallet, @@ -89,7 +96,7 @@ export class State1 { } -describe("vto Valdator ownership", function () { +describe("vto Valdator ownership tests", function () { let valCt:ValidatorV1; let owner:SignerWithAddress; let acc1:SignerWithAddress; @@ -133,15 +140,15 @@ describe("vto Valdator ownership", function () { }); }); -describe("Validator Test1", function () { +describe("vrn Validator register nodes tests", function () { it("Deploy Validator contract and Push Contract", async function () { - debug("ValidatorTest"); + log("ValidatorTest"); let {pushContract_, valContract_} = await State1.build(); expect(pushContract_.address).to.be.properAddress; expect(valContract_.address).to.be.properAddress; - debug(`push contract at `, pushContract_.address); - debug(`validator contract at `, valContract_.address); + log(`push contract at `, pushContract_.address); + log(`validator contract at `, valContract_.address); }); it("Register 1 Node, insufficient collateral", async function () { @@ -160,7 +167,7 @@ describe("Validator Test1", function () { .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); expect(nodeInfo.status).to.be.equal(0); - debug('nodeInfo:', nodeInfo); + log('nodeInfo:', nodeInfo); } { let t1 = valContract_.registerNodeAndStake(100, 0, @@ -191,7 +198,7 @@ describe("Validator Test1", function () { expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(300); { let t2 = await valContract_.getNodes(); - debug(t2); + log(t2); } }) }); @@ -263,10 +270,10 @@ describe("Validator Tests :: A node reports on other node", function () { let message = "0xAA"; let node1Signature = await ValidatorHelper.sign(node1Wallet_, message); let signatures = [node1Signature]; - debug(`voteData=${message}, signatures=${signatures}`); + log(`voteData=${message}, signatures=${signatures}`); // simulate a read only method - just to get method output let result1 = await valContract_.callStatic.reportNode(message, signatures); - debug(`result=${result1}`); + log(`result=${result1}`); expect(result1).to.be.equal(0); }) @@ -297,7 +304,7 @@ describe("Validator Tests :: A node reports on other node", function () { let node1Signature = await ValidatorHelper.sign(node1Wallet_, reportThatNode2IsBad); let signers = [node1Wallet_.address]; let signatures = [node1Signature]; - debug(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); + log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); let contractAsNode1 = valContract_.connect(node1Wallet_); { @@ -323,7 +330,7 @@ describe("Validator Tests :: A node reports on other node", function () { await t.confirmTransaction(tx); let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); - debug(nodeInfo); + log(nodeInfo); expect(nodeInfo.status).to.be.equal(2); // slashed expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% expect(nodeInfo.counters.reportCounter).to.be.equal(0); @@ -348,7 +355,7 @@ describe("Validator Tests :: A node reports on other node", function () { let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); - debug(nodeInfo); + log(nodeInfo); await t.expectEventFirst(tx, { nodeWallet: node2Wallet_.address, @@ -362,13 +369,13 @@ describe("Validator Tests :: A node reports on other node", function () { let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); await t.confirmTransaction(tx); let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); - debug('4th report'); - debug(nodeInfo); + log('4th report'); + log(nodeInfo); expect(nodeInfo.status).to.be.equal(3); // banned expect(nodeInfo.nodeTokens).to.be.equal(0); // because we unstaked automatically expect(nodeInfo.counters.reportCounter).to.be.equal(0); expect(nodeInfo.counters.slashCounter).to.be.equal(2); - debug('events ', (await tx.wait(1)).events); + log('events ', (await tx.wait(1)).events); await t.expectEvent(tx, 0, { nodeWallet: node2Wallet_.address, nodeStatus: NodeStatus.Reported, @@ -399,7 +406,7 @@ describe("Validator Tests :: Test unstake", function () { let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); let valContractAllowanceForOwner = await pushContract_.allowance(owner_.address, valContract_.address); - debug(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); + log(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); expect(valContractAllowanceForOwner).to.be.greaterThan(100); let tx = await valContract_ @@ -410,7 +417,7 @@ describe("Validator Tests :: Test unstake", function () { let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); - debug(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + log(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); @@ -437,7 +444,7 @@ describe("Validator Tests :: Test unstake", function () { let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); - debug(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); + log(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); let tx = await valContract_ .connect(owner_) @@ -450,7 +457,7 @@ describe("Validator Tests :: Test unstake", function () { let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); // todo !!!! - debug(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + log(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); From b5d1732e90d197080376a1e8e331499d2c9a72df Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 15:48:36 +0400 Subject: [PATCH 43/84] add: fixed testHelper tests --- smart-contracts/test/StorageContract.test.ts | 2 +- smart-contracts/test/TestHelper.test.ts | 63 +++++++++++++++++++ .../test/ValidatorContract.test.ts | 61 +----------------- .../test/{ => uitlz}/TestHelper.ts | 2 +- 4 files changed, 66 insertions(+), 62 deletions(-) create mode 100644 smart-contracts/test/TestHelper.test.ts rename smart-contracts/test/{ => uitlz}/TestHelper.ts (98%) diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index d313aea..a2df4db 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -8,7 +8,7 @@ import {ethers} from "hardhat"; import {Contract, ContractTransaction} from "ethers"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {BitUtil} from "./uitlz/bitUtil"; -import {TestHelper as t} from "./TestHelper"; +import {TestHelper as t} from "./uitlz/TestHelper"; import {CollectionUtil} from "./uitlz/collectionUtil"; import {NodeStatus} from "./ValidatorHelper"; diff --git a/smart-contracts/test/TestHelper.test.ts b/smart-contracts/test/TestHelper.test.ts new file mode 100644 index 0000000..910937f --- /dev/null +++ b/smart-contracts/test/TestHelper.test.ts @@ -0,0 +1,63 @@ +import {expect} from "chai"; +import {TestHelper as t} from "./uitlz/TestHelper"; + +describe("Tests for TestHelper", function () { + it("testhasfields", async function () { + const object1 = { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }; + + const object2 = { + field1: 'value1', + field2: 'value2', + }; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + { + field1: 'value1', + field2: 'value2', + }, false)).to.be.true; + + expect(() => { + t.hasAllFields({ + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, { + field1: 'value_', + field2: 'value2', + }, true) + }).to.throw; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + true)).to.be.false; + + expect(t.hasAllFields( + { + field1: 'value1', + field2: 'value2', + }, + { + field1: 'value1', + field2: 'value2', + field3: 'value3', + }, + false)).to.be.false; + }); +}); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 0fbcc7a..313c2f1 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -7,7 +7,7 @@ import {expect, assert} from "chai"; import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -import {TestHelper as t} from "./TestHelper"; +import {TestHelper as t} from "./uitlz/TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber} from "ethers"; @@ -203,65 +203,6 @@ describe("vrn Validator register nodes tests", function () { }) }); -describe("Tests for TestHelper", function () { - it("testhasfields", async function () { - const object1 = { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }; - - const object2 = { - field1: 'value1', - field2: 'value2', - }; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - { - field1: 'value1', - field2: 'value2', - }, false)).to.be.true; - - expect(t.hasAllFields({ - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, { - field1: 'value_', - field2: 'value2', - }, true)).to.be.false; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - }, - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - true)).to.be.false; - - expect(t.hasAllFields( - { - field1: 'value1', - field2: 'value2', - }, - { - field1: 'value1', - field2: 'value2', - field3: 'value3', - }, - false)).to.be.false; - }); -}); - describe("Validator Tests :: A node reports on other node", function () { it("report-tc1", async function () { diff --git a/smart-contracts/test/TestHelper.ts b/smart-contracts/test/uitlz/TestHelper.ts similarity index 98% rename from smart-contracts/test/TestHelper.ts rename to smart-contracts/test/uitlz/TestHelper.ts index 9f6284e..4aa78cf 100644 --- a/smart-contracts/test/TestHelper.ts +++ b/smart-contracts/test/uitlz/TestHelper.ts @@ -1,6 +1,6 @@ import {BigNumber, ContractTransaction} from "ethers"; import {expect, assert} from "chai"; -import {ValidatorV1} from "../typechain-types"; +import {ValidatorV1} from "../../typechain-types"; import {Event} from "@ethersproject/contracts/src.ts"; export class TestHelper { From 2a97abe89cf3273e90c4ae1e0ae3199fe86d78d0 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 15:59:25 +0400 Subject: [PATCH 44/84] add: all tests work --- smart-contracts/test/StorageContract.test.ts | 5 +++++ smart-contracts/test/ValidatorContract.test.ts | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index a2df4db..306a661 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -447,6 +447,11 @@ describe("StorageTestNoAutoRf", function () { describe('StorageTestBig', function () { + // runs only when ENV is set because it takes time + if(process.env.StorageTestBig!=='true') { + return; + } + beforeEach(beforeEachInit); let nodeCount = 0; diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 313c2f1..62f97c5 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -96,7 +96,7 @@ export class State1 { } -describe("vto Valdator ownership tests", function () { +describe("vto Valdator - ownership tests", function () { let valCt:ValidatorV1; let owner:SignerWithAddress; let acc1:SignerWithAddress; @@ -140,7 +140,7 @@ describe("vto Valdator ownership tests", function () { }); }); -describe("vrn Validator register nodes tests", function () { +describe("vrn Validator - register nodes tests", function () { it("Deploy Validator contract and Push Contract", async function () { log("ValidatorTest"); @@ -203,9 +203,10 @@ describe("vrn Validator register nodes tests", function () { }) }); -describe("Validator Tests :: A node reports on other node", function () { +describe("vnro Validator - node reports on other node", function () { it("report-tc1", async function () { + // todo improve this test const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); let message = "0xAA"; @@ -337,8 +338,7 @@ describe("Validator Tests :: A node reports on other node", function () { }) }); - -describe("Validator Tests :: Test unstake", function () { +describe("vuns Validator - Test unstake", function () { it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); From 59375d57333455634f9c07d66f54c765bc207b8c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 17:55:01 +0400 Subject: [PATCH 45/84] add: fixed SignatureTest and StorageTestBig --- smart-contracts/test/Signature.test.ts | 15 ++++---- smart-contracts/test/StorageContract.test.ts | 2 +- .../test/ValidatorContract.test.ts | 37 +++++++++++-------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/smart-contracts/test/Signature.test.ts b/smart-contracts/test/Signature.test.ts index 13c5d92..5975e70 100644 --- a/smart-contracts/test/Signature.test.ts +++ b/smart-contracts/test/Signature.test.ts @@ -3,7 +3,7 @@ import {loadFixture} from "@nomicfoundation/hardhat-network-helpers"; import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; -import {expect} from "chai"; +import {expect, assert} from "chai"; import {ethers} from "hardhat"; import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; @@ -40,9 +40,10 @@ function getEthSignedMessageHashJS(messageHash:string) { * https://solidity-by-example.org/signature/ * https://github.com/t4sk/hello-erc20-permit/blob/main/test/verify-signature.js */ -describe.skip("SignatureTest", function () { +describe("SignatureTest", function () { it("tc1", async function () { + console.log('started') // signers const [owner, node1Wallet] = await ethers.getSigners(); // deploy contract @@ -53,12 +54,12 @@ describe.skip("SignatureTest", function () { let message = "0xAA"; console.log(`signingAddress: ${node1Wallet.address}`); - const hash = await contract.getMessageHash(message); - const sig = await node1Wallet.signMessage(ethers.utils.arrayify(hash)); - const ethHash = await contract.getEthSignedMessageHash(hash); + const hashCalculatedByContract = await contract.getMessageHash(message); + const sig = await node1Wallet.signMessage(ethers.utils.arrayify(hashCalculatedByContract)); + const ethHash = await contract.getEthSignedMessageHash(hashCalculatedByContract); - const hash2 = getMessageHashJS(message); - expect(hash2).to.be.equal(hash); + const hashCalculatedByJs = getMessageHashJS(message); + assert.equal(hashCalculatedByJs, hashCalculatedByContract); console.log("signer ", node1Wallet.address) diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index 306a661..27da4d0 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -528,7 +528,6 @@ describe('StorageTestBig', function () { // nodes = 40..1 , rf = 1..10 10..1 for (let nodeCount = NODES_TO_TRY; nodeCount >= 1; nodeCount--) { - await removeNode(nodeCount); for (let rf = 1; rf <= Math.min(nodeCount, RF_TO_TRY); rf++) { console.log('%s testing shardcount: %d nodecount: %d rf: %d', '-'.repeat(30), shardCount, nodeCount, rf); if (nodeCount >= rf) { @@ -541,6 +540,7 @@ describe('StorageTestBig', function () { await setRfAndShuffle(rf); } } + await removeNode(nodeCount); } } }).timeout(600000); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 62f97c5..739036e 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -9,12 +9,12 @@ import {PushToken, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./uitlz/TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; -import {BigNumber} from "ethers"; +import {BigNumber, Contract} from "ethers"; let log = console.log; -async function deployPushTokenFake():Promise { +async function deployPushTokenFake(): Promise { const ptFactory = await ethers.getContractFactory("PushToken"); const pushContract = await ptFactory.deploy(); return pushContract; @@ -34,7 +34,7 @@ async function deployValidatorContract(pushCt: PushToken) { return validatorV1Proxy; } -async function deployStorageContract(valCt:ValidatorV1): Promise { +async function deployStorageContract(valCt: ValidatorV1): Promise { log('deploying StorageV2') let protocolVersion = 1; let rfTarget = 5; @@ -50,6 +50,11 @@ async function deployStorageContract(valCt:ValidatorV1): Promise { return proxyCt.address; } +export enum NodeType { + VNode = 0, // validator 0 + SNode = 1, // storage 1 + DNode = 2 // delivery 2 +} export class State1 { @@ -79,8 +84,8 @@ export class State1 { await pushCt.mint(owner.address, ethers.utils.parseEther("100")); await pushCt - .connect(owner) - .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); + .connect(owner) + .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); // todo remove return { @@ -97,10 +102,10 @@ export class State1 { describe("vto Valdator - ownership tests", function () { - let valCt:ValidatorV1; - let owner:SignerWithAddress; - let acc1:SignerWithAddress; - let acc2:SignerWithAddress; + let valCt: ValidatorV1; + let owner: SignerWithAddress; + let acc1: SignerWithAddress; + let acc2: SignerWithAddress; beforeEach(async () => { const s = await loadFixture(State1.build); @@ -144,7 +149,7 @@ describe("vrn Validator - register nodes tests", function () { it("Deploy Validator contract and Push Contract", async function () { log("ValidatorTest"); - let {pushContract_, valContract_} = await State1.build(); + let {pushContract_, valContract_} = await loadFixture(State1.build); expect(pushContract_.address).to.be.properAddress; expect(valContract_.address).to.be.properAddress; log(`push contract at `, pushContract_.address); @@ -152,14 +157,14 @@ describe("vrn Validator - register nodes tests", function () { }); it("Register 1 Node, insufficient collateral", async function () { - const {valContract_, node1Wallet_} = await State1.build(); + const {valContract_, node1Wallet_} = await loadFixture(State1.build); await expect(valContract_.registerNodeAndStake(50, 0, "http://snode1:3000", node1Wallet_.address)) .to.be.revertedWith('Insufficient collateral for VNODE'); }) it("Register 1 Node, but not a duplicate public key", async function () { - const {valContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + const {valContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { let t1 = valContract_.registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet_.address); @@ -177,7 +182,7 @@ describe("vrn Validator - register nodes tests", function () { }) it("Register 2 Nodes", async function () { - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { let t1 = valContract_.registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet_.address); @@ -207,7 +212,7 @@ describe("vnro Validator - node reports on other node", function () { it("report-tc1", async function () { // todo improve this test - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); let message = "0xAA"; let node1Signature = await ValidatorHelper.sign(node1Wallet_, message); @@ -222,7 +227,7 @@ describe("vnro Validator - node reports on other node", function () { it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { // register node1, node2 - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { let t1 = valContract_.registerNodeAndStake(100, 0, "http://snode1:3000", node1Wallet_.address); @@ -341,7 +346,7 @@ describe("vnro Validator - node reports on other node", function () { describe("vuns Validator - Test unstake", function () { it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await State1.build(); //await loadFixture(chain1); + const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); // register 1 node (+ check all amounts before and after) { let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); From f77b12518d9d6ed4962e800079a924de0903a934 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 7 Sep 2023 22:52:24 +0400 Subject: [PATCH 46/84] add: test cleanup --- .../test/ValidatorContract.test.ts | 354 +++++++++--------- 1 file changed, 181 insertions(+), 173 deletions(-) diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 739036e..f7cfdb1 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -5,7 +5,7 @@ import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; import {expect, assert} from "chai"; import {ethers} from "hardhat"; -import {PushToken, ValidatorV1} from "../typechain-types"; +import {PushToken, StorageV2, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./uitlz/TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; @@ -15,12 +15,16 @@ let log = console.log; async function deployPushTokenFake(): Promise { + log('deploying PushToken'); const ptFactory = await ethers.getContractFactory("PushToken"); const pushContract = await ptFactory.deploy(); + log(`deployed impl: ${pushContract.address}`); + log('done'); return pushContract; } -async function deployValidatorContract(pushCt: PushToken) { +async function deployValidatorContract(pushCt: PushToken): Promise { + log('deploying ValidatorV1'); const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, [1, pushCt.address, 1, 1, 1], @@ -34,7 +38,7 @@ async function deployValidatorContract(pushCt: PushToken) { return validatorV1Proxy; } -async function deployStorageContract(valCt: ValidatorV1): Promise { +async function deployStorageContract(valCt: ValidatorV1): Promise { log('deploying StorageV2') let protocolVersion = 1; let rfTarget = 5; @@ -47,7 +51,7 @@ async function deployStorageContract(valCt: ValidatorV1): Promise { let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); log(`deployed impl: ${implCt}`); log('done'); - return proxyCt.address; + return proxyCt; } export enum NodeType { @@ -56,67 +60,67 @@ export enum NodeType { DNode = 2 // delivery 2 } +// VARIABLES FOR TESTS +let valCt: ValidatorV1; +let pushCt: PushToken; +let storeCt: StorageV2; +let owner: SignerWithAddress; +let signers: SignerWithAddress[]; +let acc1: SignerWithAddress; +let acc2: SignerWithAddress; +let vnode1: SignerWithAddress; +let vnode2: SignerWithAddress; + +class DeployInfo { + pushCt: PushToken; + valCt: ValidatorV1; + storeCt: StorageV2; + signers: SignerWithAddress[]; +} -export class State1 { - pushContract_: PushToken; - valContract_: ValidatorV1; - owner_: SignerWithAddress; +async function initBlockchain(): Promise { + log('building snapshot'); - node1Wallet_: SignerWithAddress; - node2Wallet_: SignerWithAddress; + // Contracts are deployed using the first signer/account by default + const signers = await ethers.getSigners(); + const [owner_] = signers; - acc1_: SignerWithAddress; - acc2_: SignerWithAddress; + const pushCt = await deployPushTokenFake(); - static async build() { - log('building snapshot'); + const valCt = await deployValidatorContract(pushCt); - log('deploying ValidatorV1'); - // Contracts are deployed using the first signer/account by default - const [owner, node1Wallet, node2Wallet, acc1, acc2] = await ethers.getSigners(); + const storeCt = await deployStorageContract(valCt); + await valCt.setStorageContract(storeCt.address); - const pushCt = await deployPushTokenFake(); + await pushCt.mint(owner_.address, ethers.utils.parseEther("100")); + await pushCt + .connect(owner_) + .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); - const valCt = await deployValidatorContract(pushCt); + return {pushCt, valCt, storeCt, signers}; +} - const storeCt = await deployStorageContract(valCt); - await valCt.setStorageContract(storeCt); +async function beforeEachInit() { + const di = await loadFixture(initBlockchain); + pushCt = di.pushCt; + valCt = di.valCt; + storeCt = di.storeCt; + owner = di.signers[0]; + signers = di.signers; - await pushCt.mint(owner.address, ethers.utils.parseEther("100")); - await pushCt - .connect(owner) - .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); + acc1 = signers[1]; + acc2 = signers[2]; + vnode1 = signers[3]; + vnode2 = signers[4]; - // todo remove - return { - pushContract_: pushCt, - valContract_: valCt, - owner_: owner, - node1Wallet_: node1Wallet, - node2Wallet_: node2Wallet, - acc1_: acc1, - acc2_: acc2 - }; - } } describe("vto Valdator - ownership tests", function () { - let valCt: ValidatorV1; - let owner: SignerWithAddress; - let acc1: SignerWithAddress; - let acc2: SignerWithAddress; - - beforeEach(async () => { - const s = await loadFixture(State1.build); - valCt = s.valContract_; - acc1 = s.acc1_; - owner = s.owner_; - acc2 = s.acc2_; - }) - it('tdi transfer to a different owner', async function () { + beforeEach(beforeEachInit); + it('tdi transfer to a different owner', async function () { const oldOwner = await valCt.owner(); assert.notEqual(oldOwner, acc1.address); @@ -148,61 +152,56 @@ describe("vto Valdator - ownership tests", function () { describe("vrn Validator - register nodes tests", function () { it("Deploy Validator contract and Push Contract", async function () { - log("ValidatorTest"); - let {pushContract_, valContract_} = await loadFixture(State1.build); - expect(pushContract_.address).to.be.properAddress; - expect(valContract_.address).to.be.properAddress; - log(`push contract at `, pushContract_.address); - log(`validator contract at `, valContract_.address); + expect(pushCt.address).to.be.properAddress; + expect(valCt.address).to.be.properAddress; + log(`push contract at `, pushCt.address); + log(`validator contract at `, valCt.address); }); it("Register 1 Node, insufficient collateral", async function () { - const {valContract_, node1Wallet_} = await loadFixture(State1.build); - await expect(valContract_.registerNodeAndStake(50, 0, - "http://snode1:3000", node1Wallet_.address)) + await expect(valCt.registerNodeAndStake(50, 0, + "http://snode1:3000", vnode1.address)) .to.be.revertedWith('Insufficient collateral for VNODE'); }) it("Register 1 Node, but not a duplicate public key", async function () { - const {valContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { - let t1 = valContract_.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet_.address); - await expect(t1).to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); log('nodeInfo:', nodeInfo); } { - let t1 = valContract_.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); await expect(t1).to.be.revertedWith("a node with pubKey is already defined"); } }) it("Register 2 Nodes", async function () { - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { - let t1 = valContract_.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet_.address); - await expect(t1).to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } - expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); { - let t1 = valContract_.registerNodeAndStake(200, 0, + let t1 = valCt.registerNodeAndStake(200, 0, "http://snode2:3000", node2Wallet_.address); - await expect(t1).to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } - expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(300); + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); { - let t2 = await valContract_.getNodes(); + let t2 = await valCt.getNodes(); log(t2); } }) @@ -211,15 +210,12 @@ describe("vrn Validator - register nodes tests", function () { describe("vnro Validator - node reports on other node", function () { it("report-tc1", async function () { - // todo improve this test - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); - let message = "0xAA"; - let node1Signature = await ValidatorHelper.sign(node1Wallet_, message); + let node1Signature = await ValidatorHelper.sign(vnode1, message); let signatures = [node1Signature]; log(`voteData=${message}, signatures=${signatures}`); // simulate a read only method - just to get method output - let result1 = await valContract_.callStatic.reportNode(message, signatures); + let result1 = await valCt.callStatic.reportNode(message, signatures); log(`result=${result1}`); expect(result1).to.be.equal(0); }) @@ -227,46 +223,45 @@ describe("vnro Validator - node reports on other node", function () { it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { // register node1, node2 - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); { - let t1 = valContract_.registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet_.address); - await expect(t1).to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } - expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); { - let t1 = valContract_.registerNodeAndStake(200, 0, - "http://snode2:3000", node2Wallet_.address); - await expect(t1).to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(200, 0, + "http://snode2:3000", vnode2.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode2.address, 0, 200, "http://snode2:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } - expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(300); + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); { - let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, node2Wallet_.address); - let node1Signature = await ValidatorHelper.sign(node1Wallet_, reportThatNode2IsBad); - let signers = [node1Wallet_.address]; + let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, vnode2.address); + let node1Signature = await ValidatorHelper.sign(vnode1, reportThatNode2IsBad); + let signers = [vnode1.address]; let signatures = [node1Signature]; log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); - let contractAsNode1 = valContract_.connect(node1Wallet_); + let contractAsNode1 = valCt.connect(vnode1); { // node1 reports on node2 (1st report) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); await t.confirmTransaction(tx); - let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + let nodeInfo = await valCt.getNodeInfo(vnode2.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); let bn: BigNumber = BigNumber.from(1); expect(bn instanceof BigNumber).to.be.true; await t.expectEventFirst(tx, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Reported, nodeTokens: 200 }); @@ -276,7 +271,7 @@ describe("vnro Validator - node reports on other node", function () { let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); await t.confirmTransaction(tx); - let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + let nodeInfo = await valCt.getNodeInfo(vnode2.address); log(nodeInfo); expect(nodeInfo.status).to.be.equal(2); // slashed expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% @@ -284,13 +279,13 @@ describe("vnro Validator - node reports on other node", function () { expect(nodeInfo.counters.slashCounter).to.be.equal(1); await t.expectEvent(tx, 0, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Reported, nodeTokens: 200 }); await t.expectEvent(tx, 1, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Slashed, nodeTokens: 198 }); @@ -300,12 +295,12 @@ describe("vnro Validator - node reports on other node", function () { let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); await t.confirmTransaction(tx); - let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + let nodeInfo = await valCt.getNodeInfo(vnode2.address); expect(nodeInfo.counters.reportCounter).to.be.equal(1); log(nodeInfo); await t.expectEventFirst(tx, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Reported, nodeTokens: 198 }); @@ -315,7 +310,7 @@ describe("vnro Validator - node reports on other node", function () { // and then ban occurs - NodeStatusChanged event) let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); await t.confirmTransaction(tx); - let nodeInfo = await valContract_.getNodeInfo(node2Wallet_.address); + let nodeInfo = await valCt.getNodeInfo(vnode2.address); log('4th report'); log(nodeInfo); expect(nodeInfo.status).to.be.equal(3); // banned @@ -324,95 +319,108 @@ describe("vnro Validator - node reports on other node", function () { expect(nodeInfo.counters.slashCounter).to.be.equal(2); log('events ', (await tx.wait(1)).events); await t.expectEvent(tx, 0, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Reported, nodeTokens: 198 }); await t.expectEvent(tx, 1, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.Slashed, nodeTokens: 196 }); await t.expectEvent(tx, 2, { - nodeWallet: node2Wallet_.address, + nodeWallet: vnode2.address, nodeStatus: NodeStatus.BannedAndUnstaked, nodeTokens: 0 }); } } }) -}); -describe("vuns Validator - Test unstake", function () { + // STORAGE NODE --- - it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { - const {valContract_, pushContract_, owner_, node1Wallet_, node2Wallet_} = await loadFixture(State1.build); - // register 1 node (+ check all amounts before and after) + it("asn add storage node", async function () { + // register node1, node2 { - let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); - let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); - let valContractAllowanceForOwner = await pushContract_.allowance(owner_.address, valContract_.address); - log(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); - expect(valContractAllowanceForOwner).to.be.greaterThan(100); - - let tx = await valContract_ - .connect(owner_) - .registerNodeAndStake(100, 0, - "http://snode1:3000", node1Wallet_.address); - await t.confirmTransaction(tx); - - let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); - let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); - log(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); - expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); - expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); - - await expect(tx) - .to.emit(valContract_, "NodeAdded") - .withArgs(owner_.address, node1Wallet_.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); + let t1 = valCt.registerNodeAndStake(100, 0, + "", vnode1.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } - expect(await pushContract_.balanceOf(valContract_.address)).to.be.equal(100); - // non-owner calls unstake - { - let tx = valContract_ - .connect(node2Wallet_) - .unstakeNode(node1Wallet_.address); - await expect(tx).revertedWith('only owner can unstake a node'); - } - // owner calls unstake - { - let ni1 = await valContract_.getNodeInfo(node1Wallet_.address); - expect(ni1.status).to.be.equal(0); - expect(ni1.nodeTokens).to.be.equal(100); + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); + }); + describe("vuns Validator - Test unstake", function () { - let ownerBalanceBefore = await pushContract_.balanceOf(owner_.address); - let valContractBalanceBefore = await pushContract_.balanceOf(valContract_.address); - log(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); + it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { + // register 1 node (+ check all amounts before and after) + { + let ownerBalanceBefore = await pushCt.balanceOf(owner.address); + let valContractBalanceBefore = await pushCt.balanceOf(valCt.address); + let valContractAllowanceForOwner = await pushCt.allowance(owner.address, valCt.address); + log(`before registerNodeAndStake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}, valContractAllowanceForOwner=${valContractAllowanceForOwner}`); + expect(valContractAllowanceForOwner).to.be.greaterThan(100); + + let tx = await valCt + .connect(owner) + .registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); + await t.confirmTransaction(tx); - let tx = await valContract_ - .connect(owner_) - .unstakeNode(node1Wallet_.address); - await t.confirmTransaction(tx); + let ownerBalanceAfter = await pushCt.balanceOf(owner.address); + let valContractBalanceAfter = await pushCt.balanceOf(valCt.address); + log(`after registerNodeAndStake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(-100); + + await expect(tx) + .to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); + expect(nodeInfo.status).to.be.equal(0); + } + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); + // non-owner calls unstake + { + let tx = valCt + .connect(vnode2) + .unstakeNode(vnode1.address); + await expect(tx).revertedWith('only owner can unstake a node'); + } + // owner calls unstake + { + let ni1 = await valCt.getNodeInfo(vnode1.address); + expect(ni1.status).to.be.equal(0); + expect(ni1.nodeTokens).to.be.equal(100); - let nodeInfo = await valContract_.getNodeInfo(node1Wallet_.address); - expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); - expect(nodeInfo.nodeTokens).to.be.equal(0); - let ownerBalanceAfter = await pushContract_.balanceOf(owner_.address); - let valContractBalanceAfter = await pushContract_.balanceOf(valContract_.address); // todo !!!! - log(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); - expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); - expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); + let ownerBalanceBefore = await pushCt.balanceOf(owner.address); + let valContractBalanceBefore = await pushCt.balanceOf(valCt.address); + log(`before unstake: owner=${ownerBalanceBefore}, valContract=${valContractBalanceBefore}`); - await expect(tx) - .to.emit(valContract_, "NodeStatusChanged") - .withArgs(node1Wallet_.address, NodeStatus.Unstaked, 0); - } + let tx = await valCt + .connect(owner) + .unstakeNode(vnode1.address); + await t.confirmTransaction(tx); - }) -}); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); + expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); + expect(nodeInfo.nodeTokens).to.be.equal(0); + let ownerBalanceAfter = await pushCt.balanceOf(owner.address); + let valContractBalanceAfter = await pushCt.balanceOf(valCt.address); // todo !!!! + log(`after unstake: owner=${ownerBalanceAfter}, valContract=${valContractBalanceAfter}`); + expect((valContractBalanceAfter.sub(valContractBalanceBefore))).to.be.equal(-100); + expect((ownerBalanceAfter.sub(ownerBalanceBefore))).to.be.equal(+100); + + await expect(tx) + .to.emit(valCt, "NodeStatusChanged") + .withArgs(vnode1.address, NodeStatus.Unstaked, 0); + } + }) + }); + +}); From 85ffe4b0fd2ae7b33746159ffa4270227a9558b3 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 8 Sep 2023 02:38:36 +0400 Subject: [PATCH 47/84] add: test V contract calls S contract on registerNode --- .../test/ValidatorContract.test.ts | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index f7cfdb1..a8e1b68 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -10,6 +10,7 @@ import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./uitlz/TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber, Contract} from "ethers"; +import {BitUtil} from "./uitlz/bitUtil"; let log = console.log; @@ -70,6 +71,8 @@ let acc1: SignerWithAddress; let acc2: SignerWithAddress; let vnode1: SignerWithAddress; let vnode2: SignerWithAddress; +let snode1: SignerWithAddress; +let snode2: SignerWithAddress; class DeployInfo { pushCt: PushToken; @@ -113,6 +116,9 @@ async function beforeEachInit() { vnode1 = signers[3]; vnode2 = signers[4]; + snode1 = signers[5]; + snode2 = signers[6]; + } @@ -151,6 +157,8 @@ describe("vto Valdator - ownership tests", function () { describe("vrn Validator - register nodes tests", function () { + beforeEach(beforeEachInit); + it("Deploy Validator contract and Push Contract", async function () { expect(pushCt.address).to.be.properAddress; expect(valCt.address).to.be.properAddress; @@ -193,9 +201,9 @@ describe("vrn Validator - register nodes tests", function () { expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); { let t1 = valCt.registerNodeAndStake(200, 0, - "http://snode2:3000", node2Wallet_.address); + "http://snode2:3000", vnode2.address); await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, node2Wallet_.address, 0, 200, "http://snode2:3000"); + .withArgs(owner.address, vnode2.address, 0, 200, "http://snode2:3000"); let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(0); } @@ -207,8 +215,11 @@ describe("vrn Validator - register nodes tests", function () { }) }); + describe("vnro Validator - node reports on other node", function () { + beforeEach(beforeEachInit); + it("report-tc1", async function () { let message = "0xAA"; let node1Signature = await ValidatorHelper.sign(vnode1, message); @@ -337,23 +348,46 @@ describe("vnro Validator - node reports on other node", function () { } }) - // STORAGE NODE --- + // STORAGE NODE --------------------------------------------------------------------------------- - it("asn add storage node", async function () { + it("asn add storage node to both Validator and Storage contracts", async function () { // register node1, node2 + const allShards = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]; { - let t1 = valCt.registerNodeAndStake(100, 0, - "", vnode1.address); + let t1 = valCt.registerNodeAndStake(100, NodeType.SNode, "", snode1.address); await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valCt.getNodeInfo(vnode1.address); + .withArgs(owner.address, snode1.address, NodeType.SNode, 100, ""); + let nodeInfo = await valCt.getNodeInfo(snode1.address); expect(nodeInfo.status).to.be.equal(0); + + const bitmask = await storeCt.getNodeShardsByAddr(snode1.address); + assert.deepEqual(BitUtil.bitsToPositions(bitmask), allShards); } - expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); + { + let t1 = valCt.registerNodeAndStake(100, NodeType.SNode, "", snode2.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, snode2.address, NodeType.SNode, 100, ""); + let nodeInfo = await valCt.getNodeInfo(snode2.address); + expect(nodeInfo.status).to.be.equal(0); + + const bitmask1 = await storeCt.getNodeShardsByAddr(snode1.address); + log(bitmask1.toString(2)); + assert.deepEqual(BitUtil.bitsToPositions(bitmask1), allShards); + const bitmask2 = await storeCt.getNodeShardsByAddr(snode1.address); + log(bitmask2.toString(2)); + assert.deepEqual(BitUtil.bitsToPositions(bitmask2), allShards); + } + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(200); }); + describe("vuns Validator - Test unstake", function () { + beforeEach(beforeEachInit); + it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { // register 1 node (+ check all amounts before and after) { From ceb2a516a20e0cc253c670ef263f5d48d97dd31f Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 8 Sep 2023 13:43:11 +0400 Subject: [PATCH 48/84] add: test V contract calls S contract on unregisterUnode --- smart-contracts/contracts/Storage.sol | 11 +++ smart-contracts/contracts/Validator.sol | 83 ++++++++++------- .../test/ValidatorContract.test.ts | 88 ++++++++++++++----- smart-contracts/test/uitlz/TestHelper.ts | 5 ++ 4 files changed, 132 insertions(+), 55 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index e3a8183..862d6ac 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -46,6 +46,7 @@ map after: Map(3) { 3 => Set(7) { 1, 2, 3, 4, 7, 9, 10 } } +todo getNodeShardsByAddr return an array instead of bitmap? */ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { // number of shards; @@ -241,6 +242,16 @@ contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { return uint8(nodeIdList.length); } + function getNodeAddresses() public view returns (address[] memory) { + uint size = nodeIdList.length; + address[] memory nodeAddrArr = new address[](size); + for (uint i = 0; i < size; i++) { + uint8 nodeId = nodeIdList[i]; + nodeAddrArr[i] = mapNodeIdToAddr[nodeId]; + } + return nodeAddrArr; + } + function getBit(uint32 self_, uint8 index_) private pure returns (uint8) { return uint8(self_ >> index_ & 1); } diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 978100f..2bb09b3 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./Storage.sol"; +import "hardhat/console.sol"; /* Validator smart contract @@ -22,7 +23,11 @@ and show that inbox to the UI. All the stacking, node management, slashing is done in this contrect Validator.sol S has it's own Storage.sol contract, which manages only S shard assignments. +todo recalculate on addNode: + REPORT_NODES,REPORT_CNT_MAX,SLASH_CNT_MAX + attestersRequired,nodeRandomMinCount,nodeRandomPingCount +todo ensure NodeInfo storage targetNode_ , is used carefully in all methods */ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { @@ -199,13 +204,15 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { storageContract = addr_; } - // ----------------------------- IMPL -------------------------------------------------- + // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- - // Registers a new validator node - // Locks PUSH tokens ($_token) with $_collateral amount. - // A node will run from a _nodeWallet - // ACCESS: Any node can call this + /* + Registers a new validator node + Locks PUSH tokens ($_token) with $_collateral amount. + A node will run from a _nodeWallet + ACCESS: Any node can call this + */ function registerNodeAndStake(uint256 nodeTokens_, NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { uint256 coll = nodeTokens_; @@ -226,6 +233,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 allowed = pushToken.allowance(msg.sender, address(this)); require(allowed >= nodeTokens_, "_nodeTokens cannot be transferred, check allowance"); // new mapping + console.log('node owner is ', msg.sender); NodeInfo memory n; n.ownerWallet = msg.sender; n.nodeWallet = nodeWallet_; @@ -248,6 +256,21 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit NodeAdded(msg.sender, nodeWallet_, nodeType_, coll, nodeApiBaseUrl_); } + + /* + Remove node (if you are the node owner) + ACCESS: Any node can call this + */ + function unstakeNode(address nodeWallet_) public { + NodeInfo storage node = nodeMap[nodeWallet_]; + require(node.nodeWallet != address(0), "node does not exists"); + require(node.ownerWallet == msg.sender || owner() == msg.sender, "only owner can unstake a node"); + _unstakeNode(node); + node.status = NodeStatus.Unstaked; + emit NodeStatusChanged(node.nodeWallet, NodeStatus.Unstaked, 0); + } + + /* Complain on an existing node; N attesters can request to report malicious activity for a specific node also slashes if the # of complains meet the required threshold @@ -282,6 +305,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return _reportNode(vm, targetNode); } + // ----------------------------- IMPL -------------------------------------------------- + + // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler function _reportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); @@ -308,38 +334,33 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* Returns remaining collateral */ - function reduceCollateral(address _nodeWallet, uint32 _percentage) private returns (uint256) { - require(_nodeWallet != address(0)); - require(_percentage >= 0 && _percentage <= 100, "percentage should be in [0, 100]"); + function reduceCollateral(address nodeWallet_, uint32 percentage_) private returns (uint256) { + require(nodeWallet_ != address(0)); + require(percentage_ >= 0 && percentage_ <= 100, "percentage should be in [0, 100]"); // reduce only nodeTokens; we do not transfer any tokens; it will affect only 'unstake' - NodeInfo storage node = nodeMap[_nodeWallet]; - uint256 currentAmount = node.nodeTokens; - uint256 newAmount = (currentAmount * (100 - _percentage)) / 100; - uint256 delta = currentAmount - newAmount; - node.nodeTokens = newAmount; - totalStaked -= delta; - totalPenalties += delta; - return newAmount; - } - - - function unstakeNode(address _nodeWallet) external { - NodeInfo storage node = nodeMap[_nodeWallet]; - require(node.nodeWallet != address(0), "node does not exists"); - require(node.ownerWallet == msg.sender, "only owner can unstake a node"); - doUnstake(node); - node.status = NodeStatus.Unstaked; - emit NodeStatusChanged(node.nodeWallet, NodeStatus.Unstaked, 0); + NodeInfo storage node = nodeMap[nodeWallet_]; + uint256 currentAmount_ = node.nodeTokens; + uint256 newAmount_ = (currentAmount_ * (100 - percentage_)) / 100; + uint256 delta_ = currentAmount_ - newAmount_; + node.nodeTokens = newAmount_; + totalStaked -= delta_; + totalPenalties += delta_; + return newAmount_; } /* Returns unstaked amount */ - function doUnstake(NodeInfo storage targetNode) private returns (uint256){ - uint256 delta = targetNode.nodeTokens; - require(pushToken.transfer(targetNode.ownerWallet, delta), "failed to trasfer funds back to owner"); - targetNode.nodeTokens = 0; + function _unstakeNode(NodeInfo storage targetNode_) private returns (uint256){ + uint256 delta = targetNode_.nodeTokens; + require(pushToken.transfer(targetNode_.ownerWallet, delta), "failed to trasfer funds back to owner"); + targetNode_.nodeTokens = 0; totalStaked -= delta; + if(targetNode_.nodeType == NodeType.SNode) { + require(storageContract != address(0), 'no storage contract defined'); + StorageV2 s = StorageV2(storageContract); + s.removeNode(targetNode_.nodeWallet); + } return delta; } @@ -374,7 +395,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function doBan(NodeInfo storage targetNode) private { reduceCollateral(targetNode.nodeWallet, BAN_PERCENT); - doUnstake(targetNode); + _unstakeNode(targetNode); targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index a8e1b68..f2ad577 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -95,11 +95,12 @@ async function initBlockchain(): Promise { const storeCt = await deployStorageContract(valCt); await valCt.setStorageContract(storeCt.address); - await pushCt.mint(owner_.address, ethers.utils.parseEther("100")); - await pushCt - .connect(owner_) - .approve(valCt.address, ethers.utils.parseEther("1000000000000000")); - + for (let s of [owner_, signers[1], signers[2]]) { + await pushCt.mint(s.address, ethers.utils.parseEther("100")); + await pushCt + .connect(s) + .approve(valCt.address, ethers.utils.parseEther("100"));//1000000000000000 + } return {pushCt, valCt, storeCt, signers}; } @@ -122,11 +123,11 @@ async function beforeEachInit() { } -describe("vto Valdator - ownership tests", function () { +describe("Valdator - ownership tests / vot", function () { beforeEach(beforeEachInit); - it('tdi transfer to a different owner', async function () { + it('transfer to a different owner / tdi', async function () { const oldOwner = await valCt.owner(); assert.notEqual(oldOwner, acc1.address); @@ -155,7 +156,7 @@ describe("vto Valdator - ownership tests", function () { }); }); -describe("vrn Validator - register nodes tests", function () { +describe("Validator - register nodes tests / vrn", function () { beforeEach(beforeEachInit); @@ -216,7 +217,7 @@ describe("vrn Validator - register nodes tests", function () { }); -describe("vnro Validator - node reports on other node", function () { +describe("Validator - node reports on other node / vnro", function () { beforeEach(beforeEachInit); @@ -347,48 +348,87 @@ describe("vnro Validator - node reports on other node", function () { } } }) +}) + +describe("Storage", function () { - // STORAGE NODE --------------------------------------------------------------------------------- + beforeEach(beforeEachInit); - it("asn add storage node to both Validator and Storage contracts", async function () { + it("add storage node to both Validator and Storage contracts / asn1", async function () { // register node1, node2 const allShards = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]; { - let t1 = valCt.registerNodeAndStake(100, NodeType.SNode, "", snode1.address); + // add snode1 with owner acc1 + log('valCt: ', valCt.address); + log('valCt owner: ', owner.address); + log('snode1 owner1: ', acc1.address); + log('snode1: ', snode1.address); + let t1 = await valCt.connect(acc1) + .registerNodeAndStake(100, NodeType.SNode, "", snode1.address); await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, snode1.address, NodeType.SNode, 100, ""); + .withArgs(acc1.address, snode1.address, NodeType.SNode, 100, ""); + let nodeInfo = await valCt.getNodeInfo(snode1.address); expect(nodeInfo.status).to.be.equal(0); const bitmask = await storeCt.getNodeShardsByAddr(snode1.address); assert.deepEqual(BitUtil.bitsToPositions(bitmask), allShards); } + { - let t1 = valCt.registerNodeAndStake(100, NodeType.SNode, "", snode2.address); + // add snode2 with owner acc2 + log('valCt: ', valCt.address); + log('valCt owner: ', owner.address); + log('snode1 owner2: ', acc2.address); + log('snode2: ', snode2.address); + let t1 = await valCt.connect(acc2) + .registerNodeAndStake(200, NodeType.SNode, "", snode2.address); await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, snode2.address, NodeType.SNode, 100, ""); + .withArgs(acc2.address, snode2.address, NodeType.SNode, 200, ""); + let nodeInfo = await valCt.getNodeInfo(snode2.address); expect(nodeInfo.status).to.be.equal(0); - const bitmask1 = await storeCt.getNodeShardsByAddr(snode1.address); - log(bitmask1.toString(2)); - assert.deepEqual(BitUtil.bitsToPositions(bitmask1), allShards); - const bitmask2 = await storeCt.getNodeShardsByAddr(snode1.address); - log(bitmask2.toString(2)); - assert.deepEqual(BitUtil.bitsToPositions(bitmask2), allShards); + const bitmask = await storeCt.getNodeShardsByAddr(snode2.address); + assert.deepEqual(BitUtil.bitsToPositions(bitmask), allShards); } - expect(await pushCt.balanceOf(valCt.address)).to.be.equal(200); + // total funds locked = sum of both nodes stakes, + // all nodes are visible in all contracts + expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); + assert.deepEqual(await valCt.getNodes(), [snode1.address, snode2.address]) + assert.deepEqual(await storeCt.getNodeAddresses(), [snode1.address, snode2.address]) + + + { + // remove node1 + const t1 = await valCt.connect(acc1).unstakeNode(snode1.address); + await t.confirmTransaction(t1); + const t2 = await valCt.connect(acc1).unstakeNode(snode1.address); // try unstake 2nd time + expect(t2).to.be.reverted; + const t3 = valCt.connect(acc2).unstakeNode(snode1.address); // try unstake: not a node owner + expect(t3).to.be.reverted; + } + { + // remove node2 + const t1 = await valCt.connect(acc2).unstakeNode(snode2.address); + await t.confirmTransaction(t1); + const t2 = valCt.connect(acc2).unstakeNode(snode2.address); // try unstake 2nd time + expect(t2).to.be.reverted; + const t3 = valCt.connect(acc1).unstakeNode(snode2.address); // try unstake: not a node owner + expect(t3).to.be.reverted; + } + }); - describe("vuns Validator - Test unstake", function () { + describe("Validator - Test unstake / vtu", function () { beforeEach(beforeEachInit); - it("unstake-test-1 :: register 1 node / unstake to bad address / unstake to owner address", async function () { + it("register 1 node / unstake to bad address / unstake to owner address | unstake-test-1", async function () { // register 1 node (+ check all amounts before and after) { let ownerBalanceBefore = await pushCt.balanceOf(owner.address); diff --git a/smart-contracts/test/uitlz/TestHelper.ts b/smart-contracts/test/uitlz/TestHelper.ts index 4aa78cf..01f025d 100644 --- a/smart-contracts/test/uitlz/TestHelper.ts +++ b/smart-contracts/test/uitlz/TestHelper.ts @@ -48,6 +48,11 @@ export class TestHelper { // console.log('tx logs', receipt.logs); } + static async logEvents(tx: ContractTransaction) { + const receipt = await tx.wait(); + console.log(receipt.events); + } + static async filterEventsFromTransaction(contract: ValidatorV1, tx: ContractTransaction, eventName: string): Promise { const receipt = await tx.wait(); From 91eeb82f736236bb78b75c86eabfe1d4d8338c8f Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 9 Sep 2023 17:37:38 +0400 Subject: [PATCH 49/84] add: StorageV2 -> StorageV1 --- smart-contracts/contracts/Storage.sol | 2 +- smart-contracts/contracts/Validator.sol | 4 ++-- smart-contracts/test/StorageContract.test.ts | 2 +- smart-contracts/test/ValidatorContract.test.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 862d6ac..b72a451 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -48,7 +48,7 @@ map after: Map(3) { todo getNodeShardsByAddr return an array instead of bitmap? */ -contract StorageV2 is Ownable2StepUpgradeable, UUPSUpgradeable { +contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // number of shards; // this value should not change after deploy // also this should match data type in mapNodeToShards (uint32/64/128/256) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 2bb09b3..099ebaf 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -249,7 +249,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { if(nodeType_ == NodeType.SNode) { // try to register this node for shard mappings require(storageContract != address(0), 'no storage contract defined'); - StorageV2 s = StorageV2(storageContract); + StorageV1 s = StorageV1(storageContract); s.addNode(nodeWallet_); } // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); @@ -358,7 +358,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { totalStaked -= delta; if(targetNode_.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); - StorageV2 s = StorageV2(storageContract); + StorageV1 s = StorageV1(storageContract); s.removeNode(targetNode_.nodeWallet); } return delta; diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index 27da4d0..45242ed 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -65,7 +65,7 @@ async function state1(): Promise { let protocolVersion = 1; let validatorContract = '0x' + '0'.repeat(40); let rfTarget = 5; - const factory = await ethers.getContractFactory("StorageV2"); + const factory = await ethers.getContractFactory("StorageV1"); const proxyCt: TypedStorageContract = await upgrades.deployProxy(factory, [protocolVersion, validatorContract, rfTarget], {kind: "uups"}); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index f2ad577..a9d3476 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -40,10 +40,10 @@ async function deployValidatorContract(pushCt: PushToken): Promise } async function deployStorageContract(valCt: ValidatorV1): Promise { - log('deploying StorageV2') + log('deploying StorageV1') let protocolVersion = 1; let rfTarget = 5; - const factory = await ethers.getContractFactory("StorageV2"); + const factory = await ethers.getContractFactory("StorageV1"); const proxyCt = await upgrades.deployProxy(factory, [protocolVersion, valCt.address, rfTarget], {kind: "uups"}); From 86fcbbd448048e1fe0937ae0e299462e45a10d5b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 11 Sep 2023 15:18:45 +0400 Subject: [PATCH 50/84] add: deployStorageCt command, registerStorage command --- smart-contracts/hardhat.config.ts | 2 +- smart-contracts/src/DeployerUtil.ts | 64 +++++++++++++ .../utilz/TaskUtil.ts => src/RegisterUtil.ts} | 2 +- smart-contracts/tasks/deployTasks.ts | 93 ++++++++++--------- .../{validatorTasks.ts => registerTasks.ts} | 32 ++++++- smart-contracts/test/StorageContract.test.ts | 26 +++--- .../test/ValidatorContract.test.ts | 20 ++-- 7 files changed, 161 insertions(+), 78 deletions(-) create mode 100644 smart-contracts/src/DeployerUtil.ts rename smart-contracts/{tasks/utilz/TaskUtil.ts => src/RegisterUtil.ts} (98%) rename smart-contracts/tasks/{validatorTasks.ts => registerTasks.ts} (66%) diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index 2273a9f..c1e10fc 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -46,4 +46,4 @@ export default config; /* TASKS */ import "./tasks/deployTasks" import "./tasks/keyTasks" -import "./tasks/validatorTasks" \ No newline at end of file +import "./tasks/registerTasks" \ No newline at end of file diff --git a/smart-contracts/src/DeployerUtil.ts b/smart-contracts/src/DeployerUtil.ts new file mode 100644 index 0000000..d3bfe7d --- /dev/null +++ b/smart-contracts/src/DeployerUtil.ts @@ -0,0 +1,64 @@ +import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; +import {HardhatRuntimeEnvironment} from "hardhat/types"; + +let log = console.log; + + +export namespace DeployerUtil { + + export async function deployPushTokenFake(hre: HardhatRuntimeEnvironment): Promise { + log('deploying PushToken'); + const ptFactory = await hre.ethers.getContractFactory("PushToken"); + const pushContract = await ptFactory.deploy(); + log(`deployed impl: ${pushContract.address}`); + log('done'); + return pushContract; + } + + export async function deployValidatorContract(hre: HardhatRuntimeEnvironment, pushCt:string): Promise { + log('deploying ValidatorV1'); + const validatorV1Factory = await hre.ethers.getContractFactory("ValidatorV1"); + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, + [1, pushCt, 1, 1, 1], + {kind: "uups"}); + await validatorV1Proxy.deployed(); + log(`deployed proxy: ${validatorV1Proxy.address}`); + + let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); + log(`deployed impl: ${validatorV1Impl}`); + log('done'); + return validatorV1Proxy; + } + + export async function updateValidatorContract(hre:HardhatRuntimeEnvironment, validatorProxyCt:string) { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + log(`owner is ${owner.address}`); + log(`proxy is ${validatorProxyCt}`); + const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); + const abi = await upgrades.upgradeProxy(validatorProxyCt, validatorV1Factory, {kind: 'uups'}); + log(`updated proxy at address: ${abi.address}`); + } + + export async function deployStorageContract(hre: HardhatRuntimeEnvironment, valCt: string): Promise { + log('deploying StorageV1') + let protocolVersion = 1; + let rfTarget = 5; + const factory = await hre.ethers.getContractFactory("StorageV1"); + const proxyCt = await upgrades.deployProxy(factory, + [protocolVersion, valCt, rfTarget], + {kind: "uups"}); + await proxyCt.deployed(); + log(`deployed proxy: ${proxyCt.address}`); + let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); + log(`deployed impl: ${implCt}`); + log('done'); + return proxyCt; + } +} + +export enum NodeType { + VNode = 0, // validator 0 + SNode = 1, // storage 1 + DNode = 2 // delivery 2 +} \ No newline at end of file diff --git a/smart-contracts/tasks/utilz/TaskUtil.ts b/smart-contracts/src/RegisterUtil.ts similarity index 98% rename from smart-contracts/tasks/utilz/TaskUtil.ts rename to smart-contracts/src/RegisterUtil.ts index 56f9c3f..ef520c7 100644 --- a/smart-contracts/tasks/utilz/TaskUtil.ts +++ b/smart-contracts/src/RegisterUtil.ts @@ -3,7 +3,7 @@ import {HardhatRuntimeEnvironment} from "hardhat/types"; let info = console.log; -export class TaskUtil { +export class RegisterUtil { /** * * @param pushAddr push smart contract (deployed) diff --git a/smart-contracts/tasks/deployTasks.ts b/smart-contracts/tasks/deployTasks.ts index deec5ce..515c529 100644 --- a/smart-contracts/tasks/deployTasks.ts +++ b/smart-contracts/tasks/deployTasks.ts @@ -1,56 +1,61 @@ import {subtask, task, types} from "hardhat/config" +import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; +import {ethers} from "hardhat"; +import {DeployerUtil} from "../src/DeployerUtil"; -let info = console.log; +let log = console.log; task("v:deployTestPushTokenCt", "register a test push token; owner emits 10k for himself") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - info(`owner is ${owner.address}`); + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + log(`owner is ${owner.address}`); - const pushTokenFactory = await ethers.getContractFactory("PushToken"); - const pushToken = await pushTokenFactory.deploy(); - await pushToken.deployed(); - info(`pushToken deployed`); + const pushToken = await DeployerUtil.deployPushTokenFake(hre); + log(`pushToken deployed`); - const mintAmount = "100000"; - const amount = ethers.utils.parseEther(mintAmount); - await pushToken.mint(owner.address, amount); - let finalBalance = await pushToken.balanceOf(owner.address); - info(`minted ${mintAmount} for owner ${owner.address}, balance is ${finalBalance}`); - info(`pushToken address: ${pushToken.address}`); - }); + const mintAmount = "100000"; + const amount = ethers.utils.parseEther(mintAmount); + await pushToken.mint(owner.address, amount); + let finalBalance = await pushToken.balanceOf(owner.address); + log(`minted ${mintAmount} for owner ${owner.address}, balance is ${finalBalance}`); + log(`pushToken address: ${pushToken.address}`); + }); task("v:deployValidatorCt", "deploys validatorCt") - .addPositionalParam("pushCt", "push token contract") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - const pushCt = taskArgs.pushCt; - info(`owner is ${owner.address}`); - info(`pushcontract is ${pushCt}`); - - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushCt, 1, 1, 1], - {kind: "uups"}); - await validatorV1Proxy.deployed(); - info(`deployed proxy: ${validatorV1Proxy.address}`); - let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); - console.log(`deployed impl: ${validatorV1Impl}`); - }); + .addPositionalParam("pushCt", "push token contract") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const pushCt = taskArgs.pushCt; + log(`owner is ${owner.address}`); + log(`pushcontract is ${pushCt}`); + + const validatorCt = await DeployerUtil.deployValidatorContract(hre, pushCt); + }); task("v:updateValidatorCt", "redeploys a new validatorCt") - .addPositionalParam("validatorProxyCt", "validatorCt proxy address") - .setAction(async (taskArgs, hre) => { - const ethers = hre.ethers; - const [owner] = await hre.ethers.getSigners(); - const validatorProxyCt = taskArgs.validatorProxyCt; - info(`owner is ${owner.address}`); - info(`proxy is ${validatorProxyCt}`); - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const abi = await upgrades.upgradeProxy(validatorProxyCt, validatorV1Factory, {kind: 'uups'}); - info(`updated proxy at address: ${abi.address}`); - }); \ No newline at end of file + .addPositionalParam("validatorProxyCt", "validatorCt proxy address") + .setAction(async (taskArgs, hre) => { + await DeployerUtil.updateValidatorContract(hre, taskArgs.validatorProxyCt); + }); + + +task("v:deployStorageCt", "deploys validatorCt and registers it into validator contract") + .addPositionalParam("validatorContract", "validator contract") + .setAction(async (taskArgs, hre) => { + const ethers = hre.ethers; + const [owner] = await hre.ethers.getSigners(); + const pushCt = taskArgs.pushCt; + const valCtAddr: string = taskArgs.validatorContract; + log('deploying storage contract') + const storeCt = await DeployerUtil.deployStorageContract(hre, valCtAddr); + log(`deployed`); + + log(`registering storage contract ${storeCt.address} into validator at ${valCtAddr}`) + const valCt = await ethers.getContractAt("ValidatorV1", valCtAddr, owner); + await valCt.setStorageContract(storeCt.address); + log(`validatorContract successfully registered new address: `, await valCt.storageContract()); + }); diff --git a/smart-contracts/tasks/validatorTasks.ts b/smart-contracts/tasks/registerTasks.ts similarity index 66% rename from smart-contracts/tasks/validatorTasks.ts rename to smart-contracts/tasks/registerTasks.ts index 3130f0c..bab983c 100644 --- a/smart-contracts/tasks/validatorTasks.ts +++ b/smart-contracts/tasks/registerTasks.ts @@ -1,10 +1,11 @@ import {task} from "hardhat/config"; -import {TaskUtil} from "./utilz/TaskUtil"; +import {RegisterUtil} from "../src/RegisterUtil"; import {HardhatRuntimeEnvironment} from "hardhat/types"; +import {NodeType} from "../src/DeployerUtil"; let info = console.log; -task("v:registerValidator", "") +task("v:registerValidator", "adds a new validator node") .addParam("validatorProxyCt", "validatorCt proxy address") .addParam("pushCt", "push token contract") .addPositionalParam("nodeAddress", "") @@ -22,11 +23,11 @@ task("v:registerValidator", "") const nodeUrl = args.nodeUrl; const nodeAmount = args.nodeAmount; info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 0); + await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 0); info(`success`); }); -task("v:registerDelivery", "redeploys a new validatorCt") +task("v:registerDelivery", "adds a new delivery node") .addParam("validatorProxyCt", "validatorCt proxy address") .addParam("pushCt", "push token contract") .addPositionalParam("nodeAddress", "") @@ -43,10 +44,31 @@ task("v:registerDelivery", "redeploys a new validatorCt") const nodeUrl = ''; const nodeAmount = args.nodeAmount; info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await TaskUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 2); + await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 2); info(`success`); }); +task("v:registerStorage", "adds a new storage node") + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); + + const nodeAddress = args.nodeAddress; + const nodeUrl = ''; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, NodeType.SNode); + info(`success`); + }); + task("push:balanceOf", "prints account balance @ PUSH token") .addParam("pushCt", "push token contract") diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index 45242ed..90fa4e5 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -4,17 +4,19 @@ import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; import {expect} from "chai"; import {assert} from "chai"; -import {ethers} from "hardhat"; +import hre, {ethers} from "hardhat"; import {Contract, ContractTransaction} from "ethers"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {BitUtil} from "./uitlz/bitUtil"; import {TestHelper as t} from "./uitlz/TestHelper"; import {CollectionUtil} from "./uitlz/collectionUtil"; import {NodeStatus} from "./ValidatorHelper"; +import {DeployerUtil} from "../src/DeployerUtil"; +import {StorageV1} from "../typechain-types"; let debug = console.log; -let ct: StorageContract & Contract; -let ctAsOwner: StorageContract & Contract; +let ct: StorageV1; +let ctAsOwner: StorageV1; let nodes = [null]; for (let i = 1; i <= 254; i++) { @@ -50,7 +52,7 @@ interface StorageContract { } -type TypedStorageContract = StorageContract & Contract; +type TypedStorageContract = StorageV1 & Contract; class DeployInfo { storageCt: TypedStorageContract; @@ -65,18 +67,12 @@ async function state1(): Promise { let protocolVersion = 1; let validatorContract = '0x' + '0'.repeat(40); let rfTarget = 5; - const factory = await ethers.getContractFactory("StorageV1"); - const proxyCt: TypedStorageContract = await upgrades.deployProxy(factory, - [protocolVersion, validatorContract, rfTarget], - {kind: "uups"}); - await proxyCt.deployed(); - debug(`deployed proxy: ${proxyCt.address}`); - let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); - debug(`deployed impl: ${implCt}`); + let storageCt = await DeployerUtil.deployStorageContract(hre, validatorContract); + // const storageCtFactory = await ethers.getContractFactory("StorageV1"); // const storageCt = await storageCtFactory.deploy(); - return {storageCt: proxyCt, owner}; + return {storageCt, owner}; } @@ -174,8 +170,8 @@ async function assertNodeListLength(e: number) { async function beforeEachInit() { const state = await loadFixture(state1); - ct = state.storageCt; - ctAsOwner = ct.connect(state.owner); + ct = state.storageCt; + ctAsOwner = ct.connect(state.owner); expect(ct.address).to.be.properAddress; } diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index a9d3476..ee7c123 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -5,16 +5,18 @@ import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; import {expect, assert} from "chai"; import {ethers} from "hardhat"; -import {PushToken, StorageV2, ValidatorV1} from "../typechain-types"; +import hre from "hardhat"; +import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as t} from "./uitlz/TestHelper"; import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; import {BigNumber, Contract} from "ethers"; import {BitUtil} from "./uitlz/bitUtil"; +import {DeployerUtil, NodeType} from "../src/DeployerUtil"; let log = console.log; - +/* async function deployPushTokenFake(): Promise { log('deploying PushToken'); const ptFactory = await ethers.getContractFactory("PushToken"); @@ -53,13 +55,8 @@ async function deployStorageContract(valCt: ValidatorV1): Promise { log(`deployed impl: ${implCt}`); log('done'); return proxyCt; -} +}*/ -export enum NodeType { - VNode = 0, // validator 0 - SNode = 1, // storage 1 - DNode = 2 // delivery 2 -} // VARIABLES FOR TESTS let valCt: ValidatorV1; @@ -88,11 +85,11 @@ async function initBlockchain(): Promise { const signers = await ethers.getSigners(); const [owner_] = signers; - const pushCt = await deployPushTokenFake(); + const pushCt = await DeployerUtil.deployPushTokenFake(hre); - const valCt = await deployValidatorContract(pushCt); + const valCt = await DeployerUtil.deployValidatorContract(hre, pushCt.address); - const storeCt = await deployStorageContract(valCt); + const storeCt = await DeployerUtil.deployStorageContract(hre, valCt.address); await valCt.setStorageContract(storeCt.address); for (let s of [owner_, signers[1], signers[2]]) { @@ -152,7 +149,6 @@ describe("Valdator - ownership tests / vot", function () { const acceptTx = valCt.connect(acc2).acceptOwnership(); await expect(acceptTx).to.be.reverted; - }); }); From cc22c1dc44ab67a92c4a7c12b3a6360f0730e1f3 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 11 Sep 2023 22:11:41 +0400 Subject: [PATCH 51/84] add: storageNode starts and reads StorageContractState (1) --- snode/migrations/mysql/V1__init.sql | 35 ++++++++ .../services/messaging-common/messageBlock.ts | 66 +++++++++------ .../messaging-common/storageContractState.ts | 84 +++++++++++++++++++ .../validatorContractState.ts | 20 ++--- snode/src/services/messaging/BlockStorage.ts | 31 +++++-- snode/src/services/messaging/queueManager.ts | 46 +--------- snode/src/services/messaging/storageNode.ts | 75 +++++++++++------ snode/src/utilz/bitUtil.ts | 21 +++++ snode/src/utilz/collectionUtil.ts | 13 +++ snode/src/utilz/dateUtil.ts | 5 +- snode/src/utilz/ethersUtil.ts | 13 +++ snode/src/utilz/numUtil.ts | 6 +- 12 files changed, 302 insertions(+), 113 deletions(-) create mode 100644 snode/migrations/mysql/V1__init.sql create mode 100644 snode/src/services/messaging-common/storageContractState.ts create mode 100644 snode/src/utilz/ethersUtil.ts diff --git a/snode/migrations/mysql/V1__init.sql b/snode/migrations/mysql/V1__init.sql new file mode 100644 index 0000000..913b809 --- /dev/null +++ b/snode/migrations/mysql/V1__init.sql @@ -0,0 +1,35 @@ +DROP TABLE IF EXISTS blocks; +CREATE TABLE IF NOT EXISTS blocks +( + object_hash VARCHAR(255) NOT NULL COMMENT 'optional: a uniq field to fight duplicates', + object MEDIUMTEXT NOT NULL, + PRIMARY KEY (object_hash) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +DROP TABLE IF EXISTS dset_queue_mblock; +CREATE TABLE IF NOT EXISTS dset_queue_mblock +( + id BIGINT NOT NULL AUTO_INCREMENT, + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'timestamp is used for querying the queu', + object_hash VARCHAR(255) NOT NULL, + object_shard INT NOT NULL COMMENT 'message block shard', + PRIMARY KEY (id), + UNIQUE KEY uniq_mblock_object_hash (object_hash, object_shard), + FOREIGN KEY (object_hash) REFERENCES blocks(object_hash) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +DROP TABLE IF EXISTS dset_client; +CREATE TABLE IF NOT EXISTS dset_client +( + id INT NOT NULL AUTO_INCREMENT, + queue_name varchar(32) NOT NULL COMMENT 'target node queue name', + target_node_id varchar(128) NOT NULL COMMENT 'target node eth address', + target_node_url varchar(128) NOT NULL COMMENT 'target node url, filled from the contract', + target_offset bigint(20) NOT NULL DEFAULT 0 COMMENT 'initial offset to fetch target queue', + state tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 = enabled, 0 = disabled', + PRIMARY KEY (id), + UNIQUE KEY uniq_dset_name_and_target (queue_name, target_node_id) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts index e9c092f..e98bd17 100644 --- a/snode/src/services/messaging-common/messageBlock.ts +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -9,14 +9,15 @@ { s1, 0xD}, { s2, 0xE}, { s3, 0xF}, { d1, 0x1}, { d2, 0x2}, { d3, 0x3} ] */ -import { CollectionUtil } from '../../utilz/collectionUtil' +import {CollectionUtil} from '../../utilz/collectionUtil' import StrUtil from '../../utilz/strUtil' -import { EthSig } from '../../utilz/ethSig' -import { Logger } from 'winston' -import { WinstonUtil } from '../../utilz/winstonUtil' -import { ObjectHasher } from '../../utilz/objectHasher' -import { EthUtil } from '../../utilz/EthUtil' -import { Check } from '../../utilz/check' +import {EthSig} from '../../utilz/ethSig' +import {Logger} from 'winston' +import {WinstonUtil} from '../../utilz/winstonUtil' +import {ObjectHasher} from '../../utilz/objectHasher' +import {EthUtil} from '../../utilz/EthUtil' +import {Check} from '../../utilz/check' +import {NumUtil} from "../../utilz/numUtil"; /* ex: @@ -339,29 +340,46 @@ export class MessageBlockUtil { */ static calculateAffectedShards(block: Readonly): Set { const shards = new Set() - for (const response of block.responses) { - for (const recipient of response.header.recipientsResolved) { - const recipientAddr = recipient.addr - let shardId: number = null - // 1) try to get first byte from caip address - // eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681 -> D8 - // and use it as shard - const addrObj = EthUtil.parseCaipAddress(recipientAddr) - if (addrObj != null && !StrUtil.isEmpty(addrObj.addr)) { - Check.isTrue(recipientAddr.startsWith('0x')) - shardId = Number.parseInt(addrObj.addr.substring(2, 4).toLowerCase(), 16) - } - // 2) try to get sha256 otherwise + for (const fi of block.responses) { + for (const recipient of fi.header.recipientsResolved) { + let shardId = this.calculateAffectedShard(recipient.addr); if (shardId == null) { - shardId = Number.parseInt(ObjectHasher.hashToSha256(recipientAddr.substring(0, 2))) + this.log.error('cannot calculate shardId for recipient %o in %o', recipient, fi); + continue; } - Check.notNull(shardId) shards.add(shardId) } } return shards } + // 1) try to get first byte from caip address + // eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681 -> d8 -> 216 + // and use it as shard + // 2) take sha256(addr) -> + public static calculateAffectedShard(recipientAddr: string): number | null { + if (StrUtil.isEmpty(recipientAddr)) { + return null; + } + let shardId: number = null + const addrObj = EthUtil.parseCaipAddress(recipientAddr) + if (addrObj != null + && !StrUtil.isEmpty(addrObj.addr) + && addrObj.addr.startsWith('0x') + && addrObj.addr.length > 4) { + const firstByteAsHex = addrObj.addr.substring(2, 4).toLowerCase(); + shardId = Number.parseInt(firstByteAsHex, 16); + } + // 2) try to get sha256 otherwise + if (shardId == null) { + const firstByteAsHex = ObjectHasher.hashToSha256(recipientAddr).toLowerCase().substring(0, 2); + shardId = Number.parseInt(firstByteAsHex, 16); + } + Check.notNull(shardId); + Check.isTrue(shardId >= 0 && shardId <= 255 && NumUtil.isRoundedInteger(shardId)); + return shardId; + } + public static checkBlock(block: MessageBlock, validatorsFromContract: Set): CheckResult { if (block.requests.length != block.responses.length) { return CheckResult.failWithText( @@ -430,10 +448,10 @@ export class CheckResult { err: string static failWithText(err: string): CheckResult { - return { success: false, err: err } + return {success: false, err: err} } static ok(): CheckResult { - return { success: true, err: '' } + return {success: true, err: ''} } } diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts new file mode 100644 index 0000000..090ee73 --- /dev/null +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -0,0 +1,84 @@ +import {Service} from "typedi"; +import {Logger} from "winston"; +import {WinstonUtil} from "../../utilz/winstonUtil"; +import {EnvLoader} from "../../utilz/envLoader"; +import {Contract, ethers, Wallet} from "ethers"; +import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; +import path from "path"; +import fs, {readFileSync} from "fs"; +import {ValidatorCtClient} from "./validatorContractState"; +import {BitUtil} from "../../utilz/bitUtil"; +import {EthersUtil} from "../../utilz/ethersUtil"; + +@Service() +export class StorageContractState { + public log: Logger = WinstonUtil.newLog(StorageContractState); + private provider: JsonRpcProvider + private abi: string + private rpcEndpoint: string + private rpcNetwork: number + private configDir: string + private pkFile: string; + private pkPass: string; + // NODE STATE + private nodeWallet: Wallet; + private nodeAddress: string; + // CONTRACT STATE + private storageCtAddr: string + private storageCt: StorageContract; + + public async postConstruct() { + this.log.info('postConstruct()') + this.storageCtAddr = EnvLoader.getPropertyOrFail('STORAGE_CONTRACT_ADDRESS') + this.rpcEndpoint = EnvLoader.getPropertyOrFail('VALIDATOR_RPC_ENDPOINT') + this.rpcNetwork = Number.parseInt(EnvLoader.getPropertyOrFail('VALIDATOR_RPC_NETWORK')) + this.provider = new ethers.providers.JsonRpcProvider( + this.rpcEndpoint, + this.rpcNetwork + ) + this.configDir = EnvLoader.getPropertyOrFail('CONFIG_DIR') + this.abi = EthersUtil.loadAbi(this.configDir, 'StorageV1.json') + this.storageCt = await this.buildRWClient(); + await this.readContractState(); // todo + await this.subscribeToContractChanges(); // todo + } + + public async buildRWClient(): Promise { + this.pkFile = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE') + this.pkPass = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS') + + const jsonFile = readFileSync(this.configDir + '/' + this.pkFile, 'utf-8') + this.nodeWallet = await Wallet.fromEncryptedJson(jsonFile, this.pkPass) + this.nodeAddress = await this.nodeWallet.getAddress() + + const signer = this.nodeWallet.connect(this.provider) + const contract = new ethers.Contract(this.storageCtAddr, this.abi, signer) + return contract; + } + + public async readContractState() { + this.log.info(`connected to StorageContract: ${this.storageCt.address} as node ${this.nodeWallet.address}`) + let rf = await this.storageCt.rf(); + let nodeCount = await this.storageCt.nodeCount(); + this.log.info(`rf: ${rf} , total nodeCount: ${nodeCount}`); + let nodeShards = await this.storageCt.getNodeShardsByAddr(this.nodeWallet.address); + const shards = BitUtil.bitsToPositions(nodeShards); + this.log.info(`this node ${this.nodeWallet.address} is assigned to shards (${nodeShards.toString(2)}) : ${JSON.stringify(shards)}`); + + } + + public async subscribeToContractChanges() { + + } +} + +type StorageContract = StorageContractAPI & Contract; + +export interface StorageContractAPI { + + rf(): Promise; + + getNodeShardsByAddr(addr: string): Promise; + + nodeCount(): Promise; +} \ No newline at end of file diff --git a/snode/src/services/messaging-common/validatorContractState.ts b/snode/src/services/messaging-common/validatorContractState.ts index abd9409..cd8c0e1 100644 --- a/snode/src/services/messaging-common/validatorContractState.ts +++ b/snode/src/services/messaging-common/validatorContractState.ts @@ -24,7 +24,7 @@ export class ValidatorContractState { public contractCli: ValidatorCtClient public async postConstruct() { - this.log.info('ValidatorContractState.postConstruct()') + this.log.info('postConstruct()') this.contractFactory = new ContractClientFactory() this.contractCli = await this.contractFactory.buildRWClient(this.log) await this.contractCli.connect() @@ -111,12 +111,12 @@ class ContractClientFactory { } private static loadValidatorContractAbi(configDir: string, fileNameInConfigDir: string): string { - const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`) - const file = fs.readFileSync(fileAbsolute, 'utf8') - const json = JSON.parse(file) - const abi = json.abi - console.log(`abi size:`, abi.length) - return abi + const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); + const file = fs.readFileSync(fileAbsolute, 'utf8'); + const json = JSON.parse(file); + const abi = json.abi; + console.log(`abi size:`, abi.length); + return abi; } // creates a client which can only read blockchain state @@ -147,9 +147,9 @@ export class ValidatorCtClient { // contract state nodeMap: Map = new Map() - public attestersRequired: number - public nodeRandomMinCount: number - public nodeRandomPingCount: number + public attestersRequired: number; + public nodeRandomMinCount: number; + public nodeRandomPingCount: number; constructor(contract: ethers.Contract, log: Logger) { this.contract = contract diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index 0dd388c..a8e32f0 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -10,19 +10,22 @@ import {ObjectHasher} from "../../utilz/objectHasher"; export class BlockStorage { public log: Logger = WinstonUtil.newLog(BlockStorage); - // todo - async accept(item: QItem): Promise { - let calculatedHash = item.object_hash; - let rowId = await MySqlUtil.queryOneValueOrDefault('SELECT id FROM blocks where object_hash=?', - -1, calculatedHash); - if (rowId > 0) { + + async saveBlockWithShardData(mb: MessageBlock, calculatedHash: string, shardSet: Set): Promise { + // NOTE: the code already atomically updates the db , + // so let's drop select because it's excessive) + let hashFromDb = await MySqlUtil.queryOneValueOrDefault( + 'SELECT object_hash FROM blocks where object_hash=?', + null, calculatedHash); + if (hashFromDb != null) { this.log.info('received block with hash %s, ' + 'already exists in the storage at index %d, ignoring', - calculatedHash, rowId); + calculatedHash, hashFromDb); return false; } + // insert block this.log.info('received block with hash %s, adding to the db', calculatedHash); - const objectAsJson = JSON.stringify(item.object); + const objectAsJson = JSON.stringify(mb); const res = await MySqlUtil.insert( `INSERT IGNORE INTO blocks(object, object_hash) VALUES (?, ?)`, @@ -31,6 +34,18 @@ export class BlockStorage { if (!requiresProcessing) { return false; } + // insert block to shard mapping + let valuesStr = ''; + let valuesArr = []; + for (const shardId of shardSet) { + valuesArr.push(calculatedHash, shardId); + valuesStr += valuesStr.length == 0 ? '(? , ?)' : ',(? , ?)' + } + const res2 = await MySqlUtil.insert( + `INSERT + IGNORE INTO dset_queue_mblock(object_hash, object_shard) VALUES + ${valuesStr}`, + ...valuesArr); return true; } diff --git a/snode/src/services/messaging/queueManager.ts b/snode/src/services/messaging/queueManager.ts index d131d72..4150e58 100644 --- a/snode/src/services/messaging/queueManager.ts +++ b/snode/src/services/messaging/queueManager.ts @@ -1,5 +1,4 @@ import {Inject, Service} from 'typedi' -import {MySqlUtil} from '../../utilz/mySqlUtil' import {Logger} from 'winston' import schedule from 'node-schedule' import {ValidatorContractState} from '../messaging-common/validatorContractState' @@ -7,6 +6,7 @@ import {WinstonUtil} from '../../utilz/winstonUtil' import {QueueServer} from '../messaging-dset/queueServer' import {QueueClient} from '../messaging-dset/queueClient' import StorageNode from "./storageNode"; +import {QueueClientHelper} from "../messaging-common/queueClientHelper"; @Service() @@ -14,7 +14,7 @@ export class QueueManager { public log: Logger = WinstonUtil.newLog(QueueManager) @Inject((type) => ValidatorContractState) - private contractState: ValidatorContractState; + private contract: ValidatorContractState; @Inject(type => StorageNode) private storageNode:StorageNode; @@ -35,7 +35,7 @@ export class QueueManager { public async postConstruct() { this.log.debug('postConstruct') this.mblockClient = new QueueClient(this.storageNode, QueueManager.QUEUE_MBLOCK) - await this.initClientForEveryQueueForEveryValidator([QueueManager.QUEUE_MBLOCK]) + await QueueClientHelper.initClientForEveryQueueForEveryValidator(this.contract, [QueueManager.QUEUE_MBLOCK]) const qs = this schedule.scheduleJob(this.CLIENT_READ_SCHEDULE, async function () { const dbgPrefix = 'PollRemoteQueue' @@ -50,46 +50,6 @@ export class QueueManager { }) } - // updates the dset_client table used for queries according to the contract data - private async initClientForEveryQueueForEveryValidator(queueNames:string[]) { - const nodeId = this.contractState.nodeId - const allValidators = this.contractState.getAllValidatorsExceptSelf() - for (const queueName of queueNames) { - for (const nodeInfo of allValidators) { - const targetNodeId = nodeInfo.nodeId - const targetNodeUrl = nodeInfo.url - const targetState = ValidatorContractState.isEnabled(nodeInfo) ? 1 : 0 - await MySqlUtil.insert( - `INSERT INTO dset_client (queue_name, target_node_id, target_node_url, target_offset, state) - VALUES (?, ?, ?, 0, ?) - ON DUPLICATE KEY UPDATE target_node_url=?, - state=?`, - queueName, - targetNodeId, - targetNodeUrl, - targetState, - targetNodeUrl, - targetState - ) - const targetOffset = await MySqlUtil.queryOneValue( - `SELECT target_offset - FROM dset_client - where queue_name = ? - and target_node_id = ?`, - queueName, - targetNodeId - ) - this.log.info( - 'client polls (%s) queue: %s node: %s from offset: %d ', - targetState, - queueName, - targetNodeId, - targetOffset - ) - } - } - } - public getQueue(queueName: string): QueueServer { if (queueName == 'subscribers') { return this.mblockQueue diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 715c71e..d5e2539 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -1,5 +1,4 @@ -import {Service, Container, Inject} from 'typedi' -import config from '../../config' +import {Inject, Service} from 'typedi' import StrUtil from "../../utilz/strUtil"; import {ValidatorContractState} from "../messaging-common/validatorContractState"; import {Logger} from "winston"; @@ -13,6 +12,7 @@ import {Check} from "../../utilz/check"; import {WinstonUtil} from "../../utilz/winstonUtil"; import DateUtil from "../../utilz/dateUtil"; import DbHelper from "../../helpers/dbHelper"; +import {StorageContractState} from "../messaging-common/storageContractState"; @Service() @@ -20,7 +20,10 @@ export default class StorageNode implements Consumer { public log: Logger = WinstonUtil.newLog(StorageNode) @Inject() - private contract: ValidatorContractState; + private valContractState: ValidatorContractState; + + @Inject() + private storageContractState: StorageContractState; @Inject(type => QueueManager) private queueManager: QueueManager; @@ -32,7 +35,8 @@ export default class StorageNode implements Consumer { public async postConstruct() { // MySqlUtil.init(dbHelper.pool); todo postgres !!!!!!!!!!!!!! - await this.contract.postConstruct(); + await this.valContractState.postConstruct(); + await this.storageContractState.postConstruct(); await this.queueManager.postConstruct(); } @@ -52,40 +56,62 @@ export default class StorageNode implements Consumer { // check contents // since this check is not for historical data, but for realtime data, // so we do not care about old blocked validators which might occur in the historical queue - let activeValidators = CollectionUtil.arrayToFields(this.contract.getActiveValidators(), 'nodeId'); + let activeValidators = CollectionUtil.arrayToFields(this.valContractState.getActiveValidators(), 'nodeId'); let check1 = MessageBlockUtil.checkBlock(mb, activeValidators); if (!check1.success) { this.log.error('item validation failed: ', check1.err); return false; } // check database - let isNew = await this.blockStorage.accept(item); - if(!isNew) { + let shardSet = MessageBlockUtil.calculateAffectedShards(mb); + let isNew = await this.blockStorage.saveBlockWithShardData(mb, calculatedHash, shardSet); + if (!isNew) { // this is not an error, because we read duplicates from every validator this.log.debug('block %s already exists ', mb.id); return false; } // send block - await this.unpackBlock(mb); + await this.unpackBlockToInboxes(mb, shardSet); + } + + // todo see DbHelper checkThatShardIsOnThisNode + public getNodeShards(): Set { + let set = new Set(); + for (let i = 0; i < 128; i++) { + set.add(i); + } + return set; } // sends the block contents (internal messages from every response) // to every recipient's inbox - public async unpackBlock(mb: MessageBlock) { - // todo calculate shard - - - let now = Date.now() / 1000; - let nowStr = now + ''; - const currentNodeId = this.contract.nodeId; - for (const feedItem of mb.responses) { - let targetWallets = feedItem.header.recipients; - for (const targetWallet of targetWallets) { - await this.putToInbox('inbox', targetWallet, nowStr, currentNodeId, feedItem.payload); + public async unpackBlockToInboxes(mb: MessageBlock, shardSet: Set) { + // this is the list of shards that we support on this node + const nodeShards = this.getNodeShards(); + this.log.debug('storage node supports %s shards: %o', nodeShards.size, nodeShards); + let shardsToProcess = CollectionUtil.intersectSets(shardSet, nodeShards); + this.log.debug('block %s has %d inboxes to unpack', mb.id, shardsToProcess) + if (shardsToProcess.size == 0) { + this.log.debug('finished'); + return; + } + let nowStr = DateUtil.currentTimeSeconds() + ''; + const currentNodeId = this.valContractState.nodeId; + for (let i = 0; i < mb.responses.length; i++) { + const feedItem = mb.responses[i]; + const targetWallets: string[] = MessageBlockUtil.calculateRecipients(mb, i); + for (let i1 = 0; i1 < targetWallets.length; i1++) { + const targetAddr = targetWallets[i1]; + const targetShard = MessageBlockUtil.calculateAffectedShard(targetAddr); + if (!shardsToProcess.has(targetShard)) { + continue; + } + await this.putToInbox('inbox', targetAddr, nowStr, currentNodeId, feedItem.payload); } } } + /** * * @param nsName ex: inbox @@ -94,16 +120,16 @@ export default class StorageNode implements Consumer { * @param nodeId current node id, ex: 0xAAAAAAA * @param fpayload payload format */ - public async putToInbox(nsName:string, nsIndex:string, - ts:string, - nodeId:string, - fpayload:FPayload) { + public async putToInbox(nsName: string, nsIndex: string, + ts: string, + nodeId: string, + fpayload: FPayload) { const key = fpayload.data.sid; fpayload.recipients = null; // null recipients field because we don't need that this.log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} fpayload=${fpayload}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); this.log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); + const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId);// todo REMOVE !!!!!!!!!! if (!success) { let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; console.log(errMsg); @@ -131,7 +157,6 @@ export default class StorageNode implements Consumer { this.log.debug(createtable); } } - var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, ts, key, JSON.stringify(fpayload)); this.log.debug(`found value: ${storageValue}`) diff --git a/snode/src/utilz/bitUtil.ts b/snode/src/utilz/bitUtil.ts index 57f9c61..ce3488e 100644 --- a/snode/src/utilz/bitUtil.ts +++ b/snode/src/utilz/bitUtil.ts @@ -1,3 +1,5 @@ +import {CollectionUtil} from "./collectionUtil"; + export class BitUtil { /** * XORs 2 buffers, byte by byte: src = src XOR add @@ -36,4 +38,23 @@ export class BitUtil { public static base64ToStr(value: string): string { return Buffer.from(value, 'base64').toString('utf8') } + + public static getBit(number:number, bitOffset:number) { + return (number & (1 << bitOffset)) === 0 ? 0 : 1; + } + + public static bitsToPositions(number: number): number[] { + // return null; + const result: number[] = []; + let position = 0; + while (number !== 0) { + if ((number & 1) === 1) { + result.push(position); + } + number = number >>> 1; + position++; + } + CollectionUtil.sortNumbersAsc(result); + return result; + } } diff --git a/snode/src/utilz/collectionUtil.ts b/snode/src/utilz/collectionUtil.ts index 59b8b43..7101ee4 100644 --- a/snode/src/utilz/collectionUtil.ts +++ b/snode/src/utilz/collectionUtil.ts @@ -25,4 +25,17 @@ export class CollectionUtil { public static setToArray(set: Set): V[] { return Array.from(set.keys()) } + + public static intersectSets(set1: Set, set2: Set): Set { + return new Set([...set1].filter(x => set2.has(x))); + } + + public static sortNumbersAsc(array:number[]) { + if(array==null || array.length==0) { + return; + } + array.sort((a, b) => { + return a - b; + }) + } } diff --git a/snode/src/utilz/dateUtil.ts b/snode/src/utilz/dateUtil.ts index efe67bd..4840b49 100644 --- a/snode/src/utilz/dateUtil.ts +++ b/snode/src/utilz/dateUtil.ts @@ -38,11 +38,12 @@ export default class DateUtil { } public static currentTimeMillis(): number { - return new Date().getTime() + return Date.now() } public static currentTimeSeconds(): number { - return Math.round(new Date().getTime() / 1000) + // new Date().getTime() + return Math.round( Date.now()/ 1000) } public static millisToDate(timestamp: number): Date { diff --git a/snode/src/utilz/ethersUtil.ts b/snode/src/utilz/ethersUtil.ts new file mode 100644 index 0000000..9040a10 --- /dev/null +++ b/snode/src/utilz/ethersUtil.ts @@ -0,0 +1,13 @@ +import path from "path"; +import fs from "fs"; + +export class EthersUtil { + public static loadAbi(configDir: string, fileNameInConfigDir: string): string { + const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); + const file = fs.readFileSync(fileAbsolute, 'utf8'); + const json = JSON.parse(file); + const abi = json.abi; + console.log(`abi size:`, abi.length); + return abi; + } +} \ No newline at end of file diff --git a/snode/src/utilz/numUtil.ts b/snode/src/utilz/numUtil.ts index 40eb7c9..1331ad6 100644 --- a/snode/src/utilz/numUtil.ts +++ b/snode/src/utilz/numUtil.ts @@ -7,7 +7,11 @@ export class NumUtil { if (isNaN(valN)) { return defaultValue } - return Number.isInteger(valN) ? valN : Math.round(valN) + return this.isRoundedInteger(valN) ? valN : Math.round(valN) + } + + static isRoundedInteger(valN: number) { + return Number.isInteger(valN); } public static toString(value: number) { From 3a14edf3a003c5c9f01ef770105b5876a865dec0 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 13 Sep 2023 18:03:21 +0400 Subject: [PATCH 52/84] add: separate BlockStorage, IndexStorage; correct contract state updates --- snode/migrations/mysql/V1__init.sql | 10 + snode/package-lock.json | 35916 ++++++++-------- .../services/messaging-common/messageBlock.ts | 12 +- .../messaging-common/storageContractState.ts | 45 +- snode/src/services/messaging/BlockStorage.ts | 127 +- snode/src/services/messaging/IndexStorage.ts | 123 + snode/src/services/messaging/storageNode.ts | 127 +- snode/src/utilz/collectionUtil.ts | 28 +- 8 files changed, 17264 insertions(+), 19124 deletions(-) create mode 100644 snode/src/services/messaging/IndexStorage.ts diff --git a/snode/migrations/mysql/V1__init.sql b/snode/migrations/mysql/V1__init.sql index 913b809..6f4d11a 100644 --- a/snode/migrations/mysql/V1__init.sql +++ b/snode/migrations/mysql/V1__init.sql @@ -3,6 +3,7 @@ CREATE TABLE IF NOT EXISTS blocks ( object_hash VARCHAR(255) NOT NULL COMMENT 'optional: a uniq field to fight duplicates', object MEDIUMTEXT NOT NULL, + object_shards JSON NOT NULL COMMENT 'message block shards', PRIMARY KEY (object_hash) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; @@ -33,3 +34,12 @@ CREATE TABLE IF NOT EXISTS dset_client UNIQUE KEY uniq_dset_name_and_target (queue_name, target_node_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; + +DROP TABLE IF EXISTS contract_shards; +CREATE TABLE IF NOT EXISTS contract_shards +( + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'update timestamp', + shards_assigned json NOT NULL COMMENT 'optional: a uniq field to fight duplicates', + PRIMARY KEY (ts) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8; \ No newline at end of file diff --git a/snode/package-lock.json b/snode/package-lock.json index f13a9fd..41c62be 100644 --- a/snode/package-lock.json +++ b/snode/package-lock.json @@ -104,2036 +104,1012 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@aws-crypto/ie11-detection": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", - "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "optional": true, "dependencies": { - "tslib": "^1.11.1" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", - "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, "dependencies": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/sha256-js": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@aws-crypto/sha256-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", - "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", - "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "optional": true, "dependencies": { - "tslib": "^1.11.1" + "color-name": "1.1.3" } }, - "node_modules/@aws-crypto/util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", - "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/types": "^3.110.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/@aws-sdk/abort-controller": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.200.0.tgz", - "integrity": "sha512-YflVl9JEFjy0cco+40FAocQfFGZ7fR2tnYhQPqXtfCJ9ywikB2PnzN3G6TtvNCFaSG1tLwnI0LZphVbk89sDtw==", + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/@aws-sdk/abort-controller/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.200.0.tgz", - "integrity": "sha512-9WdOjdayhzL+k5PQibj3l4/luAGs+NJKC5OjIDKEKL54SC9QwsgwTv6Mb+oqm0sQa9FCNieXyZhSHb2aeR60sQ==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.200.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.200.0.tgz", - "integrity": "sha512-EyOSl3hlkrTE9i0bgIvtdvMpCMplmZcLlkMy2mx2LdPKO+AWFOjUN7i5RgpFa7YdZq/csHkcakooJi48OOgSVA==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.200.0.tgz", - "integrity": "sha512-9k3NlHDyaEdv5aUnt6V1wBugIl5fIL7AsKbvIH8+vCDaAknc9+9vLbxkBsskiOAh5rEWFeso60hjNJC+2ky5xQ==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-sdk-sts": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/config-resolver": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.200.0.tgz", - "integrity": "sha512-eq03XA4sPNJ6C3WbMLR5NPYQmS/S+TdFlNY044rG1ne0Mh+yrNPjIPggu42F4Xr5KtURB97et7bxSx1w7gvDeQ==", + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-config-provider": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/@aws-sdk/config-resolver/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, - "optional": true + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.200.0.tgz", - "integrity": "sha512-DrZbo4eGkKvzDEbFSA44iwQjzQSsMZKfU7fnBdA/Qs28TmNZ6oBgO9ljUuEHxhaWgDYxAE70KtJwEqD05IZVuw==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "node_modules/@babel/core": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.200.0.tgz", - "integrity": "sha512-I2hlRxEqcwsmr0C44RD083QYJ3nDIZE3K8WBQjNetFi5qTzXlI1usrOlCMfaIbee6k3BBB+cXIX1Vp8RUNkNQQ==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.200.0.tgz", - "integrity": "sha512-qvUeUuK2DSQ0eVKijzh1ccOj1xNojVCTf+ENDa2EhXPVQmpERbhQiamTeSkLcKYOtDKxyEK7YBlkczIt/BL2UQ==", + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "tslib": "^2.3.1" + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.200.0.tgz", - "integrity": "sha512-6b8CbfxAw7UiWJ2GWSP/RhA2qxgo9iLZOunMqCqOlI627JEZb+oFKTzXwcORrrjpTKbfb/Q6/3ev5yGPonewHw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.200.0.tgz", - "integrity": "sha512-HpBiMJt+xvHBTf2BjJJwnH+gXf6JapX4cGk3nZlJxE8Uu6P0bIVeFnwD20+yQ5N6Pm0vsJuoA8MNz9vOiPjImg==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-ini": "3.200.0", - "@aws-sdk/credential-provider-process": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "engines": { - "node": ">=12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.200.0.tgz", - "integrity": "sha512-Juio3viiz/ywrb88viwNxfauaxG+MrD2gMbnCfGEtZgdvix6XBYc6bRd+F94yY23EYWiU1s1tfdlScCIVeYfqA==", + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.200.0.tgz", - "integrity": "sha512-62ktkTAcr51GYshZiQdJcukps1O9QZGwJrVrmY+VdpKwdfSoJygpXmpFGWWlMs+hDkXLcNl3oLOPa3T+fxqN9Q==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.200.0.tgz", - "integrity": "sha512-++C1vRu/9SJo3MJuC6ARMYfwNKkR2ioq0KDL2b4NQAIyQLgyw0hoOzPlfUgpfvyx0CnPecAoQIY8jGNWfdDSBA==", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/types": "^7.22.15" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.200.0.tgz", - "integrity": "sha512-YpxALYacNhmcYznlcmNUbXJ3w7Tt49iXgsmx+tQRzMx3m/99E4XWCGCz/4GRAncu7GV2oJYLL5Iyj5HQqR+jVA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.200.0", - "@aws-sdk/client-sso": "3.200.0", - "@aws-sdk/client-sts": "3.200.0", - "@aws-sdk/credential-provider-cognito-identity": "3.200.0", - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-ini": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/credential-provider-process": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.200.0.tgz", - "integrity": "sha512-sqYUn3sjEWy6Yx/mJXjGQcMxfJ1YsxqPGrE0qmMCa6EP6ENl1BWrX0eutQmwdCq85UiziYqxRpkflJ7nN2Abag==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/querystring-builder": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/hash-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.200.0.tgz", - "integrity": "sha512-iQ0K85BteaiSq7V5LTsMbOSa9RckraOQ3eLtUaJ7u98ywByb7v6H96jfaFdAOAYE0SZ7n2Qp87d+zkHs3kxS5w==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@aws-sdk/hash-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.200.0.tgz", - "integrity": "sha512-M3g8U1Nahj9ef2Tqn26j03FIwHwQuIVps39i5P+dWEyFAfFJsdwMtrDI/neXmf7BPcbPFUH9MMcrOJpq/MxYBQ==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz", - "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "optional": true, "dependencies": { - "tslib": "^2.3.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, - "optional": true + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.200.0.tgz", - "integrity": "sha512-GOvtCgP0Q+dYvzWfn06DawaZbDkn+yz8p6R0UaoYMOWvpINFuR6kYu/tz9qjGhZsrjuDqVH+6mj6uuC87fupQQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, - "optional": true + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.200.0.tgz", - "integrity": "sha512-r0OkdhjYqdv/iYM3KXj6LubQFZbM848FhAVuEiJEUNBFpUvhS6pCkmjhkd5QIUT+bhiD0gUj1OFzIHhQaHwyWA==", + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-config-provider": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.200.0.tgz", - "integrity": "sha512-oFRSUBXGBw6+QiOXgzu3cTPqAN97y+Lc3z2mDS3wJRqA4/Wmdzx/oTWhB5G0IsYSJHTevhZhfQPBLbhK5Ffehw==", + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.200.0.tgz", - "integrity": "sha512-uTtu1bCDqKQNLoZ0MkEsn102T4itNC5o7U+FDNSRHKYHPY6o1MbS9nbcOKywMDBqhEit5nNKCw9vOoz49N6zpw==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.200.0.tgz", - "integrity": "sha512-3Y5UaBBuBs3EE1NgYexhnOdFfozyxHvz4f/452b1K55IigJvovTl3TI46tFEkXiqhRs9bJZ/DiuakbsGfiKMFQ==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-retry": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.200.0.tgz", - "integrity": "sha512-9YVofOwxocbNDfTcNQfWJsOA9MVdZIu0T6or0fr54cn1q0WJ69IoFeHVUmCiOXy9HRTop3GC6Fyc5pQmjaRRcQ==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/service-error-classification": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 12.0.0" + "color-name": "1.1.3" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=4" } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.200.0.tgz", - "integrity": "sha512-1kZVgK+hk5F4oFMbzjzvv5qZ4DXJfpXOrHRu7dpmOeV8KL+NKYqYq7BeToDMjTTTq8atTHlDyQ4YrlgaOHyVCQ==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=4" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-serde": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.200.0.tgz", - "integrity": "sha512-NDYLVC7UxIDvu906itssEJE5yobPdVhMuE3Ef3MEMk3UTawd8f7lmo40kzFDBS3cW/c4jluGiTsN8r+8fPc3oA==", + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.0.0" } }, - "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.200.0.tgz", - "integrity": "sha512-Guztdq7i/ZNWR68InHUJpSYpg668rNt+2N5z14SlWrZ8cup6ZHy3bRgzqClAPiXuHPKx9r9ysvczT6jCCyy+Xg==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">= 12.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.200.0.tgz", - "integrity": "sha512-j2uSX4Bv347/14zXz7v/PKcTvE/AXQbXu+BQ1IQgqji7e3AT9QYJMsUD4TMK0SLYvCfBEtpfDXkA6WitT/ZPSA==", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "optional": true, "dependencies": { - "tslib": "^2.3.1" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.200.0.tgz", - "integrity": "sha512-RZ3cfaIIC3+xjm+raEb1xfOB/kJsH99mHHcVkOeGuKGzzYAG8wG1N6EYOZgqO2SaNsr87sx9fxCAd8A4X0wgRA==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "node_modules/@babel/traverse": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/node-config-provider": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.200.0.tgz", - "integrity": "sha512-TUZB/7JZfFQ6Ra4AhFCt64JvScosSkNZmhBE3a5Wdbh1uQlhVoczMumWPs1Gsl9awmYGipsDhZybTeI9r0b66w==", + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/node-http-handler": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.200.0.tgz", - "integrity": "sha512-foqNf0qsHTdClogmtlzJgPk8/s/kEOjAnkMVwJwBPEjVTxTN8i5oC4rXUsPIZ7LOYBTz2QQGkl3vY6BBFMmVGw==", + "node_modules/@babel/types": { + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/abort-controller": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/querystring-builder": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/property-provider": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.200.0.tgz", - "integrity": "sha512-KABh7LSkcWXCkilBa/WY2PvyR5vRMn1nwa2HYu9s1UToHbPCxIG0/ybtQfWNwVR4x5AtNODQYZBqxpBYUwau8w==", + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">=0.1.95" } }, - "node_modules/@aws-sdk/property-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.200.0.tgz", - "integrity": "sha512-P61hkZtXXaTTk/ap+WCOxX/IIRCH1lTap6Yy8RigcDmblh/BE+vDRqqRiTebIq/pWgOzQ67OjFJLxDkkS/OMKQ==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "engines": { - "node": ">= 12.0.0" + "node": ">=0.1.90" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/querystring-builder": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.200.0.tgz", - "integrity": "sha512-r4q7oUkcYsnxeVaIUEPGEPPobyn1CpAn7NmeuK8c3Lq4MrcfTx11aQMEtklmW+hvzavNPFxgYyUNiDuIyiVd6A==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-uri-escape": "3.188.0", - "tslib": "^2.3.1" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">= 12.0.0" + "node": ">=12" } }, - "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/querystring-parser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.200.0.tgz", - "integrity": "sha512-9C6c+fas2hMqvuCK8m7vwMqLb5W/x1Wib9yYJnBx40bOSdnOADRoRQitxCE07Iuq8aeHjPZYn1IhLhE9i9EmOg==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.200.0.tgz", - "integrity": "sha512-MFaMIJ/3v3C0XDerJDEfNYEquQXysnKtvuJJJWqPOPXMxCls4u8utyeXv0E6wO8ast6UW5xJKtzqEFRQ3t/+7w==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 12.0.0" + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.200.0.tgz", - "integrity": "sha512-K7PxcJSsZ3ExdVsa6HP0l9f2kzsEeIfBn1bTBYsaacKmLeb1eUom+egSf5zr6cNmuyhPvKv0W7SbqYNC9MWTXg==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.200.0.tgz", - "integrity": "sha512-2xMRWwfHTIthwV97/ubWFnXwzh4lMEXcAzPTpuqGljAaG5mtExUTkAQqoNuJqt4wLconkN6QBbhN5fREtkUlRQ==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/common/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dependencies": { - "@aws-sdk/is-array-buffer": "3.188.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-hex-encoding": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "@aws-sdk/util-uri-escape": "3.188.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@types/node": "*" } }, - "node_modules/@aws-sdk/signature-v4/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true + "node_modules/@ethereumjs/common/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/@aws-sdk/smithy-client": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.200.0.tgz", - "integrity": "sha512-3tZHcvTHADz9H7su9w/fOJavOOAsC5olYfVVgeqteaHaSojFOaNm8fD4KvluSAIDpHyHZPVPLZIHwcEwuc7j9A==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">= 12.0.0" + "node": ">=10.0.0" } }, - "node_modules/@aws-sdk/smithy-client/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/types": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.200.0.tgz", - "integrity": "sha512-4BfspYfvSwscstd5kUPAABu2rs6OfPZLKKq17frsNt6k3ax2WeHBsp3KIaOmqr0WDQnEBPjJginTB4uVsiSkdA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@aws-sdk/url-parser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.200.0.tgz", - "integrity": "sha512-scoAdYsBRBcg4gNKcwVUZrQ4C/ewYWo2JLRjWcaptcGfcdCWcl6905iTzcE/n1OhmaqWJsmUL6YL5ERr/4x8lA==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", "dependencies": { - "@aws-sdk/querystring-parser": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@aws-sdk/url-parser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-base64-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", - "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/tx/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dependencies": { - "tslib": "^2.3.1" + "@types/node": "*" } }, - "node_modules/@aws-sdk/util-base64-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true + "node_modules/@ethereumjs/tx/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/@aws-sdk/util-base64-node": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz", - "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==", - "dev": true, - "optional": true, + "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">= 12.0.0" + "node": ">=10.0.0" } }, - "node_modules/@aws-sdk/util-base64-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz", - "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, - "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz", - "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/is-array-buffer": "3.188.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-config-provider": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz", - "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.200.0.tgz", - "integrity": "sha512-WDFXifeo617AjCLd6ltddPDNvC7gsbCMQgUdXsuHt+paplyjqHF20jCU1+WXvFaTU5Ia1lN+SGDJb1nB1jawkw==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.200.0.tgz", - "integrity": "sha512-1S/Y/KzKnK/aCqQiPR3JUlXv8NWjHiuuGUB1po3neeWnsld10Q4o2ScWWT/v+XCXFac7ublX6yjrCQ+1YBZNCw==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.200.0.tgz", - "integrity": "sha512-qBPq/nVziDixIp8dLxL0Q+03JPy9HuJmL0sREHaE4sIHL1/g4gutXCQe5oYS4de82xSe4uNZo9qVBYW96h6m6A==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz", - "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz", - "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-middleware": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.200.0.tgz", - "integrity": "sha512-yMC4pg9z31AxnvC9f2M+D7L1KCh6NgykPsNqQQxTz6fFIt/nXNc10eqYaVCJCn419bcSgQhtVDJ2RAudrCCabg==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@aws-sdk/util-middleware/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz", - "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.200.0.tgz", - "integrity": "sha512-985Qtcw813q3UanTakl17OJzdVRcw6p1lIl1Xww1CmuA9sW6X8+q6oQavnmXtACMd059sTUR/f+V4Yloya2Pmg==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/types": "3.200.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.200.0.tgz", - "integrity": "sha512-3dgMp31enW37VMg7GZDq5xhohEMo8mocwafQ1pKND/NDEjha9df3nk6Oy4F5Y2pG8GPdFvHnsTqJ6FJKwwYtxA==", - "dev": true, - "optional": true, - "dependencies": { - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", - "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "tslib": "^2.3.1" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, - "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] }, - "node_modules/@aws-sdk/util-utf8-node": { - "version": "3.199.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.199.0.tgz", - "integrity": "sha512-Kk3qCdGbe5k0PUE8EBgMsRxNstvDCoWStYWjNwsHWuc/hJitSf44PColzXw6xxHqH1sY+6LcgIaMwJZ5C4bB6w==", - "dev": true, - "optional": true, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@aws-sdk/util-utf8-node/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz", - "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.0.tgz", - "integrity": "sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz", - "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.0.tgz", - "integrity": "sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.0.tgz", - "integrity": "sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/types": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz", - "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/common/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ethereumjs/common/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/tx/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ethereumjs/tx/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dependencies": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - } - }, - "node_modules/@ethersproject/abstract-provider": { + "node_modules/@ethersproject/properties": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -2145,19 +1121,13 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -2170,16 +1140,31 @@ ], "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" } }, - "node_modules/@ethersproject/address": { + "node_modules/@ethersproject/random": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -2191,17 +1176,14 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/base64": { + "node_modules/@ethersproject/rlp": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "funding": [ { "type": "individual", @@ -2213,13 +1195,14 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/basex": { + "node_modules/@ethersproject/sha2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -2232,395 +1215,8 @@ ], "dependencies": { "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, "node_modules/@ethersproject/signing-key": { @@ -2702,3395 +1298,2404 @@ { "type": "individual", "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.1.tgz", - "integrity": "sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==", - "peer": true - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", - "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "0.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", - "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", - "dependencies": { - "@firebase/util": "0.3.2", - "tslib": "^1.11.1" - } - }, - "node_modules/@firebase/database": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.13.tgz", - "integrity": "sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA==", - "dependencies": { - "@firebase/auth-interop-types": "0.1.5", - "@firebase/component": "0.1.19", - "@firebase/database-types": "0.5.2", - "@firebase/logger": "0.2.6", - "@firebase/util": "0.3.2", - "faye-websocket": "0.11.3", - "tslib": "^1.11.1" - } - }, - "node_modules/@firebase/database-types": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz", - "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==", - "dependencies": { - "@firebase/app-types": "0.6.1" - } - }, - "node_modules/@firebase/database-types/node_modules/@firebase/app-types": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", - "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" - }, - "node_modules/@firebase/logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", - "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" - }, - "node_modules/@firebase/util": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", - "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", - "dependencies": { - "tslib": "^1.11.1" - } - }, - "node_modules/@google-cloud/common": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz", - "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==", - "optional": true, - "dependencies": { - "@google-cloud/projectify": "^1.0.0", - "@google-cloud/promisify": "^1.0.0", - "arrify": "^2.0.0", - "duplexify": "^3.6.0", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^5.5.0", - "retry-request": "^4.0.0", - "teeny-request": "^6.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.6.tgz", - "integrity": "sha512-ox80NbrM1MLJgvAAUd1quFLx/ie/nSjrk1PtscSicpoYDlKb9e6j7pHrVpbopBMyliyfNl3tLJWaDh+x+uCXqw==", - "optional": true, - "dependencies": { - "deep-equal": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^1.15.3", - "readable-stream": "^3.4.0", - "through2": "^3.0.0" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", - "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", - "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==", - "optional": true, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", - "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==", - "optional": true, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@google-cloud/storage": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.2.tgz", - "integrity": "sha512-nlXYhJyC6ErFQX34tMLruknJ9fljN3JepgXEC9MZlQ64/2h9Ee8MJ7FCowdBnTiZ863IkbvctWtNZRrSxfyqSQ==", - "optional": true, - "dependencies": { - "@google-cloud/common": "^2.1.1", - "@google-cloud/paginator": "^2.0.0", - "@google-cloud/promisify": "^1.0.0", - "arrify": "^2.0.0", - "compressible": "^2.0.12", - "concat-stream": "^2.0.0", - "date-and-time": "^0.14.2", - "duplexify": "^3.5.0", - "extend": "^3.0.2", - "gaxios": "^3.0.0", - "gcs-resumable-upload": "^2.2.4", - "hash-stream-validation": "^0.2.2", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "onetime": "^5.1.0", - "p-limit": "^2.2.0", - "pumpify": "^2.0.0", - "readable-stream": "^3.4.0", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "through2": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.8.tgz", - "integrity": "sha512-4qJqqn+CU/nBydz9ePJP+oa8dz0U42Ut/GejlbyaQ1xTkynCc+ndNHHnISlNeHawDsv4MOAyP3mV/EnDNUw2zA==", - "optional": true, - "dependencies": { - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@types/node": { - "version": "18.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.8.tgz", - "integrity": "sha512-uGwPWlE0Hj972KkHtCDVwZ8O39GmyjfMane1Z3GUBGGnkZ2USDq7SxLpVIiIHpweY9DS0QTDH0Nw7RNBsAAZ5A==", - "optional": true - }, - "node_modules/@grpc/proto-loader": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.6.tgz", - "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz", - "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", - "dependencies": { - "cborg": "^1.6.0", - "multiformats": "^9.5.4" - } - }, - "node_modules/@ipld/dag-json": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-8.0.11.tgz", - "integrity": "sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA==", - "dependencies": { - "cborg": "^1.5.4", - "multiformats": "^9.5.4" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-2.1.18.tgz", - "integrity": "sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==", - "dependencies": { - "multiformats": "^9.5.4" - } - }, - "node_modules/@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "dependencies": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "dependencies": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/source-map/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "dependencies": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "dependencies": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@phc/format": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", - "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@rodrigogs/mysql-events": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rodrigogs/mysql-events/-/mysql-events-0.6.0.tgz", - "integrity": "sha512-bI4zECD76lprG050XIl9+ZY2COZ7rxwtT982uF+aV872j/zbQC0imYDZuYcQuktNC3GyLuo+wH/BoxrrfDQEag==", - "dependencies": { - "@rodrigogs/zongji": "^0.4.14", - "debug": "^4.1.1", - "debuggler": "^1.0.0", - "mysql": "^2.17.1" - }, - "engines": { - "node": ">=7.6.0" - } - }, - "node_modules/@rodrigogs/mysql-events/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@rodrigogs/zongji": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@rodrigogs/zongji/-/zongji-0.4.14.tgz", - "integrity": "sha512-U2UUFzL/Lsc7AfRXAyo2OW4caGzf+teKOVA+D1Suq4f87Scn4frIGaiKOgZ/j50C1bXRT46wcy2AgWgZfr5fWQ==", - "dependencies": { - "iconv-lite": "^0.4.24", - "mysql": "^2.16.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/agenda": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/agenda/-/agenda-2.0.9.tgz", - "integrity": "sha512-uSQmxC9/OWvXCprY5+xzDUt95NCAffijeODNM4qscWnl9TGXIxyeA59MKF1Wq0OUPpURiWylVuNGUzBku1KrIA==", - "dev": true, - "dependencies": { - "@types/mongodb": "*", - "@types/node": "*" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" } }, - "node_modules/@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/node": "*" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" - }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", - "optional": true, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/node": "*" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", + "peer": true }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "node_modules/@firebase/auth-interop-types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "0.x" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, + "node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" } }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, + "node_modules/@firebase/database": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.13.tgz", + "integrity": "sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA==", "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.19", + "@firebase/database-types": "0.5.2", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" } }, - "node_modules/@types/jest": { - "version": "23.3.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", - "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz", - "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==", - "deprecated": "This is a stub types definition. keyv provides its own type definitions, so you do not need this installed.", + "node_modules/@firebase/database-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz", + "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==", "dependencies": { - "keyv": "*" + "@firebase/app-types": "0.6.1" } }, - "node_modules/@types/lodash": { - "version": "4.14.187", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", - "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "node_modules/@firebase/database-types/node_modules/@firebase/app-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", + "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "node_modules/@firebase/logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", + "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" }, - "node_modules/@types/mongodb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", - "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", - "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", - "dev": true, + "node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", "dependencies": { - "mongodb": "*" + "tslib": "^1.11.1" } }, - "node_modules/@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", - "dev": true, + "node_modules/@google-cloud/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz", + "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==", + "optional": true, "dependencies": { - "mongoose": "*" + "@google-cloud/projectify": "^1.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "duplexify": "^3.6.0", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^5.5.0", + "retry-request": "^4.0.0", + "teeny-request": "^6.0.0" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@types/mysql": { - "version": "2.15.21", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", - "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==", - "dev": true, + "node_modules/@google-cloud/firestore": { + "version": "3.8.6", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.6.tgz", + "integrity": "sha512-ox80NbrM1MLJgvAAUd1quFLx/ie/nSjrk1PtscSicpoYDlKb9e6j7pHrVpbopBMyliyfNl3tLJWaDh+x+uCXqw==", + "optional": true, "dependencies": { - "@types/node": "*" + "deep-equal": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^1.15.3", + "readable-stream": "^3.4.0", + "through2": "^3.0.0" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "node_modules/@google-cloud/paginator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", + "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", + "optional": true, "dependencies": { - "@types/node": "*" + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "node_modules/@google-cloud/projectify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", + "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==", + "optional": true, + "engines": { + "node": ">=8.10.0" + } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" + "node_modules/@google-cloud/promisify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", + "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==", + "optional": true, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "node_modules/@google-cloud/storage": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.2.tgz", + "integrity": "sha512-nlXYhJyC6ErFQX34tMLruknJ9fljN3JepgXEC9MZlQ64/2h9Ee8MJ7FCowdBnTiZ863IkbvctWtNZRrSxfyqSQ==", + "optional": true, "dependencies": { - "@types/node": "*" + "@google-cloud/common": "^2.1.1", + "@google-cloud/paginator": "^2.0.0", + "@google-cloud/promisify": "^1.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.14.2", + "duplexify": "^3.5.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "gcs-resumable-upload": "^2.2.4", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^2.2.0", + "pumpify": "^2.0.0", + "readable-stream": "^3.4.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "through2": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, + "node_modules/@grpc/grpc-js": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.8.tgz", + "integrity": "sha512-4qJqqn+CU/nBydz9ePJP+oa8dz0U42Ut/GejlbyaQ1xTkynCc+ndNHHnISlNeHawDsv4MOAyP3mV/EnDNUw2zA==", + "optional": true, "dependencies": { - "@types/mime": "*", - "@types/node": "*" + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "node_modules/@grpc/grpc-js/node_modules/@types/node": { + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", + "optional": true }, - "node_modules/@types/superagent": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", - "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "node_modules/@grpc/proto-loader": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.6.tgz", + "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", + "optional": true, "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==", - "dev": true - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dev": true, + "node_modules/@ipld/dag-cbor": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz", + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" + "cborg": "^1.6.0", + "multiformats": "^9.5.4" } }, - "node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dev": true, + "node_modules/@ipld/dag-json": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-8.0.11.tgz", + "integrity": "sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA==", "dependencies": { - "@types/yargs-parser": "*" + "cborg": "^1.5.4", + "multiformats": "^9.5.4" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", - "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", - "dev": true, + "node_modules/@ipld/dag-pb": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-2.1.18.tgz", + "integrity": "sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==", "dependencies": { - "@typescript-eslint/experimental-utils": "1.13.0", - "eslint-utils": "^1.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.7.0" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^1.9.0", - "eslint": "^5.0.0" + "multiformats": "^9.5.4" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", - "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "node_modules/@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "^4.0.0" + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - }, - "peerDependencies": { - "eslint": "*" + "node": ">= 6" } }, - "node_modules/@typescript-eslint/parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", - "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", - "dev": true, - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "^1.0.0" + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - }, - "peerDependencies": { - "eslint": "^5.0.0" + "node": ">=4" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6.14.0" + "node": ">=4" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "node_modules/@jest/console/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/abort-controller": { + "node_modules/@jest/console/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">=6.5" + "node": ">=4" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@jest/console/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "dependencies": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">= 6" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@jest/core/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/agenda": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/agenda/-/agenda-2.3.0.tgz", - "integrity": "sha512-0RnozNC6Dy1lvaY3/BQt0IKlQrU5vSjBZ9fSG+5I31bNvU7VrzrZFNNuoBmsd99z5GwXzOIWVUkbddvj/VlfBg==", + "node_modules/@jest/core/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { - "cron": "~1.7.2", - "date.js": "~0.3.3", - "debug": "~4.1.1", - "human-interval": "~1.0.0", - "moment-timezone": "~0.5.27", - "mongodb": "~3.4.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/agenda/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/agenda/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "dependencies": { - "ms": "^2.1.1" + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/agenda/node_modules/mongodb": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz", - "integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==", + "node_modules/@jest/core/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" } }, - "node_modules/agendash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/agendash/-/agendash-1.0.0.tgz", - "integrity": "sha512-m8Zp0uJEwkgMkgRs9HqWVP4YKyal2Z4x/c2pGCrxPqwV3GOiG9DucHi9BqWbb8Z1Sely6LryVolTlgQRhLw1Iw==", + "node_modules/@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, "dependencies": { - "agenda": "^2.0.0", - "async": "^2.6.0", - "body-parser": "^1.15.0", - "commander": "^2.9.0", - "express": "^4.0.0", - "hapi": "^17.5.1", - "inert": "^5.1.0", - "semver": "^5.3.0" - }, - "bin": { - "agendash": "bin/agendash-standalone.js" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" }, "engines": { - "node": ">=8.9.0" + "node": ">= 6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, "dependencies": { - "debug": "4" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 6" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "color-convert": "^1.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=4" } }, - "node_modules/ammo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", - "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==", - "deprecated": "This module has moved and is now available at @hapi/ammo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "hoek": "6.x.x" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "string-width": "^2.0.0" + "color-name": "1.1.3" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 6" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/any-signal": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-3.0.1.tgz", - "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" + "node_modules/@jest/source-map/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "node_modules/@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argon2": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.28.7.tgz", - "integrity": "sha512-pvsScM3Fq7b+jolXkZHh8nRQx0uD/WeelnwYPMRpn4pAydoa1gqeL/KRdWAag4Hnu1TJNBTAfqyTjV+ZHwNnYA==", - "hasInstallScript": true, + "node_modules/@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.9", - "@phc/format": "^1.0.0", - "node-addon-api": "^5.0.0" + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 6" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "node_modules/array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/assert-options": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.7.0.tgz", - "integrity": "sha512-7q9uNH/Dh8gFgpIIb9ja8PJEWA5AQy3xnBC8jtKs8K/gNVCr1K6kIvlm59HUyYgvM7oEDoLzGgPcGd9FqhtXEQ==", + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.8" + "node": ">=10" } }, - "node_modules/assert-ts": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/assert-ts/-/assert-ts-0.3.4.tgz", - "integrity": "sha512-CQtNOdOCzzZfE3TF9a1vFTcz4ZfJYM6iHoWYCkpFY3wdk6CkFvevuLwpOFVL/KMJ9vCNIbeidWH5uo/Y8sLVWg==" + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/assertion-error": { + "node_modules/@mongodb-js/saslprep": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "dev": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" } }, - "node_modules/assign-symbols": { + "node_modules/@phc/format": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { - "lodash": "^4.17.14" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rodrigogs/mysql-events": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rodrigogs/mysql-events/-/mysql-events-0.6.0.tgz", + "integrity": "sha512-bI4zECD76lprG050XIl9+ZY2COZ7rxwtT982uF+aV872j/zbQC0imYDZuYcQuktNC3GyLuo+wH/BoxrrfDQEag==", + "dependencies": { + "@rodrigogs/zongji": "^0.4.14", + "debug": "^4.1.1", + "debuggler": "^1.0.0", + "mysql": "^2.17.1" }, "engines": { - "node": ">= 4.5.0" + "node": ">=7.6.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/@rodrigogs/mysql-events/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/aws-sdk": { - "version": "2.770.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.770.0.tgz", - "integrity": "sha512-CUkyXwFxEJ32AxH2tjBFfG4grjFdyDjyBaltYzaLa0U2KvGgDIj28q8psdxhALTm3c9zPEoMYpRXiTyRNmkROQ==", - "dev": true, + "node_modules/@rodrigogs/zongji": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@rodrigogs/zongji/-/zongji-0.4.14.tgz", + "integrity": "sha512-U2UUFzL/Lsc7AfRXAyo2OW4caGzf+teKOVA+D1Suq4f87Scn4frIGaiKOgZ/j50C1bXRT46wcy2AgWgZfr5fWQ==", "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" + "iconv-lite": "^0.4.24", + "mysql": "^2.16.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/axios": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", - "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "dependencies": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, "engines": { "node": ">= 6" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/agenda": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/agenda/-/agenda-2.0.9.tgz", + "integrity": "sha512-uSQmxC9/OWvXCprY5+xzDUt95NCAffijeODNM4qscWnl9TGXIxyeA59MKF1Wq0OUPpURiWylVuNGUzBku1KrIA==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@types/mongodb": "*", + "@types/node": "*" } }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@babel/types": "^7.0.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - }, - "engines": { - "node": ">=6" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 6" + "@babel/types": "^7.20.7" } }, - "node_modules/babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "dependencies": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "node_modules/@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "@types/node": "*" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==" + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" + "@types/node": "*" } }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" + }, + "node_modules/@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", "dependencies": { - "safe-buffer": "^5.0.1" + "@types/node": "*" } }, - "node_modules/base/node_modules/define-property": { + "node_modules/@types/eslint-visitor-keys": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" + "node_modules/@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/basic-auth": { + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/@types/jest": { + "version": "23.3.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", + "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "tweetnacl": "^0.14.3" + "@types/node": "*" } }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "node_modules/@types/lodash": { + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", + "dev": true }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, - "node_modules/bent": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", - "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/mongodb": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", + "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", + "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", + "dev": true, "dependencies": { - "bytesish": "^0.4.1", - "caseless": "~0.12.0", - "is-stream": "^2.0.0" + "mongodb": "*" } }, - "node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "engines": { - "node": "*" + "node_modules/@types/mongoose": { + "version": "5.11.97", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", + "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", + "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", + "dev": true, + "dependencies": { + "mongoose": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@types/mysql": { + "version": "2.15.21", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", + "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@types/node": "*" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dependencies": { - "file-uri-to-path": "1.0.0" + "@types/node": "*" } }, - "node_modules/bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", + "node_modules/@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { - "safe-buffer": "^5.0.1" + "@types/node": "*" } }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "@types/node": "*" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", + "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", "dependencies": { - "safe-buffer": "~5.1.0" + "@types/cookiejar": "*", + "@types/node": "*" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "node_modules/@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" }, - "node_modules/blob-to-it": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-1.0.4.tgz", - "integrity": "sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==", + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==", + "dev": true + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dev": true, "dependencies": { - "browser-readablestream-to-it": "^1.0.3" + "@types/node": "*", + "@types/webidl-conversions": "*" } }, - "node_modules/bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "node_modules/@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^1.9.0", + "eslint": "^5.0.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + }, + "peerDependencies": { + "eslint": "*" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/boom": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", - "integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==", - "deprecated": "This module has moved and is now available at @hapi/boom. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "node_modules/@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, "dependencies": { - "hoek": "6.x.x" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + }, + "peerDependencies": { + "eslint": "^5.0.0" } }, - "node_modules/bounce": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.3.tgz", - "integrity": "sha512-3G7B8CyBnip5EahCZJjnvQ1HLyArC6P5e+xcolo13BVI9ogFaDOsNMAE7FIWliHtIkYI8/nTRCvCY9tZa3Mu4g==", - "deprecated": "This module has moved and is now available at @hapi/bounce. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, "dependencies": { - "boom": "7.x.x", - "hoek": "6.x.x" + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "engines": { + "node": ">=6.14.0" } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true, - "optional": true + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true }, - "node_modules/boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=6.5" } }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "color-convert": "^1.9.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/boxen/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/boxen/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/agenda": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/agenda/-/agenda-2.3.0.tgz", + "integrity": "sha512-0RnozNC6Dy1lvaY3/BQt0IKlQrU5vSjBZ9fSG+5I31bNvU7VrzrZFNNuoBmsd99z5GwXzOIWVUkbddvj/VlfBg==", "dependencies": { - "has-flag": "^3.0.0" + "cron": "~1.7.2", + "date.js": "~0.3.3", + "debug": "~4.1.1", + "human-interval": "~1.0.0", + "moment-timezone": "~0.5.27", + "mongodb": "~3.4.0" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/agenda/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/agenda/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ms": "^2.1.1" } }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, + "node_modules/agenda/node_modules/mongodb": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz", + "integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==", "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" } }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/agendash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/agendash/-/agendash-1.0.0.tgz", + "integrity": "sha512-m8Zp0uJEwkgMkgRs9HqWVP4YKyal2Z4x/c2pGCrxPqwV3GOiG9DucHi9BqWbb8Z1Sely6LryVolTlgQRhLw1Iw==", "dependencies": { - "is-extendable": "^0.1.0" + "agenda": "^2.0.0", + "async": "^2.6.0", + "body-parser": "^1.15.0", + "commander": "^2.9.0", + "express": "^4.0.0", + "hapi": "^17.5.1", + "inert": "^5.1.0", + "semver": "^5.3.0" + }, + "bin": { + "agendash": "bin/agendash-standalone.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.9.0" } }, - "node_modules/braces/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6.0.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browser-readablestream-to-it": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz", - "integrity": "sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==" - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "resolve": "1.1.7" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/ammo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", + "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==", + "deprecated": "This module has moved and is now available at @hapi/ammo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "hoek": "6.x.x" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "string-width": "^2.0.0" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "fast-json-stable-stringify": "2.x" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } + "node_modules/any-signal": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-3.0.1.tgz", + "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "dependencies": { - "node-int64": "^0.4.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "node_modules/bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", - "dev": true, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { - "buffer": "^5.6.0" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/bson/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argon2": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.28.7.tgz", + "integrity": "sha512-pvsScM3Fq7b+jolXkZHh8nRQx0uD/WeelnwYPMRpn4pAydoa1gqeL/KRdWAag4Hnu1TJNBTAfqyTjV+ZHwNnYA==", + "hasInstallScript": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@mapbox/node-pre-gyp": "^1.0.9", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, "engines": { - "node": ">=6.14.2" + "node": ">=0.10.0" } }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dependencies": { - "streamsearch": "^1.1.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, - "engines": { - "node": ">=10.16.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/bytesish": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", - "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==" + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "node_modules/array.prototype.map": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", + "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, "engines": { - "node": ">=10.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dev": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dependencies": { - "pump": "^3.0.0" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true, "engines": { "node": ">=8" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safer-buffer": "~2.1.0" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dependencies": { - "callsites": "^2.0.0" - }, + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/assert-options": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.0.tgz", + "integrity": "sha512-qSELrEaEz4sGwTs4Qh+swQkjiHAysC4rot21+jzXU86dJzNG+FDqBzyS3ohSoTRf4ZLA3FSwxQdiuNl5NXUtvA==", "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dependencies": { - "caller-callsite": "^2.0.0" - }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "node_modules/assert-ts": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/assert-ts/-/assert-ts-0.3.4.tgz", + "integrity": "sha512-CQtNOdOCzzZfE3TF9a1vFTcz4ZfJYM6iHoWYCkpFY3wdk6CkFvevuLwpOFVL/KMJ9vCNIbeidWH5uo/Y8sLVWg==" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", "dependencies": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" + "tslib": "^2.0.1" }, "engines": { "node": ">=4" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "node_modules/ast-types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001429", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", - "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, - "dependencies": { - "rsvp": "^4.8.4" + "bin": { + "atob": "bin/atob.js" }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 4.5.0" } }, - "node_modules/capture-stack-trace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", - "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "node_modules/aws-sdk": { + "version": "2.770.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.770.0.tgz", + "integrity": "sha512-CUkyXwFxEJ32AxH2tjBFfG4grjFdyDjyBaltYzaLa0U2KvGgDIj28q8psdxhALTm3c9zPEoMYpRXiTyRNmkROQ==", + "dev": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/cborg": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.9.5.tgz", - "integrity": "sha512-fLBv8wmqtlXqy1Yu+pHzevAIkW6k2K0ZtMujNzWphLsA34vzzg9BHn+5GmZqOJkSA9V7EMKsWrf6K976c1QMjQ==", - "bin": { - "cborg": "cli.js" + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" } }, - "node_modules/celebrate": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/celebrate/-/celebrate-9.1.0.tgz", - "integrity": "sha512-QFVB7HazVEWUFbzyHkzw/f1Mq9Zg6uJ4MYcpl/Snpfa9wkUHn//HUlMvN0BWyZyc/X09HczNGnLBwSQFtMz1QQ==", + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "dependencies": { - "escape-html": "1.0.3", - "joi": "14.x.x" - }, - "engines": { - "node": ">=8.9.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "node_modules/babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/chai-http": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", - "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "@types/chai": "4", - "@types/superagent": "^3.8.3", - "cookiejar": "^2.1.1", - "is-ip": "^2.0.0", - "methods": "^1.1.2", - "qs": "^6.5.1", - "superagent": "^3.7.0" + "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "node_modules/babel-jest/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "engines": { - "node": "*" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=4" } }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/babel-jest/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 6" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/chokidar/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "engines": { - "node": ">=8.0" + "node": ">=0.10.0" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "node": ">=0.10.0" } }, - "node_modules/cids/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -6104,311 +3709,257 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/cids/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "tweetnacl": "^0.14.3" } }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, + "node_modules/bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" } }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "file-uri-to-path": "1.0.0" } }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "peer": true, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" + "safe-buffer": "~5.1.0" } }, - "node_modules/cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dependencies": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "node_modules/blob-to-it": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-1.0.4.tgz", + "integrity": "sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" + "browser-readablestream-to-it": "^1.0.3" } }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true, - "peer": true + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "ms": "2.0.0" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/boom": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", + "integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==", + "deprecated": "This module has moved and is now available at @hapi/boom. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "hoek": "6.x.x" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node_modules/bounce": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.3.tgz", + "integrity": "sha512-3G7B8CyBnip5EahCZJjnvQ1HLyArC6P5e+xcolo13BVI9ogFaDOsNMAE7FIWliHtIkYI8/nTRCvCY9tZa3Mu4g==", + "deprecated": "This module has moved and is now available at @hapi/bounce. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "dependencies": { + "boom": "7.x.x", + "hoek": "6.x.x" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/color": { + "node_modules/boxen/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-name": "~1.1.4" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/boxen/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/color/node_modules/color-convert": { + "node_modules/boxen/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -6416,5371 +3967,5512 @@ "color-name": "1.1.3" } }, - "node_modules/color/node_modules/color-name": { + "node_modules/boxen/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "node_modules/boxen/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" } }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "node_modules/boxen/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-readablestream-to-it": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz", + "integrity": "sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==" + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "resolve": "1.1.7" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "optional": true, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "optional": true, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "fast-json-stable-stringify": "2.x" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "base-x": "^3.0.2" } }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/bson": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.0.0.tgz", + "integrity": "sha512-FoWvdELfF2wQaUo8S/a1Rh2BDwJEUancDDnzdTpYymJTZjmvRpLWoqRPelKn+XSeh5D4YddWDG66cLtEhGGvcg==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=16.20.1" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } }, - "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">= 0.10" + "node": ">=6.14.2" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, "engines": { - "node": ">=0.8" + "node": ">=0.10.0" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" } }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "dependencies": { - "capture-stack-trace": "^1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cron": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.2.tgz", - "integrity": "sha512-+SaJ2OfeRvfQqwXQ2kgr0Y5pzBR/lijf5OpnnaruwWnmI799JfWr2jN2ItOV9s3A/+TFOt6mxvKzQq5F0Jp6VQ==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "moment-timezone": "^0.5.x" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cron-parser": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", - "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dependencies": { - "is-nan": "^1.3.0", - "moment-timezone": "^0.5.31" + "callsites": "^2.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=4" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dependencies": { - "node-fetch": "2.6.7" + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, "engines": { - "node": ">=4.8" + "node": ">=6" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/crypto-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", - "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "optional": true, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "dependencies": { - "cssom": "0.3.x" + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dependencies": { - "array-find-index": "^1.0.1" - }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", "engines": { "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/cborg": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz", + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", + "bin": { + "cborg": "cli.js" } }, - "node_modules/dag-jose": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-1.0.0.tgz", - "integrity": "sha512-U0b/YsIPBp6YZNTFrVjwLZAlY3qGRxZTIEcM/CcQmrVrCWq9MWQq9pheXVSPLIhF4SNwzp2SikPva4/BIrJY+g==", + "node_modules/celebrate": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/celebrate/-/celebrate-9.1.0.tgz", + "integrity": "sha512-QFVB7HazVEWUFbzyHkzw/f1Mq9Zg6uJ4MYcpl/Snpfa9wkUHn//HUlMvN0BWyZyc/X09HczNGnLBwSQFtMz1QQ==", "dependencies": { - "@ipld/dag-cbor": "^6.0.3", - "multiformats": "^9.0.2" + "escape-html": "1.0.3", + "joi": "14.x.x" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/dag-jose/node_modules/@ipld/dag-cbor": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz", - "integrity": "sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==", + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", "dependencies": { - "cborg": "^1.5.4", - "multiformats": "^9.5.4" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/chai-http": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz", + "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==", "dependencies": { - "assert-plus": "^1.0.0" + "@types/chai": "4", + "@types/superagent": "4.1.13", + "charset": "^1.0.1", + "cookiejar": "^2.1.4", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.11.2", + "superagent": "^8.0.9" }, "engines": { - "node": ">=0.10" + "node": ">=10" } }, - "node_modules/data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" - }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, + "node_modules/chai-http/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/date-and-time": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", - "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==", - "optional": true + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "peer": true }, - "node_modules/date.js": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", - "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", - "dependencies": { - "debug": "~3.1.0" + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "engines": { + "node": ">=4.0.0" } }, - "node_modules/date.js/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "engines": { + "node": "*" } }, - "node_modules/date.js/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "bin": { - "dateformat": "bin/cli.js" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": "*" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/dateformat/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/dateformat/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/dateformat/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/dateformat/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/dateformat/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/dateformat/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/dateformat/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", - "dev": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/dateformat/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "error-ex": "^1.2.0" + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0", + "npm": ">=3.0.0" } }, - "node_modules/dateformat/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/dateformat/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer": "^5.6.0", + "varint": "^5.0.0" } }, - "node_modules/dateformat/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/cids/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/dateformat/node_modules/read-pkg": { + "node_modules/class-is": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { - "is-utf8": "^0.2.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/dateformat/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/debuggler": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/debuggler/-/debuggler-1.0.0.tgz", - "integrity": "sha512-nq77mTAwWb0mXfhacMP0mQK4qlsTbNYgqM2gzdUR8zT9x7H8eV/GTklxljKnuBkKAdoLsrghTMq/UcrSzV0Etw==", "dependencies": { - "caller-path": "^2.0.0", - "pkg-up": "^2.0.0" - }, - "engines": { - "node": ">=7.6.0" + "is-buffer": "^1.1.5" }, - "peerDependencies": { - "debug": "3.x" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "peer": true, "dependencies": { - "mimic-response": "^1.0.0" + "restore-cursor": "^2.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "node_modules/cli-truncate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", + "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dependencies": { - "type-detect": "^4.0.0" + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=4" } }, - "node_modules/deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "optional": true, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dependencies": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" + "is-fullwidth-code-point": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "optional": true - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true, + "peer": true }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/degenerator": { + "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==", - "dependencies": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - } - }, - "node_modules/degenerator/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "engines": { - "node": ">=4" + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "engines": { - "node": ">=8" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dicer": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.1.tgz", - "integrity": "sha512-ObioMtXnmjYs3aRtpIJt9rgQSPCIhKVkFPip+E9GUDyWl8N435znUxK/JfNwGZJ2wnn5JKQ7Ly3vOK5Q5dylGA==", "dependencies": { - "streamsearch": "^1.1.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "node": ">=0.10.0" } }, - "node_modules/dns-over-http-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", - "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "debug": "^4.3.1", - "native-fetch": "^3.0.0", - "receptacle": "^1.3.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/dns-over-http-resolver/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "ms": "2.1.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=7.0.0" } }, - "node_modules/docker-modem": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", - "integrity": "sha512-4Xn4ZVtc/2DEFtxY04lOVeF7yvxwXGVo0sN8FKRBnLhBcwQ78Hb56j+Z5yAXXUhoweVhzGeBeGWahS+af0/mcg==", - "dependencies": { - "debug": "^2.6.0", - "JSONStream": "0.10.0", - "readable-stream": "~1.0.26-4", - "split-ca": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/docker-modem/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { - "ms": "2.0.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/docker-modem/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/docker-modem/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/docker-modem/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" } }, - "node_modules/docker-modem/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "peer": true, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "color-name": "1.1.3" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { - "webidl-conversions": "^4.0.2" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "optional": true, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dependencies": { - "is-obj": "^2.0.0" + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "node_modules/columnify/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", + "node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "optional": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/duplexify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], "optional": true, "dependencies": { - "safe-buffer": "~5.1.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, "dependencies": { - "xtend": "^4.0.0" + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, - "node_modules/eccrypto": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", - "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", - "hasInstallScript": true, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "acorn": "7.1.1", - "elliptic": "6.5.4", - "es6-promise": "4.2.8", - "nan": "2.14.0" + "safe-buffer": "5.2.1" }, - "optionalDependencies": { - "secp256k1": "3.7.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dependencies": { - "safe-buffer": "^5.0.1" + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-fetch": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", - "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==", - "dependencies": { - "encoding": "^0.1.13" - }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">= 0.6" } }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "iconv-lite": "^0.6.2" + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dependencies": { - "once": "^1.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "capture-stack-trace": "^1.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/engine.io-client": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", - "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cron": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.7.2.tgz", + "integrity": "sha512-+SaJ2OfeRvfQqwXQ2kgr0Y5pzBR/lijf5OpnnaruwWnmI799JfWr2jN2ItOV9s3A/+TFOt6mxvKzQq5F0Jp6VQ==", + "dependencies": { + "moment-timezone": "^0.5.x" } }, - "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "node_modules/cron-parser": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", + "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "dependencies": { + "is-nan": "^1.3.0", + "moment-timezone": "^0.5.31" + }, "engines": { - "node": ">=10.0.0" + "node": ">=0.8" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" } }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=4.8" } }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": "*" } }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true + "node_modules/crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" }, - "node_modules/envfile": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/envfile/-/envfile-6.14.0.tgz", - "integrity": "sha512-JxpcaOgJQB/x0XFmNiqFu0BLK22PlI3F0d95of5SOqcLvBlGC0ug7MHYDWnmZqmx9svIue8v0cVcqAygPTyXHQ==", - "bin": { - "envfile": "bin.cjs" - }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" + "node": ">=8" } }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "cssom": "0.3.x" } }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" + "array-find-index": "^1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/es-array-method-boxes-properly": { + "node_modules/dag-jose": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-1.0.0.tgz", + "integrity": "sha512-U0b/YsIPBp6YZNTFrVjwLZAlY3qGRxZTIEcM/CcQmrVrCWq9MWQq9pheXVSPLIhF4SNwzp2SikPva4/BIrJY+g==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@ipld/dag-cbor": "^6.0.3", + "multiformats": "^9.0.2" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/dag-jose/node_modules/@ipld/dag-cbor": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz", + "integrity": "sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "cborg": "^1.5.4", + "multiformats": "^9.5.4" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "assert-plus": "^1.0.0" }, "engines": { "node": ">=0.10" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "dependencies": { - "es6-promise": "^4.0.3" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/date-and-time": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", + "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==", + "optional": true + }, + "node_modules/date.js": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", + "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "debug": "~3.1.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/date.js/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } + "node_modules/date.js/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "dateformat": "bin/cli.js" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": "*" } }, - "node_modules/eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "node_modules/dateformat/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-config-prettier": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz", - "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==", + "node_modules/dateformat/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "dev": true, "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" }, - "peerDependencies": { - "eslint": ">=3.14.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "node_modules/dateformat/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/dateformat/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "repeating": "^2.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "node_modules/dateformat/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/dateformat/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/dateformat/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/dateformat/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "error-ex": "^1.2.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/dateformat/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dev": true, - "peer": true, "dependencies": { - "color-name": "1.1.3" + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/dateformat/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, - "peer": true, "dependencies": { - "ms": "2.1.2" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/dateformat/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "peer": true, "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/dateformat/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "node_modules/dateformat/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, - "peer": true, "dependencies": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/espree/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "node_modules/dateformat/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/dateformat/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/dateformat/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, - "peer": true, "dependencies": { - "estraverse": "^5.1.0" + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/dateformat/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", "dev": true, - "peer": true, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "estraverse": "^5.2.0" + "ms": "^2.1.1" + } + }, + "node_modules/debuggler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/debuggler/-/debuggler-1.0.0.tgz", + "integrity": "sha512-nq77mTAwWb0mXfhacMP0mQK4qlsTbNYgqM2gzdUR8zT9x7H8eV/GTklxljKnuBkKAdoLsrghTMq/UcrSzV0Etw==", + "dependencies": { + "caller-path": "^2.0.0", + "pkg-up": "^2.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=7.6.0" + }, + "peerDependencies": { + "debug": "3.x" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { - "node": ">=4.0" + "node": ">=0.10.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { - "node": ">= 0.6" + "node": ">=0.10" } }, - "node_modules/eth-crypto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-1.6.0.tgz", - "integrity": "sha512-BRnSxQ/DyaI1YvBWk7FiA2HSO+q7WqxZrAm/ErgIZxG4MCBsuiCXpxiBfwatOhlbkf6h76bEZq8tzTfbfEibEg==", + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { - "@types/bn.js": "4.11.6", - "babel-runtime": "6.26.0", - "eccrypto": "1.1.3", - "eth-lib": "0.2.8", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.0", - "ethers": "4.0.47", - "secp256k1": "4.0.1" - } - }, - "node_modules/eth-crypto/node_modules/acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "bin": { - "acorn": "bin/acorn" + "mimic-response": "^1.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/eth-crypto/node_modules/eccrypto": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.3.tgz", - "integrity": "sha512-Xtyj039Xp2NDZwoe9IcD7pT1EwM4DILdxPCN2H7Rk1wgJNtTkFpk+cpX1QpuHTMaIhkatOBlGGKzGw/DUCDdqg==", - "hasInstallScript": true, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { - "acorn": "7.1.0", - "elliptic": "6.5.1", - "es6-promise": "4.2.8", - "nan": "2.14.0" + "type-detect": "^4.0.0" }, - "optionalDependencies": { - "secp256k1": "3.7.1" - } - }, - "node_modules/eth-crypto/node_modules/eccrypto/node_modules/elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/eth-crypto/node_modules/eccrypto/node_modules/secp256k1": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", - "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", - "hasInstallScript": true, + "node_modules/deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "optional": true, "dependencies": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.4.1", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "optional": true + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "engines": { "node": ">=4.0.0" } }, - "node_modules/eth-crypto/node_modules/elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-crypto/node_modules/ethers": { - "version": "4.0.47", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz", - "integrity": "sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/eth-crypto/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eth-crypto/node_modules/node-addon-api": { + "node_modules/define-property": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/eth-crypto/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/eth-crypto/node_modules/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-iGRjbGAKfXMqhtdkkuNxsgJQfJO8Oo78Rm7DAvsG3XKngq+nJIOGqrCSXcQqIVsmCj0wFanE5uTKFxV3T9j2wg==", - "hasInstallScript": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/eth-crypto/node_modules/setimmediate": { + "node_modules/degenerator": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/eth-crypto/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" } }, - "node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "node_modules/degenerator/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eth-sig-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.1.tgz", - "integrity": "sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==", - "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.0" + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" } }, - "node_modules/ethereum-blockies-base64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereum-blockies-base64/-/ethereum-blockies-base64-1.0.2.tgz", - "integrity": "sha512-Vg2HTm7slcWNKaRhCUl/L3b4KrB8ohQXdd5Pu3OI897EcR6tVRvUqdTwAyx+dnmoDzj8e2bwBLDQ50ByFmcz6w==", - "dependencies": { - "pnglib": "0.0.1" + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/ethereum-blockies-png": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-blockies-png/-/ethereum-blockies-png-0.1.3.tgz", - "integrity": "sha512-w20so1bo2dsCbfozOvkHBycS66OeI59buiBAwN+5ri6fdWIdNl1jKdKcYReizrp8NmidnlQZe04Gua5FUBm8wg==", + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dependencies": { - "parse-color": "^1.0.0", - "pngjs": "^3.2.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dependencies": { - "js-sha3": "^0.8.0" + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/ethereum-bloom-filters/node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "engines": { + "node": ">=4" + } }, - "node_modules/ethereum-checksum-address": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz", - "integrity": "sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ==", - "dependencies": { - "keccak256": "^1.0.0", - "meow": "^5.0.0" - }, - "bin": { - "ethereum_checksum_address": "bin/ethereum_checksum_address" + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" } }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/ethereum-cryptography/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "hasInstallScript": true, + "node_modules/dicer": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.1.tgz", + "integrity": "sha512-ObioMtXnmjYs3aRtpIJt9rgQSPCIhKVkFPip+E9GUDyWl8N435znUxK/JfNwGZJ2wnn5JKQ7Ly3vOK5Q5dylGA==", "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "streamsearch": "^1.1.0" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/ethereum-cryptography/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "node_modules/ethereum-cryptography/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, + "node_modules/diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/dns-over-http-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", + "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", + "dependencies": { + "debug": "^4.3.1", + "native-fetch": "^3.0.0", + "receptacle": "^1.3.2" + } + }, + "node_modules/dns-over-http-resolver/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ethereum-public-key-to-address": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.2.tgz", - "integrity": "sha512-KRd0yrlbgESK3A62L4sHiJRk+b/UPX92Ehd0cCXWa5L7bQaq7z5q4BSRhuUuSZj++LQHQfJQQnJkskuHjDnbCQ==", + "node_modules/docker-modem": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", + "integrity": "sha512-4Xn4ZVtc/2DEFtxY04lOVeF7yvxwXGVo0sN8FKRBnLhBcwQ78Hb56j+Z5yAXXUhoweVhzGeBeGWahS+af0/mcg==", "dependencies": { - "ethereum-checksum-address": "0.0.2", - "keccak256": "^1.0.0", - "meow": "^5.0.0", - "secp256k1": "^3.7.1" + "debug": "^2.6.0", + "JSONStream": "0.10.0", + "readable-stream": "~1.0.26-4", + "split-ca": "^1.0.0" }, - "bin": { - "ethereum_public_key_to_address": "bin/ethereum_public_key_to_address" + "engines": { + "node": ">= 0.8" } }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "node_modules/docker-modem/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "ms": "2.0.0" } }, - "node_modules/ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + "node_modules/docker-modem/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } + "node_modules/docker-modem/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", + "node_modules/docker-modem/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/docker-modem/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/ethers/node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "webidl-conversions": "^4.0.2" } }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "optional": true, "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=8" } }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "node_modules/drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=0.10" } }, - "node_modules/event-dispatch": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/event-dispatch/-/event-dispatch-0.4.1.tgz", - "integrity": "sha512-+nfoCngxvUdziP3Svtt7Iuqu3mKf0Tjoxez0V/ew4BtW2scu3tPVZF8i4Kw3SsVCH75XSWjfV0zC0MWh2GQEeA==", + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "optional": true, "dependencies": { - "fs": "0.0.2", - "path": "^0.11.14" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, - "engines": { - "node": ">=6" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true }, - "node_modules/events": { + "node_modules/duplexify/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", "dev": true, - "engines": { - "node": ">=0.4.x" + "dependencies": { + "xtend": "^4.0.0" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true + "node_modules/eccrypto": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", + "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", + "hasInstallScript": true, + "dependencies": { + "acorn": "7.1.1", + "elliptic": "6.5.4", + "es6-promise": "4.2.8", + "nan": "2.14.0" + }, + "optionalDependencies": { + "secp256k1": "3.7.1" + } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-fetch": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", + "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==", + "dependencies": { + "encoding": "^0.1.13" }, "engines": { "node": ">=6" } }, - "node_modules/execa/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, + "node_modules/electron-to-chromium": { + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "dev": true + }, + "node_modules/elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "ms": "2.0.0" + "once": "^1.4.0" } }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, + "node_modules/engine.io": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", "dependencies": { - "is-descriptor": "^0.1.0" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.2.0" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "kind-of": "^3.0.2" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "optional": true + }, + "node_modules/envfile": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/envfile/-/envfile-6.14.0.tgz", + "integrity": "sha512-JxpcaOgJQB/x0XFmNiqFu0BLK22PlI3F0d95of5SOqcLvBlGC0ug7MHYDWnmZqmx9svIue8v0cVcqAygPTyXHQ==", + "bin": { + "envfile": "bin.cjs" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" } }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" }, - "node_modules/expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "is-arrayish": "^0.2.1" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dependencies": { - "color-convert": "^1.9.0" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dependencies": { - "color-name": "1.1.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.4" } }, - "node_modules/express-basic-auth": { + "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", - "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dependencies": { - "basic-auth": "^2.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express-jwt": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.3.tgz", - "integrity": "sha512-UdB8p5O8vGYTKm3SfREnLgVGIGEHcL3lrVyi3ebEX2qhMuagN623ju7ywWis+qYL+CXE7G1qPc2bCPBAg2MxZQ==", + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, "dependencies": { - "async": "^1.5.0", - "express-unless": "^0.3.0", - "jsonwebtoken": "^8.1.0", - "lodash.set": "^4.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10" } }, - "node_modules/express-jwt/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/express-unless": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", - "integrity": "sha512-MPF0KbUOTUMvTQ8/1+bewiYGdCbSL4FvkuVNe2ydjZ0HE/Uq2+NPfKLb1vA5DbcvVPrrAg6GB0ULURUALzzgqw==" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "ms": "2.0.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dependencies": { - "type": "^2.7.2" + "es6-promise": "^4.0.3" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "peer": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dependencies": { - "is-descriptor": "^1.0.0" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, + "peer": true, "dependencies": { - "is-extendable": "^0.1.0" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=0.10.0" + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" } }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/eslint-config-prettier": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz", + "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-files": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", - "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", - "engines": { - "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" + "dependencies": { + "get-stdin": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jaydenseric" + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=3.14.1" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.1.0.tgz", - "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "optional": true - }, - "node_modules/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, - "optional": true, "dependencies": { - "strnum": "^1.0.5" + "prettier-linter-helpers": "^1.0.0" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=6.0.0" }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "dependencies": { - "websocket-driver": ">=0.5.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=4.0.0" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "dependencies": { - "bser": "2.1.1" + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "peer": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "node_modules/eslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "peer": true, "dependencies": { - "flat-cache": "^2.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/filewatcher": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", - "integrity": "sha512-Fro8py2B8EJupSP37Kyd4kjKZLr+5ksFq7Vbw8A392Z15Unq8016SPUDvO/AsDj5V6bbPk98PTAinpc5YhPbJw==", + "node_modules/eslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { - "debounce": "^1.0.0" + "color-name": "1.1.3" } }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "peer": true, "dependencies": { - "is-extendable": "^0.1.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/fill-range/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/eslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/eslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/eslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { - "locate-path": "^3.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/firebase-admin": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.12.1.tgz", - "integrity": "sha512-DZ4Q7QQJYaO2BhnhZLrhL+mGRTCLS5WrxjbJtuKGmbKRBepwMhx++EQA5yhnGnIXgDHnp5SrZnVKygNdXtH8BQ==", + "node_modules/espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "peer": true, "dependencies": { - "@firebase/database": "^0.6.0", - "@types/node": "^8.10.59", - "dicer": "^0.3.0", - "jsonwebtoken": "8.1.0", - "node-forge": "0.7.4" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" }, "engines": { - "node": "^8.13.0 || >=10.10.0" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^3.0.0", - "@google-cloud/storage": "^4.1.2" + "node": ">=6.0.0" } }, - "node_modules/firebase-admin/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - }, - "node_modules/firebase-admin/node_modules/jsonwebtoken": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", - "integrity": "sha512-KGlASk0MhznKeyI16nTMla+f+Rn/w89tHPnpbRZuQfnTp221suG7FRAR/yY+FeadVSTn72WZsbqF4Yq/B583QA==", - "dependencies": { - "jws": "^3.1.4", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.0.0", - "xtend": "^4.0.1" + "node_modules/espree/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.12", - "npm": ">=1.4.28" - } - }, - "node_modules/firebase-admin/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/firebase-admin/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "node": ">=0.4.0" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "peer": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "peer": true, "dependencies": { - "glob": "^7.1.3" + "estraverse": "^5.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=0.10" } }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "peer": true, "engines": { "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { - "node": "*" + "node": ">=4.0" } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "node": ">=0.10.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, + "node_modules/eth-crypto": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-1.6.0.tgz", + "integrity": "sha512-BRnSxQ/DyaI1YvBWk7FiA2HSO+q7WqxZrAm/ErgIZxG4MCBsuiCXpxiBfwatOhlbkf6h76bEZq8tzTfbfEibEg==", "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" + "@types/bn.js": "4.11.6", + "babel-runtime": "6.26.0", + "eccrypto": "1.1.3", + "eth-lib": "0.2.8", + "ethereumjs-tx": "2.1.2", + "ethereumjs-util": "6.2.0", + "ethers": "4.0.47", + "secp256k1": "4.0.1" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/eth-crypto/node_modules/acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, - "node_modules/fs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", - "integrity": "sha512-YAiVokMCrSIFZiroB1oz51hPiPRVcUtSa4x2U5RYXyhS9VAPdiFigKbPTnOSq7XY8wd3FIVPYmXpo5lMzFmxgg==" - }, - "node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "node_modules/eth-crypto/node_modules/eccrypto": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.3.tgz", + "integrity": "sha512-Xtyj039Xp2NDZwoe9IcD7pT1EwM4DILdxPCN2H7Rk1wgJNtTkFpk+cpX1QpuHTMaIhkatOBlGGKzGw/DUCDdqg==", + "hasInstallScript": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "acorn": "7.1.0", + "elliptic": "6.5.1", + "es6-promise": "4.2.8", + "nan": "2.14.0" + }, + "optionalDependencies": { + "secp256k1": "3.7.1" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/eth-crypto/node_modules/eccrypto/node_modules/elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, - "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==" - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, + "node_modules/eth-crypto/node_modules/eccrypto/node_modules/secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", "hasInstallScript": true, "optional": true, - "os": [ - "darwin" - ], "dependencies": { "bindings": "^1.5.0", - "nan": "^2.12.1" + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" }, "engines": { - "node": ">= 4.0" + "node": ">=4.0.0" } }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "node_modules/eth-crypto/node_modules/elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "engines": { - "node": ">=0.8.0" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/eth-crypto/node_modules/ethers": { + "version": "4.0.47", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz", + "integrity": "sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.5.2", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/eth-crypto/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/eth-crypto/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/eth-crypto/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/eth-crypto/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/eth-crypto/node_modules/secp256k1": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.1.tgz", + "integrity": "sha512-iGRjbGAKfXMqhtdkkuNxsgJQfJO8Oo78Rm7DAvsG3XKngq+nJIOGqrCSXcQqIVsmCj0wFanE5uTKFxV3T9j2wg==", + "hasInstallScript": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.0.0" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "devOptional": true + "node_modules/eth-crypto/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/eth-crypto/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" + "node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/eth-sig-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.1.tgz", + "integrity": "sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==", + "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.0" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/eth-sig-util/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/gaxios": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", - "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", - "optional": true, + "node_modules/ethereum-blockies-base64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereum-blockies-base64/-/ethereum-blockies-base64-1.0.2.tgz", + "integrity": "sha512-Vg2HTm7slcWNKaRhCUl/L3b4KrB8ohQXdd5Pu3OI897EcR6tVRvUqdTwAyx+dnmoDzj8e2bwBLDQ50ByFmcz6w==", "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, - "engines": { - "node": ">=10" + "pnglib": "0.0.1" } }, - "node_modules/gcp-metadata": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", - "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", - "optional": true, + "node_modules/ethereum-blockies-png": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-blockies-png/-/ethereum-blockies-png-0.1.3.tgz", + "integrity": "sha512-w20so1bo2dsCbfozOvkHBycS66OeI59buiBAwN+5ri6fdWIdNl1jKdKcYReizrp8NmidnlQZe04Gua5FUBm8wg==", "dependencies": { - "gaxios": "^2.1.0", - "json-bigint": "^0.3.0" - }, - "engines": { - "node": ">=8.10.0" + "parse-color": "^1.0.0", + "pngjs": "^3.2.0" } }, - "node_modules/gcp-metadata/node_modules/gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", - "optional": true, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, - "engines": { - "node": ">=8.10.0" + "js-sha3": "^0.8.0" } }, - "node_modules/gcs-resumable-upload": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz", - "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==", - "optional": true, + "node_modules/ethereum-checksum-address": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz", + "integrity": "sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ==", "dependencies": { - "abort-controller": "^3.0.0", - "configstore": "^5.0.0", - "gaxios": "^2.0.0", - "google-auth-library": "^5.0.0", - "pumpify": "^2.0.0", - "stream-events": "^1.0.4" + "keccak256": "^1.0.0", + "meow": "^5.0.0" }, "bin": { - "gcs-upload": "build/src/cli.js" - }, - "engines": { - "node": ">=8.10.0" + "ethereum_checksum_address": "bin/ethereum_checksum_address" } }, - "node_modules/gcs-resumable-upload/node_modules/gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", - "optional": true, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/ethereum-cryptography/node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=10.0.0" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "engines": { - "node": "*" - } + "node_modules/ethereum-cryptography/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "node_modules/ethereum-cryptography/node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", - "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/ethereum-public-key-to-address": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.2.tgz", + "integrity": "sha512-KRd0yrlbgESK3A62L4sHiJRk+b/UPX92Ehd0cCXWa5L7bQaq7z5q4BSRhuUuSZj++LQHQfJQQnJkskuHjDnbCQ==", "dependencies": { - "pump": "^3.0.0" + "ethereum-checksum-address": "0.0.2", + "keccak256": "^1.0.0", + "meow": "^5.0.0", + "secp256k1": "^3.7.1" }, - "engines": { - "node": ">=6" + "bin": { + "ethereum_public_key_to_address": "bin/ethereum_public_key_to_address" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/get-uri": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", - "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "node_modules/ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + }, + "node_modules/ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/get-uri/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/ethereumjs-util": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", + "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", "dependencies": { - "ms": "2.0.0" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^2.0.0", + "rlp": "^2.2.3", + "secp256k1": "^3.0.1" } }, - "node_modules/get-uri/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } }, - "node_modules/get-uri/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/get-uri/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, - "node_modules/get-uri/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/event-dispatch": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/event-dispatch/-/event-dispatch-0.4.1.tgz", + "integrity": "sha512-+nfoCngxvUdziP3Svtt7Iuqu3mKf0Tjoxez0V/ew4BtW2scu3tPVZF8i4Kw3SsVCH75XSWjfV0zC0MWh2GQEeA==", "dependencies": { - "assert-plus": "^1.0.0" + "fs": "0.0.2", + "path": "^0.11.14" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=0.4.x" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "dependencies": { - "ini": "^1.3.4" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/google-auth-library": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", - "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^2.1.0", - "gcp-metadata": "^3.4.0", - "gtoken": "^4.1.0", - "jws": "^4.0.0", - "lru-cache": "^5.0.0" - }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, "engines": { - "node": ">=8.10.0" + "node": ">= 0.8.0" } }, - "node_modules/google-auth-library/node_modules/gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", - "optional": true, - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" - }, + "node_modules/exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/google-gax": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.4.tgz", - "integrity": "sha512-Wzl43ueWEKNsLcMJ33sPps179nD7wn6Jcl/P+ZQNS+HxdCJcoQEgJe3AmulsJnatwjBE3pVPIE4HFJNhpRGvUw==", - "optional": true, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, "dependencies": { - "@grpc/grpc-js": "~1.3.6", - "@grpc/proto-loader": "^0.5.1", - "@types/fs-extra": "^8.0.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^3.6.0", - "google-auth-library": "^5.0.0", - "is-stream-ended": "^0.1.4", - "lodash.at": "^4.6.0", - "lodash.has": "^4.5.2", - "node-fetch": "^2.6.0", - "protobufjs": "^6.8.9", - "retry-request": "^4.0.0", - "semver": "^6.0.0", - "walkdir": "^0.4.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/google-gax/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/google-p12-pem": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.5.tgz", - "integrity": "sha512-7RLkxwSsMsYh9wQ5Vb2zRtkAHvqPvfoMGag+nugl1noYO7gf0844Yr9TIFA5NEBMAeVt2Z+Imu7CQMp3oNatzQ==", - "optional": true, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { - "node-forge": "^0.10.0" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/google-p12-pem/node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "optional": true, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.10.0" } }, - "node_modules/got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/got/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/got/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + "node": ">=0.10.0" } }, - "node_modules/graphql-request": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", - "integrity": "sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==", + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "dependencies": { - "cross-fetch": "^3.1.5", - "extract-files": "^9.0.0", - "form-data": "^3.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, - "peerDependencies": { - "graphql": "14 - 16" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { - "node": ">=4.x" + "node": ">=0.10.0" } }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/gtoken": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", - "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", - "optional": true, + "node_modules/expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, "dependencies": { - "gaxios": "^2.1.0", - "google-p12-pem": "^2.0.0", - "jws": "^4.0.0", - "mime": "^2.2.0" + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 6" } }, - "node_modules/gtoken/node_modules/gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", - "optional": true, + "node_modules/expect/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=4" } }, - "node_modules/hapi": { - "version": "17.8.5", - "resolved": "https://registry.npmjs.org/hapi/-/hapi-17.8.5.tgz", - "integrity": "sha512-+RnMWK/HI3VCvzfy0vO28YycMX19OiY8h9tYaDzjjOJ1eTh/HY2URvhFNkcqxZ1R1uoUdiB+pnjGi9e+vkaPEw==", - "deprecated": "This version contains severe security issues and defects and should not be used! Please upgrade to the latest version of @hapi/hapi or consider a commercial license (https://github.com/hapijs/hapi/issues/4114)", - "hasShrinkwrap": true, + "node_modules/expect/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "accept": "3.x.x", - "ammo": "3.x.x", - "boom": "7.x.x", - "bounce": "1.x.x", - "call": "5.x.x", - "catbox": "10.x.x", - "catbox-memory": "3.x.x", - "heavy": "6.x.x", - "hoek": "6.x.x", - "joi": "14.x.x", - "mimos": "4.x.x", - "podium": "3.x.x", - "shot": "4.x.x", - "somever": "2.x.x", - "statehood": "6.x.x", - "subtext": "6.x.x", - "teamwork": "3.x.x", - "topo": "3.x.x" + "color-name": "1.1.3" } }, - "node_modules/hapi/node_modules/accept": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/accept/-/accept-3.1.3.tgz", - "integrity": "sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==" - }, - "node_modules/hapi/node_modules/ammo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", - "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==" - }, - "node_modules/hapi/node_modules/b64": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", - "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", - "extraneous": true - }, - "node_modules/hapi/node_modules/big-time": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", - "integrity": "sha512-qtwYYoocwpiAxTXC5sIpB6nH5j6ckt+n/jhD7J5OEiFHnUZEFn0Xk8STUaE5s10LdazN/87bTDMe+fSihaW7Kg==", - "extraneous": true - }, - "node_modules/hapi/node_modules/boom": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", - "integrity": "sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A==" - }, - "node_modules/hapi/node_modules/bounce": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", - "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==" - }, - "node_modules/hapi/node_modules/bourne": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.1.tgz", - "integrity": "sha512-Ou0l3W8+n1FuTOoIfIrCk9oF9WVWc+9fKoAl67XQr9Ws0z7LgILRZ7qtc9xdT4BveSKtnYXfKPgn8pFAqeQRew==", - "extraneous": true - }, - "node_modules/hapi/node_modules/call": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/call/-/call-5.0.3.tgz", - "integrity": "sha512-eX16KHiAYXugbFu6VifstSdwH6aMuWWb4s0qvpq1nR1b+Sf+u68jjttg8ixDBEldPqBi30bDU35OJQWKeTLKxg==" - }, - "node_modules/hapi/node_modules/catbox": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/catbox/-/catbox-10.0.5.tgz", - "integrity": "sha512-5SpI/tEP3SiLE1qkkV+/hdVW48sHVBEbzPX4jBiwl6hsZh/gkl4bqfGLkvh7mjpMK5evJ0Rm/6NRlhF/Jsy9ow==" - }, - "node_modules/hapi/node_modules/catbox-memory": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.4.tgz", - "integrity": "sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g==" - }, - "node_modules/hapi/node_modules/content": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/content/-/content-4.0.6.tgz", - "integrity": "sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA==", - "extraneous": true - }, - "node_modules/hapi/node_modules/cryptiles": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", - "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", - "extraneous": true - }, - "node_modules/hapi/node_modules/heavy": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.2.tgz", - "integrity": "sha512-cJp884bqhiebNcEHydW0g6V1MUGYOXRPw9c7MFiHQnuGxtbWuSZpsbojwb2kxb3AA1/Rfs8CNiV9MMOF8pFRDg==" - }, - "node_modules/hapi/node_modules/hoek": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.1.tgz", - "integrity": "sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==" - }, - "node_modules/hapi/node_modules/iron": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/iron/-/iron-5.0.6.tgz", - "integrity": "sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw==", - "extraneous": true + "node_modules/expect/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/hapi/node_modules/joi": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/joi/-/joi-14.0.4.tgz", - "integrity": "sha512-KUXRcinDUMMbtlOk7YLGHQvG73dLyf8bmgE+6sBTkdJbZpeGVGAlPXEHLiQBV7KinD/VLD5OA0EUgoTTfbRAJQ==" + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } }, - "node_modules/hapi/node_modules/mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "extraneous": true + "node_modules/express-basic-auth": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz", + "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==", + "dependencies": { + "basic-auth": "^2.0.1" + } }, - "node_modules/hapi/node_modules/mimos": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.2.tgz", - "integrity": "sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA==" + "node_modules/express-jwt": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.3.tgz", + "integrity": "sha512-UdB8p5O8vGYTKm3SfREnLgVGIGEHcL3lrVyi3ebEX2qhMuagN623ju7ywWis+qYL+CXE7G1qPc2bCPBAg2MxZQ==", + "dependencies": { + "async": "^1.5.0", + "express-unless": "^0.3.0", + "jsonwebtoken": "^8.1.0", + "lodash.set": "^4.0.0" + }, + "engines": { + "node": ">= 0.4.0" + } }, - "node_modules/hapi/node_modules/nigel": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nigel/-/nigel-3.0.4.tgz", - "integrity": "sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ==", - "extraneous": true + "node_modules/express-jwt/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" }, - "node_modules/hapi/node_modules/pez": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pez/-/pez-4.0.5.tgz", - "integrity": "sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ==", - "extraneous": true + "node_modules/express-unless": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", + "integrity": "sha512-MPF0KbUOTUMvTQ8/1+bewiYGdCbSL4FvkuVNe2ydjZ0HE/Uq2+NPfKLb1vA5DbcvVPrrAg6GB0ULURUALzzgqw==" }, - "node_modules/hapi/node_modules/podium": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.5.tgz", - "integrity": "sha512-+fAPmAj3d5fWKx5oSjQKeBIcl46/qZnGLhzyi/dJ/HzNiOpuxyX/Y4091LiVxZQ4ALdf/LCS7siV6ai5nNLlOg==" + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "node_modules/hapi/node_modules/shot": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/shot/-/shot-4.0.7.tgz", - "integrity": "sha512-RKaKAGKxJ11EjJl0cf2fYVSsd4KB5Cncb9J0v7w+0iIaXpxNqFWTYNDNhBX7f0XSyDrjOH9a4OWZ9Gp/ZML+ew==" + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/hapi/node_modules/somever": { + "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/somever/-/somever-2.0.0.tgz", - "integrity": "sha512-9JaIPP+HxwYGqCDqqK3tRaTqdtQHoK6Qy3IrXhIt2q5x8fs8RcfU7BMWlFTCOgFazK8p88zIv1tHQXvAwtXMyw==" - }, - "node_modules/hapi/node_modules/statehood": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/statehood/-/statehood-6.0.9.tgz", - "integrity": "sha512-jbFg1+MYEqfC7ABAoWZoeF4cQUtp3LUvMDUGExL76cMmleBHG7I6xlZFsE8hRi7nEySIvutHmVlLmBe9+2R5LQ==" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/hapi/node_modules/subtext": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/subtext/-/subtext-6.0.12.tgz", - "integrity": "sha512-yT1wCDWVgqvL9BIkWzWqgj5spUSYo/Enu09iUV8t2ZvHcr2tKGTGg2kc9tUpVEsdhp1ihsZeTAiDqh0TQciTPQ==" + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/hapi/node_modules/teamwork": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teamwork/-/teamwork-3.0.2.tgz", - "integrity": "sha512-tpG01+9Qws/oGhMBiZN3BnB32gn5QeKY84AmLxxaCJw4mNeRzhEZ6jEj/vBhKerHD7Hgq9/vOZ58pyryYSn9gA==" + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } }, - "node_modules/hapi/node_modules/topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==" + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, - "node_modules/hapi/node_modules/vise": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vise/-/vise-3.0.1.tgz", - "integrity": "sha512-7BJNjsv2o83+E6AHAFSnjQF324UTgypsR/Sw/iFmLvr7RgJrEXF1xNBvb5LJfi+1FvWQXjJK4X41WMuHMeunPQ==", - "extraneous": true + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/hapi/node_modules/wreck": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-14.1.3.tgz", - "integrity": "sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw==", - "extraneous": true + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "peer": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { "node": ">=4" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "engines": { + "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jaydenseric" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "optional": true + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bser": "2.1.1" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/has-tostringtag": { + "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/filewatcher": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", + "integrity": "sha512-Fro8py2B8EJupSP37Kyd4kjKZLr+5ksFq7Vbw8A392Z15Unq8016SPUDvO/AsDj5V6bbPk98PTAinpc5YhPbJw==", + "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "debounce": "^1.0.0" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/has-unicode": { + "node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/firebase-admin": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.12.1.tgz", + "integrity": "sha512-DZ4Q7QQJYaO2BhnhZLrhL+mGRTCLS5WrxjbJtuKGmbKRBepwMhx++EQA5yhnGnIXgDHnp5SrZnVKygNdXtH8BQ==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "@firebase/database": "^0.6.0", + "@types/node": "^8.10.59", + "dicer": "^0.3.0", + "jsonwebtoken": "8.1.0", + "node-forge": "0.7.4" }, "engines": { - "node": ">=4" + "node": "^8.13.0 || >=10.10.0" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^3.0.0", + "@google-cloud/storage": "^4.1.2" + } + }, + "node_modules/firebase-admin/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/firebase-admin/node_modules/jsonwebtoken": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", + "integrity": "sha512-KGlASk0MhznKeyI16nTMla+f+Rn/w89tHPnpbRZuQfnTp221suG7FRAR/yY+FeadVSTn72WZsbqF4Yq/B583QA==", + "dependencies": { + "jws": "^3.1.4", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.0.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=0.12", + "npm": ">=1.4.28" } }, - "node_modules/hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", - "optional": true + "node_modules/firebase-admin/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/firebase-admin/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, "bin": { - "he": "bin/he" + "flat": "cli.js" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "peer": true, "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" } }, - "node_modules/hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==", - "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues." - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, + "peer": true, "dependencies": { - "whatwg-encoding": "^1.0.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/html-escaper": { + "node_modules/flatted": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true, + "peer": true }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.8" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dependencies": { - "agent-base": "4", - "debug": "3.1.0" - }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">= 4.5.0" + "node": "*" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "es6-promisify": "^5.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 6" } }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", "dependencies": { - "ms": "2.0.0" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 0.6" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "map-cache": "^0.2.2" }, "engines": { - "node": ">=10.19.0" + "node": ">=0.10.0" } }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha512-YAiVokMCrSIFZiroB1oz51hPiPRVcUtSa4x2U5RYXyhS9VAPdiFigKbPTnOSq7XY8wd3FIVPYmXpo5lMzFmxgg==" + }, + "node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dependencies": { - "agent-base": "6", - "debug": "4" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "ms": "2.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/human-interval": { + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-1.0.0.tgz", - "integrity": "sha512-SWPw3rD6/ocA0JnGePoXp5Zf5eILzsoL5vdWdLwtTuyrElyCpfQb0whIcxMdK/gAKNl2rFDGkPAbwI2KGZCvNA==" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "bindings": "^1.5.0", + "nan": "^2.12.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.0" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dependencies": { - "punycode": "2.1.0" + "readable-stream": "1.1.x", + "xregexp": "2.0.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4" + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, - "node_modules/image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", - "dependencies": { - "queue": "6.0.1" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "peer": true, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "devOptional": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.8.19" + "node": ">=8" } }, - "node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inert": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/inert/-/inert-5.1.3.tgz", - "integrity": "sha512-xLtqTOcJe+/RBaXkH0ZFai91SFj1a27ZXjFLLyiezLGhZCkBvMA+YGe6hNVVA678mb4EudKW35q1hATkxfUvMA==", - "deprecated": "This module has moved and is now available at @hapi/inert. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "ammo": "3.x.x", - "boom": "7.x.x", - "bounce": "1.x.x", - "hoek": "6.x.x", - "joi": "14.x.x", - "lru-cache": "4.1.x" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/inert/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/inert/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/gaxios": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", + "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", + "optional": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", "dev": true, + "optional": true, "peer": true, "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", "dev": true, + "optional": true, "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, + "node_modules/gcs-resumable-upload": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz", + "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==", + "deprecated": "gcs-resumable-upload is deprecated. Support will end on 11/01/2023", + "optional": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "gaxios": "^2.0.0", + "google-auth-library": "^5.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "bin": { + "gcs-upload": "build/src/cli.js" }, "engines": { - "node": ">=4" + "node": ">=8.10.0" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, + "node_modules/gcs-resumable-upload/node_modules/gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, "dependencies": { - "color-name": "1.1.3" + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "peer": true + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { - "has-flag": "^3.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", + "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/interface-datastore": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-6.1.1.tgz", - "integrity": "sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==", + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { - "interface-store": "^2.0.2", - "nanoid": "^3.0.2", - "uint8arrays": "^3.0.0" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/interface-store": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-2.0.2.tgz", - "integrity": "sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", "dependencies": { - "loose-envify": "^1.0.0" + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" } }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "node_modules/get-uri/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "engines": { - "node": ">=4" + "node_modules/get-uri/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/get-uri/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/get-uri/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/get-uri/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/ipfs-core-types": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.10.3.tgz", - "integrity": "sha512-GNid2lRBjR5qgScCglgk7w9Hk3TZAwPHQXxOLQx72wgyc0jF2U5NXRoKW0GRvX8NPbHmsrFszForIqxd23I1Gw==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "@ipld/dag-pb": "^2.1.3", - "interface-datastore": "^6.0.2", - "ipfs-unixfs": "^6.0.3", - "multiaddr": "^10.0.0", - "multiformats": "^9.5.1" + "assert-plus": "^1.0.0" } }, - "node_modules/ipfs-core-utils": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.14.3.tgz", - "integrity": "sha512-aBkewVhgAj3NWXPwu6imj0wADGiGVZmJzqKzODOJsibDjkx6FGdMv8kvvqtLnK8LS/dvSk9yk32IDtuDyYoV7Q==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "any-signal": "^3.0.0", - "blob-to-it": "^1.0.1", - "browser-readablestream-to-it": "^1.0.1", - "debug": "^4.1.1", - "err-code": "^3.0.1", - "ipfs-core-types": "^0.10.3", - "ipfs-unixfs": "^6.0.3", - "ipfs-utils": "^9.0.6", - "it-all": "^1.0.4", - "it-map": "^1.0.4", - "it-peekable": "^1.0.2", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "multiaddr": "^10.0.0", - "multiaddr-to-uri": "^8.0.0", - "multiformats": "^9.5.1", - "nanoid": "^3.1.23", - "parse-duration": "^1.0.0", - "timeout-abort-controller": "^3.0.0", - "uint8arrays": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ipfs-core-utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/ipfs-http-client": { - "version": "56.0.3", - "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-56.0.3.tgz", - "integrity": "sha512-E3L5ylVl6BjyRUsNehvfuRBYp1hj8vQ8in4zskVPMNzXs6JiCFUbif5a6BtcAlSK4xPQyJCeLNNAWLUeFQTLNA==", + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { - "@ipld/dag-cbor": "^7.0.0", - "@ipld/dag-json": "^8.0.1", - "@ipld/dag-pb": "^2.1.3", - "any-signal": "^3.0.0", - "dag-jose": "^1.0.0", - "debug": "^4.1.1", - "err-code": "^3.0.1", - "ipfs-core-types": "^0.10.3", - "ipfs-core-utils": "^0.14.3", - "ipfs-utils": "^9.0.6", - "it-first": "^1.0.6", - "it-last": "^1.0.4", - "merge-options": "^3.0.4", - "multiaddr": "^10.0.0", - "multiformats": "^9.5.1", - "parse-duration": "^1.0.0", - "stream-to-it": "^0.2.2", - "uint8arrays": "^3.0.0" + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dependencies": { + "ini": "^1.3.4" }, "engines": { - "node": ">=15.0.0", - "npm": ">=3.0.0" + "node": ">=4" } }, - "node_modules/ipfs-http-client/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dependencies": { - "ms": "2.1.2" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ipfs-unixfs": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz", - "integrity": "sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==", + "node_modules/google-auth-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", + "optional": true, "dependencies": { - "err-code": "^3.0.1", - "protobufjs": "^6.10.2" + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.4.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=8.10.0" } }, - "node_modules/ipfs-utils": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.7.tgz", - "integrity": "sha512-Umvb0Zydy2zZiTmQBGLfLISr8vOmXX8cxEIP+N8zGHrtRShG/j32yl1xd/BtS+Hbg0FIbVm3opwvxB2gmta0YA==", + "node_modules/google-auth-library/node_modules/gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, "dependencies": { - "any-signal": "^3.0.0", - "buffer": "^6.0.1", - "electron-fetch": "^1.7.2", - "err-code": "^3.0.1", - "is-electron": "^2.2.0", - "iso-url": "^1.1.5", - "it-glob": "^1.0.1", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "nanoid": "^3.1.20", - "native-fetch": "^3.0.0", - "node-fetch": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "react-native-fetch-api": "^2.0.0", - "stream-to-it": "^0.2.2" + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/ipfs-utils/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/google-auth-library/node_modules/gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "optional": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/ipfs-utils/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ipfs-utils/node_modules/node-fetch": { - "name": "@achingbrain/node-fetch", - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==", - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" + "node_modules/google-auth-library/node_modules/json-bigint": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", + "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", + "optional": true, + "dependencies": { + "bignumber.js": "^9.0.0" } }, - "node_modules/is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha512-7Kr05z5LkcOpoMvxHN1PC11WbPabdNFmMYYo0eZvWu3BfVS0T03yoqYDczoCBx17xqk2x1XAZrcKiFVL88jxlQ==", + "node_modules/google-gax": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.4.tgz", + "integrity": "sha512-Wzl43ueWEKNsLcMJ33sPps179nD7wn6Jcl/P+ZQNS+HxdCJcoQEgJe3AmulsJnatwjBE3pVPIE4HFJNhpRGvUw==", + "optional": true, "dependencies": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" + "@grpc/grpc-js": "~1.3.6", + "@grpc/proto-loader": "^0.5.1", + "@types/fs-extra": "^8.0.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^5.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.8.9", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + }, + "bin": { + "compileProtos": "build/tools/compileProtos.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.10.0" } }, - "node_modules/is-absolute/node_modules/is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "engines": { - "node": ">=0.10.0" + "node_modules/google-gax/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, + "node_modules/google-p12-pem": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.5.tgz", + "integrity": "sha512-7RLkxwSsMsYh9wQ5Vb2zRtkAHvqPvfoMGag+nugl1noYO7gf0844Yr9TIFA5NEBMAeVt2Z+Imu7CQMp3oNatzQ==", + "optional": true, "dependencies": { - "kind-of": "^6.0.0" + "node-forge": "^0.10.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.10.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "node_modules/google-p12-pem/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "optional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "has-bigints": "^1.0.1" + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", "dependencies": { - "binary-extensions": "^2.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "node_modules/got/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphql": { + "version": "16.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.0.tgz", + "integrity": "sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, + "node_modules/graphql-request": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-4.3.0.tgz", + "integrity": "sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==", "dependencies": { - "ci-info": "^2.0.0" + "cross-fetch": "^3.1.5", + "extract-files": "^9.0.0", + "form-data": "^3.0.0" }, - "bin": { - "is-ci": "bin.js" + "peerDependencies": { + "graphql": "14 - 16" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/graphql-request/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { - "has": "^1.0.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4.x" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "node_modules/gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "optional": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.10.0" } }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, + "node_modules/gtoken/node_modules/gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "optional": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.10.0" } }, - "node_modules/is-electron": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.1.tgz", - "integrity": "sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw==" - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "node_modules/hapi": { + "version": "17.8.5", + "resolved": "https://registry.npmjs.org/hapi/-/hapi-17.8.5.tgz", + "integrity": "sha512-+RnMWK/HI3VCvzfy0vO28YycMX19OiY8h9tYaDzjjOJ1eTh/HY2URvhFNkcqxZ1R1uoUdiB+pnjGi9e+vkaPEw==", + "deprecated": "This version contains severe security issues and defects and should not be used! Please upgrade to the latest version of @hapi/hapi or consider a commercial license (https://github.com/hapijs/hapi/issues/4114)", + "hasShrinkwrap": true, "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "accept": "3.x.x", + "ammo": "3.x.x", + "boom": "7.x.x", + "bounce": "1.x.x", + "call": "5.x.x", + "catbox": "10.x.x", + "catbox-memory": "3.x.x", + "heavy": "6.x.x", + "hoek": "6.x.x", + "joi": "14.x.x", + "mimos": "4.x.x", + "podium": "3.x.x", + "shot": "4.x.x", + "somever": "2.x.x", + "statehood": "6.x.x", + "subtext": "6.x.x", + "teamwork": "3.x.x", + "topo": "3.x.x" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/hapi/node_modules/accept": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/accept/-/accept-3.1.3.tgz", + "integrity": "sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==" }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/hapi/node_modules/ammo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", + "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==" }, - "node_modules/is-fullwidth-code-point": { + "node_modules/hapi/node_modules/b64": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", + "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/big-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", + "integrity": "sha512-qtwYYoocwpiAxTXC5sIpB6nH5j6ckt+n/jhD7J5OEiFHnUZEFn0Xk8STUaE5s10LdazN/87bTDMe+fSihaW7Kg==", + "extraneous": true + }, + "node_modules/hapi/node_modules/boom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", + "integrity": "sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A==" + }, + "node_modules/hapi/node_modules/bounce": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", + "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==" + }, + "node_modules/hapi/node_modules/bourne": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.1.tgz", + "integrity": "sha512-Ou0l3W8+n1FuTOoIfIrCk9oF9WVWc+9fKoAl67XQr9Ws0z7LgILRZ7qtc9xdT4BveSKtnYXfKPgn8pFAqeQRew==", + "extraneous": true + }, + "node_modules/hapi/node_modules/call": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/call/-/call-5.0.3.tgz", + "integrity": "sha512-eX16KHiAYXugbFu6VifstSdwH6aMuWWb4s0qvpq1nR1b+Sf+u68jjttg8ixDBEldPqBi30bDU35OJQWKeTLKxg==" + }, + "node_modules/hapi/node_modules/catbox": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/catbox/-/catbox-10.0.5.tgz", + "integrity": "sha512-5SpI/tEP3SiLE1qkkV+/hdVW48sHVBEbzPX4jBiwl6hsZh/gkl4bqfGLkvh7mjpMK5evJ0Rm/6NRlhF/Jsy9ow==" + }, + "node_modules/hapi/node_modules/catbox-memory": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.4.tgz", + "integrity": "sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g==" + }, + "node_modules/hapi/node_modules/content": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/content/-/content-4.0.6.tgz", + "integrity": "sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA==", + "extraneous": true + }, + "node_modules/hapi/node_modules/cryptiles": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", + "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", + "extraneous": true + }, + "node_modules/hapi/node_modules/heavy": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.2.tgz", + "integrity": "sha512-cJp884bqhiebNcEHydW0g6V1MUGYOXRPw9c7MFiHQnuGxtbWuSZpsbojwb2kxb3AA1/Rfs8CNiV9MMOF8pFRDg==" + }, + "node_modules/hapi/node_modules/hoek": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.1.tgz", + "integrity": "sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==" + }, + "node_modules/hapi/node_modules/iron": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/iron/-/iron-5.0.6.tgz", + "integrity": "sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw==", + "extraneous": true + }, + "node_modules/hapi/node_modules/joi": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-14.0.4.tgz", + "integrity": "sha512-KUXRcinDUMMbtlOk7YLGHQvG73dLyf8bmgE+6sBTkdJbZpeGVGAlPXEHLiQBV7KinD/VLD5OA0EUgoTTfbRAJQ==" + }, + "node_modules/hapi/node_modules/mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "extraneous": true + }, + "node_modules/hapi/node_modules/mimos": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.2.tgz", + "integrity": "sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA==" + }, + "node_modules/hapi/node_modules/nigel": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nigel/-/nigel-3.0.4.tgz", + "integrity": "sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/pez": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pez/-/pez-4.0.5.tgz", + "integrity": "sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/podium": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.5.tgz", + "integrity": "sha512-+fAPmAj3d5fWKx5oSjQKeBIcl46/qZnGLhzyi/dJ/HzNiOpuxyX/Y4091LiVxZQ4ALdf/LCS7siV6ai5nNLlOg==" + }, + "node_modules/hapi/node_modules/shot": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/shot/-/shot-4.0.7.tgz", + "integrity": "sha512-RKaKAGKxJ11EjJl0cf2fYVSsd4KB5Cncb9J0v7w+0iIaXpxNqFWTYNDNhBX7f0XSyDrjOH9a4OWZ9Gp/ZML+ew==" + }, + "node_modules/hapi/node_modules/somever": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } + "resolved": "https://registry.npmjs.org/somever/-/somever-2.0.0.tgz", + "integrity": "sha512-9JaIPP+HxwYGqCDqqK3tRaTqdtQHoK6Qy3IrXhIt2q5x8fs8RcfU7BMWlFTCOgFazK8p88zIv1tHQXvAwtXMyw==" }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "node_modules/hapi/node_modules/statehood": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/statehood/-/statehood-6.0.9.tgz", + "integrity": "sha512-jbFg1+MYEqfC7ABAoWZoeF4cQUtp3LUvMDUGExL76cMmleBHG7I6xlZFsE8hRi7nEySIvutHmVlLmBe9+2R5LQ==" }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/hapi/node_modules/subtext": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/subtext/-/subtext-6.0.12.tgz", + "integrity": "sha512-yT1wCDWVgqvL9BIkWzWqgj5spUSYo/Enu09iUV8t2ZvHcr2tKGTGg2kc9tUpVEsdhp1ihsZeTAiDqh0TQciTPQ==" }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/hapi/node_modules/teamwork": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teamwork/-/teamwork-3.0.2.tgz", + "integrity": "sha512-tpG01+9Qws/oGhMBiZN3BnB32gn5QeKY84AmLxxaCJw4mNeRzhEZ6jEj/vBhKerHD7Hgq9/vOZ58pyryYSn9gA==" + }, + "node_modules/hapi/node_modules/topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==" + }, + "node_modules/hapi/node_modules/vise": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vise/-/vise-3.0.1.tgz", + "integrity": "sha512-7BJNjsv2o83+E6AHAFSnjQF324UTgypsR/Sw/iFmLvr7RgJrEXF1xNBvb5LJfi+1FvWQXjJK4X41WMuHMeunPQ==", + "extraneous": true + }, + "node_modules/hapi/node_modules/wreck": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-14.1.3.tgz", + "integrity": "sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw==", + "extraneous": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "is-extglob": "^2.1.1" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=6" } }, - "node_modules/is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, - "node_modules/is-ip": { + "node_modules/has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", - "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dependencies": { - "ip-regex": "^2.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "get-intrinsic": "^1.1.1" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -11788,10 +9480,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -11799,44 +9491,56 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { + "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "dependencies": { "is-buffer": "^1.1.5" @@ -11845,420 +9549,608 @@ "node": ">=0.10.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "optional": true, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "node_modules/hash-stream-validation": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", + "optional": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "engines": { "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoek": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", + "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==", + "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues." + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/is-redirect": { + "node_modules/http-https": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "agent-base": "4", + "debug": "3.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4.5.0" } }, - "node_modules/is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha512-9AMzjRmLqcue629b4ezEVSK6kJsYJlUIhMcygmYORUgwUNJiavHcC3HkaGx0XYpyVKQSOqFbMEZmW42cY87sYw==", + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dependencies": { - "is-unc-path": "^0.1.1" + "es6-promisify": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "engines": { - "node": ">=0.10.0" + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { - "call-bind": "^1.0.2" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.19.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "optional": true - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { - "has-tostringtag": "^1.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "has-symbols": "^1.0.2" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "node_modules/human-interval": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-1.0.0.tgz", + "integrity": "sha512-SWPw3rD6/ocA0JnGePoXp5Zf5eILzsoL5vdWdLwtTuyrElyCpfQb0whIcxMdK/gAKNl2rFDGkPAbwI2KGZCvNA==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha512-HhLc5VDMH4pu3oMtIuunz/DFQUIoR561kMME3U3Afhj8b7vH085vkIkemrz1kLXCEIuoMAmO3yVmafWdSbGW8w==", + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dependencies": { - "unc-path-regex": "^0.1.0" + "punycode": "2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "dependencies": { + "queue": "6.0.1" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "optional": true, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "engines": { "node": ">=4" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "node_modules/inert": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/inert/-/inert-5.1.3.tgz", + "integrity": "sha512-xLtqTOcJe+/RBaXkH0ZFai91SFj1a27ZXjFLLyiezLGhZCkBvMA+YGe6hNVVA678mb4EudKW35q1hATkxfUvMA==", + "deprecated": "This module has moved and is now available at @hapi/inert. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "dependencies": { + "ammo": "3.x.x", + "boom": "7.x.x", + "bounce": "1.x.x", + "hoek": "6.x.x", + "joi": "14.x.x", + "lru-cache": "4.1.x" + } }, - "node_modules/isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "node_modules/inert/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dependencies": { - "punycode": "2.x.x" - }, - "engines": { - "node": ">=4.0.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "node_modules/inert/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "node_modules/iso-url": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", - "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", - "engines": { - "node": ">=12" - } + "node_modules/inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", + "engines": [ + "node >= 0.4.0" + ] }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, + "peer": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6" + "color-name": "1.1.3" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/inquirer/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "ansi-regex": "^4.1.0" }, "engines": { "node": ">=6" } }, - "node_modules/istanbul-lib-report/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/interface-datastore": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-6.1.1.tgz", + "integrity": "sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==", + "dependencies": { + "interface-store": "^2.0.2", + "nanoid": "^3.0.2", + "uint8arrays": "^3.0.0" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, + "node_modules/interface-store": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-2.0.2.tgz", + "integrity": "sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dependencies": { - "has-flag": "^3.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipfs-core-types": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.10.3.tgz", + "integrity": "sha512-GNid2lRBjR5qgScCglgk7w9Hk3TZAwPHQXxOLQx72wgyc0jF2U5NXRoKW0GRvX8NPbHmsrFszForIqxd23I1Gw==", + "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details", + "dependencies": { + "@ipld/dag-pb": "^2.1.3", + "interface-datastore": "^6.0.2", + "ipfs-unixfs": "^6.0.3", + "multiaddr": "^10.0.0", + "multiformats": "^9.5.1" + } + }, + "node_modules/ipfs-core-utils": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.14.3.tgz", + "integrity": "sha512-aBkewVhgAj3NWXPwu6imj0wADGiGVZmJzqKzODOJsibDjkx6FGdMv8kvvqtLnK8LS/dvSk9yk32IDtuDyYoV7Q==", + "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details", + "dependencies": { + "any-signal": "^3.0.0", + "blob-to-it": "^1.0.1", + "browser-readablestream-to-it": "^1.0.1", + "debug": "^4.1.1", + "err-code": "^3.0.1", + "ipfs-core-types": "^0.10.3", + "ipfs-unixfs": "^6.0.3", + "ipfs-utils": "^9.0.6", + "it-all": "^1.0.4", + "it-map": "^1.0.4", + "it-peekable": "^1.0.2", + "it-to-stream": "^1.0.0", + "merge-options": "^3.0.4", + "multiaddr": "^10.0.0", + "multiaddr-to-uri": "^8.0.0", + "multiformats": "^9.5.1", + "nanoid": "^3.1.23", + "parse-duration": "^1.0.0", + "timeout-abort-controller": "^3.0.0", + "uint8arrays": "^3.0.0" + } + }, + "node_modules/ipfs-core-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -12271,109 +10163,93 @@ } } }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, + "node_modules/ipfs-http-client": { + "version": "56.0.3", + "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-56.0.3.tgz", + "integrity": "sha512-E3L5ylVl6BjyRUsNehvfuRBYp1hj8vQ8in4zskVPMNzXs6JiCFUbif5a6BtcAlSK4xPQyJCeLNNAWLUeFQTLNA==", + "deprecated": "js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@ipld/dag-cbor": "^7.0.0", + "@ipld/dag-json": "^8.0.1", + "@ipld/dag-pb": "^2.1.3", + "any-signal": "^3.0.0", + "dag-jose": "^1.0.0", + "debug": "^4.1.1", + "err-code": "^3.0.1", + "ipfs-core-types": "^0.10.3", + "ipfs-core-utils": "^0.14.3", + "ipfs-utils": "^9.0.6", + "it-first": "^1.0.6", + "it-last": "^1.0.4", + "merge-options": "^3.0.4", + "multiaddr": "^10.0.0", + "multiformats": "^9.5.1", + "parse-duration": "^1.0.0", + "stream-to-it": "^0.2.2", + "uint8arrays": "^3.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=15.0.0", + "npm": ">=3.0.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, + "node_modules/ipfs-http-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "glob": "^7.1.3" + "ms": "2.1.2" }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, + "node_modules/ipfs-unixfs": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz", + "integrity": "sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==", "dependencies": { - "html-escaper": "^2.0.0" + "err-code": "^3.0.1", + "protobufjs": "^6.10.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/it-all": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", - "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" - }, - "node_modules/it-first": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", - "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" - }, - "node_modules/it-glob": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz", - "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==", - "dependencies": { - "@types/minimatch": "^3.0.4", - "minimatch": "^3.0.4" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/it-last": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-1.0.6.tgz", - "integrity": "sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==" - }, - "node_modules/it-map": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-1.0.6.tgz", - "integrity": "sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==" - }, - "node_modules/it-peekable": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-1.0.3.tgz", - "integrity": "sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==" - }, - "node_modules/it-to-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", - "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", + "node_modules/ipfs-utils": { + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.14.tgz", + "integrity": "sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==", "dependencies": { - "buffer": "^6.0.3", - "fast-fifo": "^1.0.0", - "get-iterator": "^1.0.2", - "p-defer": "^3.0.0", - "p-fifo": "^1.0.0", - "readable-stream": "^3.6.0" + "any-signal": "^3.0.0", + "browser-readablestream-to-it": "^1.0.0", + "buffer": "^6.0.1", + "electron-fetch": "^1.7.2", + "err-code": "^3.0.1", + "is-electron": "^2.2.0", + "iso-url": "^1.1.5", + "it-all": "^1.0.4", + "it-glob": "^1.0.1", + "it-to-stream": "^1.0.0", + "merge-options": "^3.0.4", + "nanoid": "^3.1.20", + "native-fetch": "^3.0.0", + "node-fetch": "^2.6.8", + "react-native-fetch-api": "^3.0.0", + "stream-to-it": "^0.2.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, - "node_modules/it-to-stream/node_modules/buffer": { + "node_modules/ipfs-utils/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", @@ -12396,7 +10272,7 @@ "ieee754": "^1.2.1" } }, - "node_modules/it-to-stream/node_modules/ieee754": { + "node_modules/ipfs-utils/node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", @@ -12415,538 +10291,725 @@ } ] }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "node_modules/is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha512-7Kr05z5LkcOpoMvxHN1PC11WbPabdNFmMYYo0eZvWu3BfVS0T03yoqYDczoCBx17xqk2x1XAZrcKiFVL88jxlQ==", + "dependencies": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute/node_modules/is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "bin": { - "jest": "bin/jest.js" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dependencies": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "dependencies": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "ci-info": "^2.0.0" }, "bin": { - "jest": "bin/jest.js" + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "kind-of": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "engines": { "node": ">=4" } }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dependencies": { - "has-flag": "^3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", "dependencies": { - "color-convert": "^1.9.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ip-regex": "^2.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dependencies": { - "color-name": "1.1.3" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/jest-config/node_modules/has-flag": { + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dependencies": { - "has-flag": "^3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", "dependencies": { - "color-convert": "^1.9.0" + "path-is-inside": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { - "color-name": "1.1.3" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha512-9AMzjRmLqcue629b4ezEVSK6kJsYJlUIhMcygmYORUgwUNJiavHcC3HkaGx0XYpyVKQSOqFbMEZmW42cY87sYw==", + "dependencies": { + "is-unc-path": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dependencies": { - "has-flag": "^3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dependencies": { - "detect-newline": "^2.1.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha512-HhLc5VDMH4pu3oMtIuunz/DFQUIoR561kMME3U3Afhj8b7vH085vkIkemrz1kLXCEIuoMAmO3yVmafWdSbGW8w==", "dependencies": { - "color-convert": "^1.9.0" + "unc-path-regex": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dependencies": { - "color-name": "1.1.3" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { "node": ">=4" } }, - "node_modules/jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" + "punycode": "2.x.x" }, "engines": { - "node": ">= 6" + "node": ">=4.0.0" } }, - "node_modules/jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iso-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", + "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, "engines": { - "node": ">= 6" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "node": ">=6" } }, - "node_modules/jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "node": ">=6" } }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { + "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -12955,258 +11018,304 @@ "node": ">=4" } }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "node_modules/istanbul-lib-report/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "dependencies": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "dependencies": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/istanbul-lib-source-maps/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=4" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "bin": { + "semver": "bin/semver" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "html-escaper": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/it-all": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz", + "integrity": "sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==" + }, + "node_modules/it-first": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", + "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" + }, + "node_modules/it-glob": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-1.0.2.tgz", + "integrity": "sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==", + "dependencies": { + "@types/minimatch": "^3.0.4", + "minimatch": "^3.0.4" + } + }, + "node_modules/it-last": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-1.0.6.tgz", + "integrity": "sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==" + }, + "node_modules/it-map": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-1.0.6.tgz", + "integrity": "sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==" + }, + "node_modules/it-peekable": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-1.0.3.tgz", + "integrity": "sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==" + }, + "node_modules/it-to-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", + "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "buffer": "^6.0.3", + "fast-fifo": "^1.0.0", + "get-iterator": "^1.0.2", + "p-defer": "^3.0.0", + "p-fifo": "^1.0.0", + "readable-stream": "^3.6.0" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/it-to-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "color-name": "1.1.3" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/it-to-stream/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dependencies": { - "has-flag": "^3.0.0" + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock": { + "node_modules/jest": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" }, - "peerDependencies": { - "jest-resolve": "*" + "bin": { + "jest": "bin/jest.js" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true, "engines": { "node": ">= 6" } }, - "node_modules/jest-resolve": { + "node_modules/jest-changed-files": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "dependencies": { "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "execa": "^1.0.0", + "throat": "^4.0.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-resolve-dependencies": { + "node_modules/jest-cli": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "dependencies": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { + "node_modules/jest-cli/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -13218,7 +11327,7 @@ "node": ">=4" } }, - "node_modules/jest-resolve/node_modules/chalk": { + "node_modules/jest-cli/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -13232,7 +11341,7 @@ "node": ">=4" } }, - "node_modules/jest-resolve/node_modules/color-convert": { + "node_modules/jest-cli/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -13241,13 +11350,13 @@ "color-name": "1.1.3" } }, - "node_modules/jest-resolve/node_modules/color-name": { + "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/jest-resolve/node_modules/has-flag": { + "node_modules/jest-cli/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -13256,7 +11365,7 @@ "node": ">=4" } }, - "node_modules/jest-resolve/node_modules/supports-color": { + "node_modules/jest-cli/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -13268,37 +11377,35 @@ "node": ">=4" } }, - "node_modules/jest-runner": { + "node_modules/jest-config": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-runner/node_modules/ansi-styles": { + "node_modules/jest-config/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -13310,7 +11417,7 @@ "node": ">=4" } }, - "node_modules/jest-runner/node_modules/chalk": { + "node_modules/jest-config/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -13324,7 +11431,7 @@ "node": ">=4" } }, - "node_modules/jest-runner/node_modules/color-convert": { + "node_modules/jest-config/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -13333,13 +11440,13 @@ "color-name": "1.1.3" } }, - "node_modules/jest-runner/node_modules/color-name": { + "node_modules/jest-config/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/jest-runner/node_modules/has-flag": { + "node_modules/jest-config/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -13348,7 +11455,7 @@ "node": ">=4" } }, - "node_modules/jest-runner/node_modules/supports-color": { + "node_modules/jest-config/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -13360,44 +11467,22 @@ "node": ">=4" } }, - "node_modules/jest-runtime": { + "node_modules/jest-diff": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { + "node_modules/jest-diff/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -13409,7 +11494,7 @@ "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/chalk": { + "node_modules/jest-diff/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -13423,7 +11508,7 @@ "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/color-convert": { + "node_modules/jest-diff/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -13432,13 +11517,13 @@ "color-name": "1.1.3" } }, - "node_modules/jest-runtime/node_modules/color-name": { + "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/jest-runtime/node_modules/has-flag": { + "node_modules/jest-diff/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -13447,7 +11532,7 @@ "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/supports-color": { + "node_modules/jest-diff/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -13459,40 +11544,35 @@ "node": ">=4" } }, - "node_modules/jest-serializer": { + "node_modules/jest-docblock": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, + "dependencies": { + "detect-newline": "^2.1.0" + }, "engines": { "node": ">= 6" } }, - "node_modules/jest-snapshot": { + "node_modules/jest-each": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0", "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { + "node_modules/jest-each/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -13504,7 +11584,7 @@ "node": ">=4" } }, - "node_modules/jest-snapshot/node_modules/chalk": { + "node_modules/jest-each/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -13518,7 +11598,7 @@ "node": ">=4" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { + "node_modules/jest-each/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -13527,13 +11607,13 @@ "color-name": "1.1.3" } }, - "node_modules/jest-snapshot/node_modules/color-name": { + "node_modules/jest-each/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/jest-snapshot/node_modules/has-flag": { + "node_modules/jest-each/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -13542,16 +11622,7 @@ "node": ">=4" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { + "node_modules/jest-each/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -13563,198 +11634,101 @@ "node": ">=4" } }, - "node_modules/jest-util": { + "node_modules/jest-environment-jsdom": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "dependencies": { - "@jest/console": "^24.9.0", + "@jest/environment": "^24.9.0", "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-util/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-validate": { + "node_modules/jest-environment-node": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "dependencies": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" }, "engines": { - "node": ">=4" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" + "node": ">= 6" }, - "engines": { - "node": ">=4" + "optionalDependencies": { + "fsevents": "^1.2.7" } }, - "node_modules/jest-watcher": { + "node_modules/jest-jasmine2": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", "@jest/test-result": "^24.9.0", "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "pretty-format": "^24.9.0", + "throat": "^4.0.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { + "node_modules/jest-jasmine2/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -13766,7 +11740,7 @@ "node": ">=4" } }, - "node_modules/jest-watcher/node_modules/chalk": { + "node_modules/jest-jasmine2/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -13780,7 +11754,7 @@ "node": ">=4" } }, - "node_modules/jest-watcher/node_modules/color-convert": { + "node_modules/jest-jasmine2/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -13789,13 +11763,13 @@ "color-name": "1.1.3" } }, - "node_modules/jest-watcher/node_modules/color-name": { + "node_modules/jest-jasmine2/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/jest-watcher/node_modules/has-flag": { + "node_modules/jest-jasmine2/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -13804,7 +11778,7 @@ "node": ">=4" } }, - "node_modules/jest-watcher/node_modules/supports-color": { + "node_modules/jest-jasmine2/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -13816,2491 +11790,2294 @@ "node": ">=4" } }, - "node_modules/jest-worker": { + "node_modules/jest-leak-detector": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/joi": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", - "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", - "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", - "dependencies": { - "hoek": "6.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, - "node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">= 6" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/jsdom/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/jsdom/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, - "node_modules/json-bigint": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", - "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", - "optional": true, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "bignumber.js": "^9.0.0" + "color-name": "1.1.3" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", - "integrity": "sha512-8XbSFFd43EG+1thjLNFIzCBlwXti0yKa7L+ak/f0T/pkC+31b7G41DXL/JzYpAoYWZ2eCPiu4IIqzijM8N0a/w==", - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "index.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/jspm-config": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jspm-config/-/jspm-config-0.3.4.tgz", - "integrity": "sha512-NuRJyYXOKLNoSPy+jYVt7LUbGmss/wgw2OjmtWrLx5bFxlIQ7Bvbeeo3U2tNHhzbewOikU5YZYS7uYNY/u651w==", - "dependencies": { - "any-promise": "^1.3.0", - "graceful-fs": "^4.1.4", - "make-error-cause": "^1.2.1", - "object.pick": "^1.1.2", - "parse-json": "^2.2.0", - "strip-bom": "^3.0.0", - "thenify": "^3.2.0", - "throat": "^3.0.0", - "xtend": "^4.0.1" + "node": ">=4" } }, - "node_modules/jspm-config/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "error-ex": "^1.2.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/jspm-config/node_modules/throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" }, "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" + "node": ">= 6" } }, - "node_modules/kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" - }, - "node_modules/keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "hasInstallScript": true, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=5.12.0" - } - }, - "node_modules/keccak256": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", - "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", - "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "node_modules/keccak256/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/keccak256/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "node": ">=4" } }, - "node_modules/keccak256/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/keccak256/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "hasInstallScript": true, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/keccak256/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "color-name": "1.1.3" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "package-json": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "deprecated": "use String.prototype.padStart()", - "dev": true + "node_modules/jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "node_modules/listify": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", - "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==", - "engines": { - "node": ">= 0.4" + "node_modules/jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "signal-exit": "^3.0.2" + "color-name": "1.1.3" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.at": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", - "integrity": "sha512-GOTh0SEp+Yosnlpjic+8cl2WM9MykorogkGA9xyIFkkObQ3H3kNZqZ+ohuq4K3FrSVo7hMcZBMataJemrxC3BA==", - "optional": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "node_modules/lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==", - "optional": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==", + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha512-4vSow8gbiGnwdDNrpy1dyNaXWKSCIPop0EHdE8GrnngHoJujM3QhvHUN/igsYCgPoHo7pFOezlJ61Hlln0KHyA==", + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", + "node_modules/jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, "dependencies": { - "restore-cursor": "^1.0.1" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/log-update/node_modules/onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", + "node_modules/jest-runner/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/logform": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", - "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "node_modules/jest-runner/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "@colors/colors": "1.5.0", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "color-name": "1.1.3" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" + "node_modules/jest-runner/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/jest-runner/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "has-flag": "^3.0.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=4" } }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "node_modules/jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/jest-runtime/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "yallist": "^3.0.2" + "color-name": "1.1.3" } }, - "node_modules/luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==", + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/mailgun-js": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.22.0.tgz", - "integrity": "sha512-a2alg5nuTZA9Psa1pSEIEsbxr1Zrmqx4VkgGCQ30xVh0kIH7Bu57AYILo+0v8QLSdXtCyLaS+KVmdCrQo0uWFA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "async": "^2.6.1", - "debug": "^4.1.0", - "form-data": "^2.3.3", - "inflection": "~1.12.0", - "is-stream": "^1.1.0", - "path-proxy": "~1.0.0", - "promisify-call": "^2.0.2", - "proxy-agent": "^3.0.3", - "tsscmp": "^1.0.6" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/mailgun-js/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/mailgun-js/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.12" + "node": ">=4" } }, - "node_modules/mailgun-js/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "semver": "^6.0.0" - }, + "color-name": "1.1.3" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha512-4TO2Y3HkBnis4c0dxhAgD/jprySYLACf7nwN6V0HAHDx59g12WlRpUmFy1bRHamjGUEEBrEvCq6SUpsEE2lhUg==", + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "make-error": "^1.2.0" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "dependencies": { - "tmpl": "1.0.5" + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "node_modules/jest-util/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "node_modules/jest-util/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "object-visit": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/jest-util/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "color-name": "1.1.3" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/jest-util/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">= 0.10.0" + "node": ">=4" } }, - "node_modules/meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "node_modules/jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, "dependencies": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "is-plain-obj": "^2.1.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "node_modules/jest-validate/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "node_modules/jest-validate/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "color-name": "1.1.3" } }, - "node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/jest-validate/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/jest-validate/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "optional": true, - "bin": { - "mime": "cli.js" + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "mime-db": "1.52.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "optional": true, - "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { "node": ">=4" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "dom-walk": "^0.1.0" + "color-name": "1.1.3" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/jest-worker/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==", "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6.0" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/joi": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", + "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", + "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "hoek": "6.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" } }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "dependencies": { - "mkdirp": "*" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" } }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/jsdom/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/jsdom/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/jsdom/node_modules/ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "async-limiter": "~1.0.0" } }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "dependencies": { - "ms": "2.1.2" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=4" } }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "peer": true }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha512-8XbSFFd43EG+1thjLNFIzCBlwXti0yKa7L+ak/f0T/pkC+31b7G41DXL/JzYpAoYWZ2eCPiu4IIqzijM8N0a/w==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "index.js" }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", "dependencies": { - "brace-expansion": "^1.1.7" + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" }, "engines": { - "node": "*" + "node": ">=4", + "npm": ">=1.4.28" } }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dependencies": { - "argparse": "^2.0.1" - }, + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { - "js-yaml": "bin/js-yaml.js" + "semver": "bin/semver" } }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/jspm-config": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/jspm-config/-/jspm-config-0.3.4.tgz", + "integrity": "sha512-NuRJyYXOKLNoSPy+jYVt7LUbGmss/wgw2OjmtWrLx5bFxlIQ7Bvbeeo3U2tNHhzbewOikU5YZYS7uYNY/u651w==", "dependencies": { - "p-locate": "^5.0.0" + "any-promise": "^1.3.0", + "graceful-fs": "^4.1.4", + "make-error-cause": "^1.2.1", + "object.pick": "^1.1.2", + "parse-json": "^2.2.0", + "strip-bom": "^3.0.0", + "thenify": "^3.2.0", + "throat": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "node_modules/jspm-config/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, + "node_modules/jspm-config/node_modules/throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { - "brace-expansion": "^1.1.7" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=10" + "node": ">=0.6.0" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } }, - "node_modules/mocha/node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "node_modules/keccak": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", + "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "inherits": "^2.0.4", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=5.12.0" + } + }, + "node_modules/keccak256": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", + "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", + "dependencies": { + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" + } + }, + "node_modules/keccak256/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/keccak256/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/keccak256/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/keccak256/node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, "dependencies": { - "yocto-queue": "^0.1.0" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.0.0" } }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/keccak256/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "json-buffer": "3.0.1" } }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", "dependencies": { - "ansi-regex": "^5.0.1" + "package-json": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()", + "dev": true }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=6" } }, - "node_modules/mocha/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.8.0" } }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/listify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.3.tgz", + "integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "dependencies": { + "signal-exit": "^3.0.2" } }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } + "node_modules/lodash.at": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", + "integrity": "sha512-GOTh0SEp+Yosnlpjic+8cl2WM9MykorogkGA9xyIFkkObQ3H3kNZqZ+ohuq4K3FrSVo7hMcZBMataJemrxC3BA==", + "optional": true }, - "node_modules/moment-timezone": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", - "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "optional": true }, - "node_modules/mongodb": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz", - "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==", - "dev": true, - "dependencies": { - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=12.9.0" - }, - "optionalDependencies": { - "@aws-sdk/credential-providers": "^3.186.0", - "saslprep": "^1.0.3" - } + "node_modules/lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==", + "optional": true }, - "node_modules/mongodb-connection-string-url": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", - "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", - "dev": true, - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, - "node_modules/mongodb-connection-string-url/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, - "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, - "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, - "node_modules/mongoose": { - "version": "5.13.15", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz", - "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==", - "dependencies": { - "@types/bson": "1.x || 4.0.x", - "@types/mongodb": "^3.5.27", - "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.7.3", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", - "ms": "2.1.2", - "optional-require": "1.0.x", - "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", - "sift": "13.5.2", - "sliced": "1.0.1" - }, - "engines": { - "node": ">=4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, - "node_modules/mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", - "peerDependencies": { - "mongoose": "*" - } + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, - "node_modules/mongoose/node_modules/@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true }, - "node_modules/mongoose/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, - "node_modules/mongoose/node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } + "node_modules/lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==" }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mongoose/node_modules/mongodb/node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "node_modules/log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha512-4vSow8gbiGnwdDNrpy1dyNaXWKSCIPop0EHdE8GrnngHoJujM3QhvHUN/igsYCgPoHo7pFOezlJ61Hlln0KHyA==", "dependencies": { - "require-at": "^1.0.6" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node": ">=0.10.0" } }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", "dependencies": { - "ee-first": "1.1.1" + "restore-cursor": "^1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "node_modules/log-update/node_modules/onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "node_modules/log-update/node_modules/restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", "dependencies": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } - }, - "node_modules/mquery/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + }, + "node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "dependencies": { - "ms": "2.0.0" + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" } }, - "node_modules/mquery/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "node_modules/mquery/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.10.0" } }, - "node_modules/multer/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "get-func-name": "^2.0.0" } }, - "node_modules/multer/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "yallist": "^3.0.2" } }, - "node_modules/multer/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/luxon": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", + "engines": { + "node": ">=12" + } }, - "node_modules/multer/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/mailgun-js": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.22.0.tgz", + "integrity": "sha512-a2alg5nuTZA9Psa1pSEIEsbxr1Zrmqx4VkgGCQ30xVh0kIH7Bu57AYILo+0v8QLSdXtCyLaS+KVmdCrQo0uWFA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { - "safe-buffer": "~5.1.0" + "async": "^2.6.1", + "debug": "^4.1.0", + "form-data": "^2.3.3", + "inflection": "~1.12.0", + "is-stream": "^1.1.0", + "path-proxy": "~1.0.0", + "promisify-call": "^2.0.2", + "proxy-agent": "^3.0.3", + "tsscmp": "^1.0.6" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/multiaddr": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-10.0.1.tgz", - "integrity": "sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==", + "node_modules/mailgun-js/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "dns-over-http-resolver": "^1.2.3", - "err-code": "^3.0.1", - "is-ip": "^3.1.0", - "multiformats": "^9.4.5", - "uint8arrays": "^3.0.0", - "varint": "^6.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/multiaddr-to-uri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz", - "integrity": "sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==", + "node_modules/mailgun-js/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dependencies": { - "multiaddr": "^10.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "node_modules/multiaddr/node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "node_modules/mailgun-js/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/multiaddr/node_modules/is-ip": { + "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "ip-regex": "^4.0.0" + "semver": "^6.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha512-4TO2Y3HkBnis4c0dxhAgD/jprySYLACf7nwN6V0HAHDx59g12WlRpUmFy1bRHamjGUEEBrEvCq6SUpsEE2lhUg==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "make-error": "^1.2.0" } }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, "dependencies": { - "varint": "^5.0.0" + "tmpl": "1.0.5" } }, - "node_modules/multicodec/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "engines": { + "node": ">=4" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true, - "peer": true - }, - "node_modules/mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "dependencies": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, - "node_modules/mysql/node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "devOptional": true + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "engines": { - "node": "*" + "node": ">= 0.10.0" } }, - "node_modules/mysql/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/mysql/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "node_modules/mysql/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", "dependencies": { - "safe-buffer": "~5.1.0" + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, - "node_modules/nano-ipfs-store": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/nano-ipfs-store/-/nano-ipfs-store-0.1.3.tgz", - "integrity": "sha512-QlFPtHXBWzysxVL5HlefyjNpRFfZh24VoQ1XxeHfYc+M9s/y0QBEzsQlWio0GHQaKp1lDJagATwwZfKFq3NwXA==", + "node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "dependencies": { - "nano-sha256": "^0.1.2", - "xmlhttprequest": "^1.8.0" + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/nano-sha256": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-sha256/-/nano-sha256-0.1.2.tgz", - "integrity": "sha512-O84Y3Qx6UPRNGSApxHQ2xtp3xHOOhYK99JQaJ2phanHIA/JTIEJLvzV6bUwzVz2k3nFwEOfaqzgpUH8QME1BzA==" + "node_modules/method-override/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.6" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", + "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/native-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", - "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", - "peerDependencies": { - "node-fetch": "*" + "node": ">= 0.6" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "optional": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==", + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { - "node": ">= 0.4.0" + "node": ">=4" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/node-addon-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, - "node_modules/node-docker-api": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", - "integrity": "sha512-8xfOiuLDJQw+l58i66lUNQhRhS5fAExqQbLolmyqMucrsDON7k7eLMIHphcBwwB7utwCHCQkcp73gSAmzSiAiw==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "docker-modem": "^0.3.1", - "memorystream": "^0.3.1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dependencies": { - "whatwg-url": "^5.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 4" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/node-fetch/node_modules/whatwg-url": { + "node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" } }, - "node_modules/node-forge": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", - "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, "engines": { - "node": "*" + "node": ">= 8" } }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, - "node_modules/node-schedule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.2.tgz", - "integrity": "sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==", + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", "dependencies": { - "cron-parser": "^2.7.3", - "long-timeout": "0.1.1", - "sorted-array-functions": "^1.0.0" + "mkdirp": "*" + }, + "engines": { + "node": ">=4" } }, - "node_modules/nodemon": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", - "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "bin": { - "nodemon": "bin/nodemon.js" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">=8.10.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "url": "https://opencollective.com/mochajs" } }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-package-data/node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/mocha/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { "node": ">=10" }, @@ -16308,1378 +14085,1539 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, "dependencies": { - "path-key": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - }, - "node_modules/nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/mocha/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "dependencies": { + "moment": "^2.29.4" + }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "node_modules/mongodb": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.0.0.tgz", + "integrity": "sha512-wUIYesF4DTyDccm0noE5TwGi9ISdXUAi9T2cQ4xPc+EUBZG44bfMVt2ecOG5Ypca7eCz3oRpJm6YI6c7jAnuNw==", "dev": true, "dependencies": { - "isobject": "^3.0.0" + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.0.0", + "mongodb-connection-string-url": "^2.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "punycode": "^2.1.1" }, "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dependencies": { - "isobject": "^3.0.1" - }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, "dependencies": { - "http-https": "^1.0.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/mongoose": { + "version": "5.13.20", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz", + "integrity": "sha512-TjGFa/XnJYt+wLmn8y9ssjyO2OhBMeEBtOHb9iJM16EWu2Du6L1Q6zSiEK2ziyYQM8agb4tumNIQFzqbxId7MA==", "dependencies": { - "ee-first": "1.1.1" + "@types/bson": "1.x || 4.0.x", + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.7.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.4", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" } }, - "node_modules/on-headers": { + "node_modules/mongoose-legacy-pluralize": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "peerDependencies": { + "mongoose": "*" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/mongoose/node_modules/@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", "dependencies": { - "wrappy": "1" + "@types/bson": "*", + "@types/node": "*" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" + "node_modules/mongoose/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "optional": true, + "node_modules/mongoose/node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", "dependencies": { - "mimic-fn": "^2.1.0" + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" }, "engines": { - "node": ">=6" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } } }, - "node_modules/openpgp": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.5.0.tgz", - "integrity": "sha512-SpwcJnxrK9Y0HRM6KxSFqkAEOSWEabCH/c8dII/+y2e5f6KvuDG5ZE7JXaPBaVJNE4VUZZeTphxXDoZD0KOHrw==", + "node_modules/mongoose/node_modules/mongodb/node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", "dependencies": { - "asn1.js": "^5.0.0" + "require-at": "^1.0.6" }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", "engines": { "node": ">=4" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "node_modules/mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha512-J/e9xiZZQNrt+958FFzJ+auItsBGq+UrQ7nE89AUP7UOTtjHnkISANXLdayhVzh538UnLMCSlf13lFfRIAKQOA==", - "dev": true, + "node_modules/mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", "dependencies": { - "p-reduce": "^1.0.0" + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "node_modules/p-fifo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", - "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { - "fast-fifo": "^1.0.0", - "p-defer": "^3.0.0" + "ms": "2.0.0" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } + "node_modules/mquery/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/mquery/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", "dependencies": { - "p-limit": "^2.0.0" + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">= 6.0.0" } }, - "node_modules/p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/multer/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "devOptional": true, - "engines": { - "node": ">=6" + "node_modules/multer/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/pac-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", - "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "node_modules/multer/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/multer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "agent-base": "^4.2.0", - "debug": "^4.1.1", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" + "safe-buffer": "~5.1.0" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "node_modules/multiaddr": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-10.0.1.tgz", + "integrity": "sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==", + "deprecated": "This module is deprecated, please upgrade to @multiformats/multiaddr", "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" + "dns-over-http-resolver": "^1.2.3", + "err-code": "^3.0.1", + "is-ip": "^3.1.0", + "multiformats": "^9.4.5", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" } }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/multiaddr-to-uri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz", + "integrity": "sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==", + "deprecated": "This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri", "dependencies": { - "ms": "2.1.2" - }, + "multiaddr": "^10.0.0" + } + }, + "node_modules/multiaddr/node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "node_modules/multiaddr/node_modules/is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "ip-regex": "^4.0.0" }, "engines": { - "node": ">= 4.5.0" + "node": ">=8" } }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "ms": "^2.1.1" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=4" + "varint": "^5.0.0" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + "node_modules/multicodec/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "color-convert": "~0.5.0" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/parse-color/node_modules/color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==" - }, - "node_modules/parse-duration": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.0.2.tgz", - "integrity": "sha512-Dg27N6mfok+ow1a2rj/nRjtCfaKrHUZV2SJpEn/s8GaVUSlf4GGRCRP1c13Hj+wfPKVMrFDqLMLITkYKgKxyyg==" + "node_modules/multihashes/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true, + "peer": true }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/mysql/node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", "engines": { - "node": ">= 0.8" + "node": "*" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/mysql/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/path": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", - "integrity": "sha512-CzEXTDgcEfa0yqMe+DJCSbEB5YCv4JZoic5xulBNFF2ifIMjNrTWbNSPNhgKfSo0MjneGIx9RLy4pCFuZPaMSQ==" + "node_modules/mysql/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" + "node_modules/mysql/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "node_modules/nano-ipfs-store": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/nano-ipfs-store/-/nano-ipfs-store-0.1.3.tgz", + "integrity": "sha512-QlFPtHXBWzysxVL5HlefyjNpRFfZh24VoQ1XxeHfYc+M9s/y0QBEzsQlWio0GHQaKp1lDJagATwwZfKFq3NwXA==", + "dependencies": { + "nano-sha256": "^0.1.2", + "xmlhttprequest": "^1.8.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/nano-sha256": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-sha256/-/nano-sha256-0.1.2.tgz", + "integrity": "sha512-O84Y3Qx6UPRNGSApxHQ2xtp3xHOOhYK99JQaJ2phanHIA/JTIEJLvzV6bUwzVz2k3nFwEOfaqzgpUH8QME1BzA==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-proxy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", - "integrity": "sha512-p9IuY9FRY1nU59RDW+tnLL6qMxmBnY03WGYxzy1FcqE5OMO5ggz7ahmOBH0JBS+9f95Yc7V5TZ+kHpTeFWaLQA==", + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "dependencies": { - "inflection": "~1.3.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/path-proxy/node_modules/inflection": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", - "integrity": "sha512-xRvG6XhAkbneGO5BXP0uKyGkzmZ2bBbrFkx4ZVNx2TmsECbiq/pJapbbx/NECh+E85IfZwW5+IeVNJfkQgavag==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { + "node_modules/native-fetch": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", + "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", + "peerDependencies": { + "node-fetch": "*" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, + "node_modules/netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==", "engines": { - "node": ">=0.12" + "node": ">= 0.4.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/pg": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", - "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-docker-api": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", + "integrity": "sha512-8xfOiuLDJQw+l58i66lUNQhRhS5fAExqQbLolmyqMucrsDON7k7eLMIHphcBwwB7utwCHCQkcp73gSAmzSiAiw==", "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.5.2", - "pg-protocol": "^1.5.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "docker-modem": "^0.3.1", + "memorystream": "^0.3.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">= 8.0.0" + "node": "4.x || >=6.0.0" }, "peerDependencies": { - "pg-native": ">=3.0.1" + "encoding": "^0.1.0" }, "peerDependenciesMeta": { - "pg-native": { + "encoding": { "optional": true } } }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/pg-minify": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.2.tgz", - "integrity": "sha512-1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg==", - "engines": { - "node": ">=8.0" + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/pg-pool": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", - "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", - "peerDependencies": { - "pg": ">=8.0" + "node_modules/node-forge": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", + "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==", + "engines": { + "node": "*" } }, - "node_modules/pg-promise": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.12.1.tgz", - "integrity": "sha512-SiJkBUDGq7PNfJFJbWferodsSH+vLrhte0Q0kVgQbwlNYeKmp9Hhkr+357+5DWEuBGOHhSu1UQffSSf5HVqRtA==", - "dependencies": { - "assert-options": "0.7.0", - "pg": "8.8.0", - "pg-minify": "1.6.2", - "spex": "3.2.0" - }, - "engines": { - "node": ">=12.0" + "node_modules/node-gyp-build": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "node_modules/node-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/node-schedule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.2.tgz", + "integrity": "sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==", "dependencies": { - "split2": "^4.1.0" + "cron-parser": "^2.7.3", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.0.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, "engines": { - "node": ">=8.6" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/pify": { + "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { - "find-up": "^3.0.0" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { "node": ">=6" } }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/normalize-package-data/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dependencies": { - "locate-path": "^2.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "remove-trailing-separator": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dependencies": { - "p-limit": "^1.1.0" + "path-key": "^2.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "engines": { - "node": ">=4.0.0" + "node": "*" } }, - "node_modules/pnglib": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pnglib/-/pnglib-0.0.1.tgz", - "integrity": "sha512-95ChzOoYLOPIyVmL+Y6X+abKGXUJlvOVLkB1QQkyXl7Uczc6FElUy/x01NS7r2GX6GRezloO/ecCX9h4U9KadA==" + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/popsicle": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-9.2.0.tgz", - "integrity": "sha512-petRj39w05GvH1WKuGFmzxR9+k+R9E7zX5XWTFee7P/qf88hMuLT7aAO/RsmldpQMtJsWQISkTQlfMRECKlxhw==", + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, "dependencies": { - "concat-stream": "^1.4.7", - "form-data": "^2.0.0", - "make-error-cause": "^1.2.1", - "tough-cookie": "^2.0.0" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/popsicle-proxy-agent/-/popsicle-proxy-agent-3.0.0.tgz", - "integrity": "sha512-+0MhWUYhHbBWWIdKT4sO5cwgEMXPDskC3mGpgiCMLUdJt3mV3OuEFXubSjsiF4UDuiK6XNEst8oasZe9ZCUs8Q==", - "deprecated": "Use `agent` option with `popsicle` directly", + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { - "http-proxy-agent": "^1.0.0", - "https-proxy-agent": "^1.0.0" + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent/node_modules/agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha512-oDtZV740o3fr5oJtPLOsgH2hl2TRPscNXIx4VzzBwVlXVkv8RHm7XXqGAYg8t20+Gwu6LNDnx8HRMGqVGPZ8Vw==", + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, "dependencies": { - "extend": "~3.0.0", - "semver": "~5.0.1" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent/node_modules/http-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "integrity": "sha512-6YMslTZtuupu4irnNBi1bM6dG0UqHBHqObHQn3awavmNXe9CGkmw7KZ68EyAnJk3yBlLpbLwux5+bY1lneDFmg==", + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "dependencies": { - "agent-base": "2", - "debug": "2", - "extend": "3" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent/node_modules/https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha512-OZhm7//JDnQthMVqlPAfkZyPO2fMhfHY6gY+jZcX8rLfFiGtHiIQrfD80WvCDHNMQ77Ak3r5CiPRDD2rNzo2OQ==", + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { - "agent-base": "2", - "debug": "2", - "extend": "3" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle-proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } }, - "node_modules/popsicle-proxy-agent/node_modules/semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==", - "bin": { - "semver": "bin/semver" + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/popsicle-retry": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/popsicle-retry/-/popsicle-retry-3.2.1.tgz", - "integrity": "sha512-AOKZJrHLXZMaMQtQcQW03tDZSgknkFOdoeAv5YuXuE1HqJH3D1oobHYmVIIjmdyBdHsqBnCX1inq2lRX1zocxQ==", + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "optional": true, "dependencies": { - "any-promise": "^1.1.0", - "xtend": "^4.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/popsicle-rewrite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-rewrite/-/popsicle-rewrite-1.0.0.tgz", - "integrity": "sha512-ySNEf50wDXcSr89LCsAb00dYItQ/Cnisb1aGleYFnc69pmSzFDB090pDvLwptgWWaokvFDiLCAjUWRWZyZku/w==" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/popsicle-status": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/popsicle-status/-/popsicle-status-2.0.1.tgz", - "integrity": "sha512-jMzDnC9xEmyF624Fq4kfjWkFZuK4fOiCHKtr9MthCwpmQXRT+Eck1yEXbRwOEoS9qEWQGbi3THsBfC1Bzk7R/A==" + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/popsicle/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/popsicle/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/popsicle/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/popsicle/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/popsicle/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dependencies": { - "safe-buffer": "~5.1.0" + "http-https": "^1.0.0" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/postgres-bytea": { + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "optional": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/openpgp": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.10.1.tgz", + "integrity": "sha512-SR5Ft+ej51d0+p53ld5Ney0Yiz0y8Mh1YYLJrvpRMbTaNhvS1QcDX0Oq1rW9sjBnQXtgrpWw2Zve3rm7K5C/pw==", "dependencies": { - "xtend": "^4.0.0" + "asn1.js": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.0.0" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", "engines": { - "node": ">= 0.8.0" + "node": ">=4" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, + "peer": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, + "node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha512-J/e9xiZZQNrt+958FFzJ+auItsBGq+UrQ7nE89AUP7UOTtjHnkISANXLdayhVzh538UnLMCSlf13lFfRIAKQOA==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "p-reduce": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/p-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", + "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" + "fast-fifo": "^1.0.0", + "p-defer": "^3.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "peer": true, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/promise-finally": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-3.0.1.tgz", - "integrity": "sha512-hsF8r05ZnypT00IZTC71Ejiu9A7kyyVfHpdl3faasOHNJX62sNPfE8vDAz6P27RJ31i2O5ruhc6JV5xWR6GElQ==" - }, - "node_modules/promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "devOptional": true, "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/promisify-call": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", - "integrity": "sha512-ZX68J1+1Pe0I8NC0P6Ji3fDDcJceVfpoygfDLgdb1fp5vW9IRlwSpDaxe1T5HgwchyHV2DsL/pWzWikUiWEbLQ==", + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "dependencies": { - "with-callback": "^1.0.2" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, "engines": { - "node": ">= 6" - } - }, - "node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "node": ">=4" } }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "18.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.8.tgz", - "integrity": "sha512-uGwPWlE0Hj972KkHtCDVwZ8O39GmyjfMane1Z3GUBGGnkZ2USDq7SxLpVIiIHpweY9DS0QTDH0Nw7RNBsAAZ5A==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "devOptional": true, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/proxy-agent": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", - "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "node_modules/pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", "dependencies": { "agent-base": "^4.2.0", - "debug": "4", + "debug": "^4.1.1", + "get-uri": "^2.0.0", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^3.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^3.0.1", - "proxy-from-env": "^1.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", "socks-proxy-agent": "^4.0.1" - }, - "engines": { - "node": ">=6" } }, - "node_modules/proxy-agent/node_modules/agent-base": { + "node_modules/pac-proxy-agent/node_modules/agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", @@ -17690,7 +15628,7 @@ "node": ">= 4.0.0" } }, - "node_modules/proxy-agent/node_modules/debug": { + "node_modules/pac-proxy-agent/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -17706,7 +15644,7 @@ } } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", @@ -17718,7 +15656,7 @@ "node": ">= 4.5.0" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent/node_modules/debug": { + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", @@ -17726,234 +15664,405 @@ "ms": "^2.1.1" } }, - "node_modules/proxy-from-env": { + "node_modules/pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dependencies": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==" + }, + "node_modules/parse-duration": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz", + "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==" }, - "node_modules/pseudomap": { + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", + "integrity": "sha512-CzEXTDgcEfa0yqMe+DJCSbEB5YCv4JZoic5xulBNFF2ifIMjNrTWbNSPNhgKfSo0MjneGIx9RLy4pCFuZPaMSQ==" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "node_modules/path-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha512-p9IuY9FRY1nU59RDW+tnLL6qMxmBnY03WGYxzy1FcqE5OMO5ggz7ahmOBH0JBS+9f95Yc7V5TZ+kHpTeFWaLQA==", "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "inflection": "~1.3.0" } }, - "node_modules/pump": { + "node_modules/path-proxy/node_modules/inflection": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha512-xRvG6XhAkbneGO5BXP0uKyGkzmZ2bBbrFkx4ZVNx2TmsECbiq/pJapbbx/NECh+E85IfZwW5+IeVNJfkQgavag==", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "optional": true, - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" } }, - "node_modules/pumpify/node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "optional": true, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, "engines": { - "node": ">=6" + "node": ">=0.12" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", "dependencies": { - "side-channel": "^1.0.4" + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" }, "engines": { - "node": ">=0.6" + "node": ">= 8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, + "node_modules/pg-minify": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/pg-minify/-/pg-minify-1.6.2.tgz", + "integrity": "sha512-1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg==", "engines": { - "node": ">=0.4.x" + "node": ">=8.0" } }, - "node_modules/queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dependencies": { - "inherits": "~2.0.3" + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "node_modules/pg-promise": { + "version": "10.15.4", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.15.4.tgz", + "integrity": "sha512-BKlHCMCdNUmF6gagVbehRWSEiVcZzPVltEx14OJExR9Iz9/1R6KETDWLLGv2l6yRqYFnEZZy1VDjRhArzeIGrw==", + "dependencies": { + "assert-options": "0.8.0", + "pg": "8.8.0", + "pg-minify": "1.6.2", + "spex": "3.2.0" + }, "engines": { - "node": ">=4" + "node": ">=12.0" } }, - "node_modules/random-avatar-generator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/random-avatar-generator/-/random-avatar-generator-2.0.0.tgz", - "integrity": "sha512-yOLrLkw2CvNuF2sFT23no9Qt7Lz16LS7gw6lVTc5M3TmBAKJEkxX8PZ4PYfxyXOEbnAJt4ttS4tUK+hUlXmLsQ==", + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dependencies": { - "seedrandom": "^3.0.5" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "dependencies": { - "safe-buffer": "^5.1.0" + "split2": "^4.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "pinkie": "^2.0.0" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-native-fetch-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz", - "integrity": "sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw==", - "dependencies": { - "p-defer": "^3.0.0" + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" } }, - "node_modules/read-pkg": { + "node_modules/pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "find-up": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/find-up": { + "node_modules/pkg-up/node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", @@ -17964,7 +16073,7 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { + "node_modules/pkg-up/node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", @@ -17976,7 +16085,7 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { + "node_modules/pkg-up/node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", @@ -17987,7 +16096,7 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { + "node_modules/pkg-up/node_modules/p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", @@ -17998,7 +16107,7 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/p-try": { + "node_modules/pkg-up/node_modules/p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", @@ -18006,257 +16115,133 @@ "node": ">=4" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/realpath-native": { + "node_modules/pn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "dependencies": { - "util.promisify": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/receptacle": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", - "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", - "dependencies": { - "ms": "^2.1.1" - } + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true }, - "node_modules/redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", - "dependencies": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "node_modules/pnglib": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pnglib/-/pnglib-0.0.1.tgz", + "integrity": "sha512-95ChzOoYLOPIyVmL+Y6X+abKGXUJlvOVLkB1QQkyXl7Uczc6FElUy/x01NS7r2GX6GRezloO/ecCX9h4U9KadA==" }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, + "node_modules/popsicle": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-9.2.0.tgz", + "integrity": "sha512-petRj39w05GvH1WKuGFmzxR9+k+R9E7zX5XWTFee7P/qf88hMuLT7aAO/RsmldpQMtJsWQISkTQlfMRECKlxhw==", "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" + "concat-stream": "^1.4.7", + "form-data": "^2.0.0", + "make-error-cause": "^1.2.1", + "tough-cookie": "^2.0.0" } }, - "node_modules/regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/popsicle-proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/popsicle-proxy-agent/-/popsicle-proxy-agent-3.0.0.tgz", + "integrity": "sha512-+0MhWUYhHbBWWIdKT4sO5cwgEMXPDskC3mGpgiCMLUdJt3mV3OuEFXubSjsiF4UDuiK6XNEst8oasZe9ZCUs8Q==", + "deprecated": "Use `agent` option with `popsicle` directly", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" + "http-proxy-agent": "^1.0.0", + "https-proxy-agent": "^1.0.0" } }, - "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "node_modules/popsicle-proxy-agent/node_modules/agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha512-oDtZV740o3fr5oJtPLOsgH2hl2TRPscNXIx4VzzBwVlXVkv8RHm7XXqGAYg8t20+Gwu6LNDnx8HRMGqVGPZ8Vw==", "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "extend": "~3.0.0", + "semver": "~5.0.1" } }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "node_modules/popsicle-proxy-agent/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" + "ms": "2.0.0" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/popsicle-proxy-agent/node_modules/http-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", + "integrity": "sha512-6YMslTZtuupu4irnNBi1bM6dG0UqHBHqObHQn3awavmNXe9CGkmw7KZ68EyAnJk3yBlLpbLwux5+bY1lneDFmg==", + "dependencies": { + "agent-base": "2", + "debug": "2", + "extend": "3" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/popsicle-proxy-agent/node_modules/https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha512-OZhm7//JDnQthMVqlPAfkZyPO2fMhfHY6gY+jZcX8rLfFiGtHiIQrfD80WvCDHNMQ77Ak3r5CiPRDD2rNzo2OQ==", "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" + "agent-base": "2", + "debug": "2", + "extend": "3" } }, - "node_modules/request-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", - "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node_modules/popsicle-proxy-agent/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/popsicle-proxy-agent/node_modules/semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/popsicle-retry": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/popsicle-retry/-/popsicle-retry-3.2.1.tgz", + "integrity": "sha512-AOKZJrHLXZMaMQtQcQW03tDZSgknkFOdoeAv5YuXuE1HqJH3D1oobHYmVIIjmdyBdHsqBnCX1inq2lRX1zocxQ==", "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "any-promise": "^1.1.0", + "xtend": "^4.0.1" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, + "node_modules/popsicle-rewrite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-rewrite/-/popsicle-rewrite-1.0.0.tgz", + "integrity": "sha512-ySNEf50wDXcSr89LCsAb00dYItQ/Cnisb1aGleYFnc69pmSzFDB090pDvLwptgWWaokvFDiLCAjUWRWZyZku/w==" + }, + "node_modules/popsicle-status": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/popsicle-status/-/popsicle-status-2.0.1.tgz", + "integrity": "sha512-jMzDnC9xEmyF624Fq4kfjWkFZuK4fOiCHKtr9MthCwpmQXRT+Eck1yEXbRwOEoS9qEWQGbi3THsBfC1Bzk7R/A==" + }, + "node_modules/popsicle/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/popsicle/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -18266,1062 +16251,1062 @@ "node": ">= 0.12" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "node_modules/popsicle/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/require_optional/node_modules/resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/popsicle/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" + "node_modules/popsicle/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-cwd": { + "node_modules/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "engines": { "node": ">=4" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dependencies": { - "lowercase-keys": "^2.0.0" + "xtend": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "peer": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "peer": true, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^1.0.0" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retimer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", - "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==" - }, - "node_modules/retry-request": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", - "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", - "optional": true, "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">=8.10.0" + "node": ">=6.0.0" } }, - "node_modules/retry-request/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, + "node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "engines": { + "node": ">=4" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/pretty-format/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" + "color-name": "1.1.3" } }, - "node_modules/rlp/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": "6.* || >= 7.*" + "node": ">= 0.6.0" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "peer": true, - "dependencies": { - "tslib": "^1.9.0" - }, "engines": { - "npm": ">=2.0.0" + "node": ">=0.4.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } + "node_modules/promise-finally": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-3.0.1.tgz", + "integrity": "sha512-hsF8r05ZnypT00IZTC71Ejiu9A7kyyVfHpdl3faasOHNJX62sNPfE8vDAz6P27RJ31i2O5ruhc6JV5xWR6GElQ==" }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "node_modules/promise.allsettled": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", + "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", "dependencies": { + "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", - "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" + "node_modules/promisify-call": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha512-ZX68J1+1Pe0I8NC0P6Ji3fDDcJceVfpoygfDLgdb1fp5vW9IRlwSpDaxe1T5HgwchyHV2DsL/pWzWikUiWEbLQ==", + "dependencies": { + "with-callback": "^1.0.2" }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=4.0" } }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "dependencies": { - "sparse-bitfield": "^3.0.3" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "dev": true + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "node_modules/protobufjs/node_modules/@types/node": { + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, - "node_modules/secp256k1": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", - "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", - "hasInstallScript": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.4.1", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.10" } }, - "node_modules/secp256k1-v4": { - "name": "secp256k1", - "version": "4.0.1", - "resolved": "git+ssh://git@github.com/HarshRajat/secp256k1-node.git#90a04a2e1127f4c1bfd7015aa5a7b22d08edb811", - "hasInstallScript": true, - "license": "MIT", + "node_modules/proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=6" } }, - "node_modules/secp256k1-v4/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "bin": { - "semver": "bin/semver" + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "semver": "^5.0.3" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "agent-base": "^4.3.0", + "debug": "^3.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 4.5.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/proxy-agent/node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dependencies": { - "randombytes": "^2.1.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/pumpify/node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dependencies": { - "is-extendable": "^0.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.x" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "node_modules/queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "dependencies": { + "inherits": "~2.0.3" + } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "engines": { + "node": ">=4" + } }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/random-avatar-generator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/random-avatar-generator/-/random-avatar-generator-2.0.0.tgz", + "integrity": "sha512-yOLrLkw2CvNuF2sFT23no9Qt7Lz16LS7gw6lVTc5M3TmBAKJEkxX8PZ4PYfxyXOEbnAJt4ttS4tUK+hUlXmLsQ==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" + "seedrandom": "^3.0.5" } }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { - "shebang-regex": "^1.0.0" - }, + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/react-native-fetch-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz", + "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "p-defer": "^3.0.0" } }, - "node_modules/sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "is-arrayish": "^0.3.1" + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", - "dev": true, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dependencies": { - "semver": "~7.0.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=4" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=6" + "node": ">=8.10.0" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "util.promisify": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, + "node_modules/receptacle": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", + "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", "dependencies": { - "color-name": "1.1.3" + "ms": "^2.1.1" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=4" } }, - "node_modules/snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha512-ot3bb6pQt6IVq5G/JQ640ceSYTPtriVrwNyfoUw1LmQQGzPMAGxE5F+ded2UwSUCyf2PW1fFAYUnVEX21PWbpQ==", - "optional": true + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dependencies": { - "kind-of": "^3.2.0" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=0.10" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "is-finite": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "is-extendable": "^0.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, + "node_modules/request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dependencies": { - "kind-of": "^3.0.2" + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" }, "engines": { "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dependencies": { - "is-buffer": "^1.1.5" + "lodash": "^4.17.19" }, "engines": { "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "is-buffer": "^1.1.5" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.12" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "node_modules/require_optional/node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/ms": { + "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "lowercase-keys": "^2.0.0" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } }, - "node_modules/socket.io-client": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", - "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "peer": true, "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.4.0", - "socket.io-parser": "~4.2.4" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "peer": true, "dependencies": { - "ms": "2.1.2" + "mimic-fn": "^1.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=4" } }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=0.12" } }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/retimer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", + "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==" + }, + "node_modules/retry-request": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", + "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", + "optional": true, "dependencies": { - "ms": "2.1.2" + "debug": "^4.1.1", + "extend": "^3.0.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8.10.0" } }, - "node_modules/socket.io/node_modules/debug": { + "node_modules/retry-request/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { "ms": "2.1.2" }, @@ -19334,931 +17319,907 @@ } } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dependencies": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "bin": { + "rimraf": "bin.js" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/socks-proxy-agent/node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" - }, - "node_modules/socks-proxy-agent/node_modules/socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dependencies": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "bn.js": "^5.2.0" }, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "bin": { + "rlp": "bin/rlp" } }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/rlp/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/sort-keys/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "6.* || >= 7.*" } }, - "node_modules/sorted-array-functions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", - "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "peer": true, "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "ret": "~0.1.10" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" - }, - "node_modules/spex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz", - "integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg==", + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "engines": { - "node": ">=4.5" + "node": ">=10" } }, - "node_modules/split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, "dependencies": { - "extend-shallow": "^3.0.0" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, "engines": { - "node": ">= 10.x" + "node": ">=6" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true }, - "node_modules/sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "node_modules/secp256k1-v4": { + "name": "secp256k1", + "version": "4.0.1", + "resolved": "git+ssh://git@github.com/HarshRajat/secp256k1-node.git#90a04a2e1127f4c1bfd7015aa5a7b22d08edb811", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "node_modules/secp256k1-v4/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "node_modules/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "dev": true, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", "dependencies": { - "escape-string-regexp": "^2.0.0" + "semver": "^5.0.3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "randombytes": "^2.1.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { - "kind-of": "^3.0.2" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dependencies": { - "is-buffer": "^1.1.5" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", "dependencies": { - "kind-of": "^3.0.2" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-events": { + "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "optional": true + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/stream-to-it": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", - "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==", + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { - "get-iterator": "^1.0.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true }, - "node_modules/string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==", - "dev": true, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" + "node_modules/sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-arrayish": "^0.3.1" } }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "semver": "~7.0.0" }, "engines": { - "node": ">=4" + "node": ">=8.10.0" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "peer": true, "dependencies": { - "is-hex-prefixed": "1.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "optional": true + "peer": true }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" }, - "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "engines": { - "node": ">= 4.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/superagent/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } + "node_modules/snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha512-ot3bb6pQt6IVq5G/JQ640ceSYTPtriVrwNyfoUw1LmQQGzPMAGxE5F+ded2UwSUCyf2PW1fFAYUnVEX21PWbpQ==", + "optional": true }, - "node_modules/superagent/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/superagent/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/superagent/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/superagent/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/supports-preserve-symlinks-flag": { + "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/swarm-js/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/swarm-js/node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { - "minipass": "^2.6.0" + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { - "minipass": "^2.9.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">=4.5" + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/swarm-js/node_modules/ws/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "peer": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=6" + "node": ">=10.2.0" } }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "dependencies": { - "ansi-regex": "^4.1.0" - }, + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">= 10" + "node": ">=10.0.0" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/teeny-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz", - "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==", - "optional": true, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.2.0", - "stream-events": "^1.0.5", - "uuid": "^7.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/teeny-request/node_modules/debug": { + "node_modules/socket.io-parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, "dependencies": { "ms": "2.1.2" }, @@ -20271,219 +18232,298 @@ } } }, - "node_modules/teeny-request/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "ms": "2.1.2" }, "engines": { - "node": ">= 6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/teeny-request/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "node_modules/socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dependencies": { - "execa": "^0.7.0" + "agent-base": "~4.2.1", + "socks": "~2.3.2" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/term-size/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/term-size/node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "node_modules/socks/node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "is-plain-obj": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/term-size/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/term-size/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/term-size/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "node_modules/term-size/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/test-exclude/node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "devOptional": true, "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, + "memory-pager": "^1.0.2" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, + "node_modules/spex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.2.0.tgz", + "integrity": "sha512-9srjJM7NaymrpwMHvSmpDeIK5GoRMX/Tq0E8aOlDPS54dDnDUIp30DrP9SphMPEETDLzEM9+4qo+KipmbtPecg==", "engines": { - "node": ">=6" + "node": ">=4.5" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "peer": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dependencies": { - "any-promise": "^1.0.0" + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" } }, - "node_modules/throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "optional": true, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==" + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/timeout-abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz", - "integrity": "sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==", + "node_modules/stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, "dependencies": { - "retimer": "^3.0.0" + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, - "peer": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "dependencies": { "kind-of": "^3.0.2" @@ -20492,7 +18532,7 @@ "node": ">=0.10.0" } }, - "node_modules/to-object-path/node_modules/kind-of": { + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", @@ -20504,1038 +18544,1213 @@ "node": ">=0.10.0" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, "engines": { - "node": ">=0.6" + "node": ">=0.10.0" } }, - "node_modules/topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", - "dependencies": { - "hoek": "6.x.x" + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "internal-slot": "^1.0.4" }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" + "stubs": "^3.0.0" } }, - "node_modules/tr46": { + "node_modules/stream-shift": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "optional": true + }, + "node_modules/stream-to-it": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", + "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==", "dependencies": { - "punycode": "^2.1.0" + "get-iterator": "^1.0.2" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" } }, - "node_modules/trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/triple-beam": { + "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/ts-jest": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", - "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", + "node_modules/string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "bin": { - "ts-jest": "cli.js" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "jest": ">=24 <25" + "node": ">=4" } }, - "node_modules/ts-luxon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-4.0.1.tgz", - "integrity": "sha512-y7wCmgQ1sIjDUheejmLIOz08XeJ8sQ75m4zKd2ppI4OgTbQIuW8e4ZfNyp75zgomSZGi0I/PIiaHSYdrHd+tiQ==", + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, "engines": { - "node": ">=13" + "node": ">=4" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-node-dev": { - "version": "1.0.0-pre.44", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz", - "integrity": "sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw==", - "dev": true, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dependencies": { - "dateformat": "~1.0.4-1.2.3", - "dynamic-dedupe": "^0.3.0", - "filewatcher": "~3.0.0", - "minimist": "^1.1.3", - "mkdirp": "^0.5.1", - "node-notifier": "^5.4.0", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.1", - "ts-node": "*", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "bin/ts-node-dev", - "tsnd": "bin/ts-node-dev" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-node-dev/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dependencies": { - "glob": "^7.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/tsconfig-paths": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", - "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", - "dev": true, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "optional": true + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", "dependencies": { - "json5": "^2.2.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "engines": { - "node": ">=6" + "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" + "ms": "2.1.2" }, "engines": { - "node": ">=4.8.0" + "node": ">=6.0" }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/superagent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "color-convert": "^1.9.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/superagent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/superagent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "color-name": "1.1.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/tslint/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { - "node": ">=0.3.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" } }, - "node_modules/tslint/node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, + "node_modules/swarm-js/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/swarm-js/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/swarm-js/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/swarm-js/node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, + "node_modules/swarm-js/node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dependencies": { - "tslib": "^1.8.1" + "minipass": "^2.6.0" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=0.6.x" + "node": ">=8" } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "node_modules/swarm-js/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { - "node": ">= 6" + "node": ">=10" }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/swarm-js/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dependencies": { - "safe-buffer": "^5.0.1" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/swarm-js/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/swarm-js/node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" }, "engines": { - "node": "*" + "node": ">=4.5" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "node_modules/swarm-js/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + "node_modules/swarm-js/node_modules/ws/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "peer": true, "dependencies": { - "prelude-ls": "~1.1.2" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.0.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "peer": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "peer": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { - "is-typedarray": "^1.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/typedi": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.8.0.tgz", - "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=4.2.0" + "node": ">=10" } }, - "node_modules/typings": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/typings/-/typings-2.1.1.tgz", - "integrity": "sha512-ABFg64N1Vb0qHSIyks4kq1P02bWuwRmvCoD6d03Gmha1B5tl4uuz4w/bCCITW1rzC0+IYRGZ5PI0e2G7kqXGfw==", - "deprecated": "Typings is deprecated in favor of NPM @types -- see README for more information", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/teeny-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz", + "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==", + "optional": true, "dependencies": { - "archy": "^1.0.0", - "bluebird": "^3.1.1", - "chalk": "^1.0.0", - "cli-truncate": "^1.0.0", - "columnify": "^1.5.2", - "elegant-spinner": "^1.0.1", - "has-unicode": "^2.0.1", - "listify": "^1.0.0", - "log-update": "^1.0.2", - "minimist": "^1.2.0", - "promise-finally": "^3.0.0", - "typings-core": "^2.3.3", - "update-notifier": "^2.0.0", - "wordwrap": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "typings": "dist/bin.js" + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^7.0.0" } }, - "node_modules/typings-core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/typings-core/-/typings-core-2.3.3.tgz", - "integrity": "sha512-FI/cwKyu9t84BXf83aIhGYzitfhEdo02l09xZaqdwQo9Xj4RjWpS1m+m7vljz373zcx6rudgVuESuo/dY1N4cw==", + "node_modules/teeny-request/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { - "array-uniq": "^1.0.2", - "configstore": "^3.0.0", - "debug": "^2.2.0", - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "has": "^1.0.1", - "invariant": "^2.2.0", - "is-absolute": "^0.2.3", - "jspm-config": "^0.3.0", - "listify": "^1.0.0", - "lockfile": "^1.0.1", - "make-error-cause": "^1.2.1", - "mkdirp": "^0.5.1", - "object.pick": "^1.1.1", - "parse-json": "^2.2.0", - "popsicle": "^9.0.0", - "popsicle-proxy-agent": "^3.0.0", - "popsicle-retry": "^3.2.0", - "popsicle-rewrite": "^1.0.0", - "popsicle-status": "^2.0.0", - "promise-finally": "^3.0.0", - "rc": "^1.1.5", - "rimraf": "^2.4.4", - "sort-keys": "^1.0.0", - "string-template": "^1.0.0", - "strip-bom": "^3.0.0", - "thenify": "^3.1.0", - "throat": "^3.0.0", - "touch": "^1.0.0", - "typescript": "^2.1.4", - "xtend": "^4.0.0", - "zip-object": "^0.1.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/typings-core/node_modules/configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "node_modules/teeny-request/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=4" + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/typings-core/node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dependencies": { + "execa": "^0.7.0" + }, "engines": { "node": ">=4" } }, - "node_modules/typings-core/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/term-size/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dependencies": { - "ms": "2.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "node_modules/typings-core/node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", "dependencies": { - "is-obj": "^1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/typings-core/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/typings-core/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "node_modules/term-size/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/typings-core/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/term-size/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "node_modules/typings-core/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/typings-core/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/test-exclude/node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, "dependencies": { - "error-ex": "^1.2.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/typings-core/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "any-promise": "^1.0.0" } }, - "node_modules/typings-core/node_modules/throat": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", - "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", + "dev": true }, - "node_modules/typings-core/node_modules/touch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz", - "integrity": "sha512-7PLLVW4cfMVYXtMgX0ynJvyZDiupF2rzGzzf0yATTzgCgNK98DHjRSTm5zU1bFUtRjFdXNrEynn9+vhflVpC0A==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "optional": true, "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "touch": "bin/touch.js" - }, - "engines": { - "node": ">=0.6" + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } }, - "node_modules/typings-core/node_modules/typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "engines": { - "node": ">=4.2.0" + "node": ">=0.10.0" } }, - "node_modules/typings-core/node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "node_modules/timeout-abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz", + "integrity": "sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==", "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" + "retimer": "^3.0.0" } }, - "node_modules/typings-core/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "peer": true, "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/typings-core/node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/typings/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/typings/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/typings/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/typings/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/typings/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": ">=0.8.0" + "node": ">=0.6" } }, - "node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "node_modules/topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", "dependencies": { - "multiformats": "^9.4.2" + "hoek": "6.x.x" } }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "abbrev": "1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-jest": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", + "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", "dev": true, "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "bin": { + "ts-jest": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" + }, + "peerDependencies": { + "jest": ">=24 <25" } }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/ts-luxon": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-4.4.0.tgz", + "integrity": "sha512-da38ShNr8dHAXEMg2sBwecOmNus2Fd7Q4h/MAXUve00NVxaeEbR0DMbF2UECBCy22qKPN6F6fypfDdVUniLTEw==", "engines": { - "node": ">=0.10.0" + "node": ">=13" } }, - "node_modules/unique-names-generator": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", - "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "1.0.0-pre.44", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz", + "integrity": "sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw==", + "dev": true, + "dependencies": { + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "filewatcher": "~3.0.0", + "minimist": "^1.1.3", + "mkdirp": "^0.5.1", + "node-notifier": "^5.4.0", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.1", + "ts-node": "*", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "bin/ts-node-dev", + "tsnd": "bin/ts-node-dev" + }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "optional": true, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { - "crypto-random-string": "^2.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/ts-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=0.4.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.4.0" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", "dev": true, "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "isarray": "1.0.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", - "engines": { - "node": ">=4" - } + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "node_modules/tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" }, "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dependencies": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "tslint": "bin/tslint" }, "engines": { - "node": ">=4" + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, - "node_modules/update-notifier/node_modules/ansi-styles": { + "node_modules/tslint/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -21543,10 +19758,11 @@ "node": ">=4" } }, - "node_modules/update-notifier/node_modules/chalk": { + "node_modules/tslint/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -21556,101 +19772,61 @@ "node": ">=4" } }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "node_modules/update-notifier/node_modules/color-convert": { + "node_modules/tslint/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } }, - "node_modules/update-notifier/node_modules/color-name": { + "node_modules/tslint/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/update-notifier/node_modules/configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", - "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/update-notifier/node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "engines": { - "node": ">=4" - } + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/update-notifier/node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dependencies": { - "is-obj": "^1.0.0" - }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=0.3.1" } }, - "node_modules/update-notifier/node_modules/has-flag": { + "node_modules/tslint/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "node_modules/tslint/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, "dependencies": { - "ci-info": "^1.5.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/update-notifier/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-notifier/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" + "resolve": "bin/resolve" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/update-notifier/node_modules/supports-color": { + "node_modules/tslint/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -21658,2815 +19834,2306 @@ "node": ">=4" } }, - "node_modules/update-notifier/node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "node_modules/tslint/node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, "dependencies": { - "crypto-random-string": "^1.0.0" + "tslib": "^1.8.1" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "node_modules/update-notifier/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" } }, - "node_modules/update-notifier/node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, "engines": { - "node": ">=4" + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { - "punycode": "^2.1.0" + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { - "prepend-http": "^1.0.1" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { - "node-gyp-build": "^4.3.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=6.14.2" + "node": ">= 0.6" } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "dev": true, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { - "browser-process-hrtime": "^1.0.0" + "is-typedarray": "^1.0.0" } }, - "node_modules/walkdir": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", - "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", - "optional": true, + "node_modules/typedi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.8.0.tgz", + "integrity": "sha512-/c7Bxnm6eh5kXx2I+mTuO+2OvoWni5+rXA3PhXwVWCtJRYmz3hMok5s1AKLzoDvNAZqj/Q/acGstN0ri5aQoOA==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=6.0.0" + "node": ">=4.2.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, + "node_modules/typings": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/typings/-/typings-2.1.1.tgz", + "integrity": "sha512-ABFg64N1Vb0qHSIyks4kq1P02bWuwRmvCoD6d03Gmha1B5tl4uuz4w/bCCITW1rzC0+IYRGZ5PI0e2G7kqXGfw==", + "deprecated": "Typings is deprecated in favor of NPM @types -- see README for more information", "dependencies": { - "makeerror": "1.0.12" + "archy": "^1.0.0", + "bluebird": "^3.1.1", + "chalk": "^1.0.0", + "cli-truncate": "^1.0.0", + "columnify": "^1.5.2", + "elegant-spinner": "^1.0.1", + "has-unicode": "^2.0.1", + "listify": "^1.0.0", + "log-update": "^1.0.2", + "minimist": "^1.2.0", + "promise-finally": "^3.0.0", + "typings-core": "^2.3.3", + "update-notifier": "^2.0.0", + "wordwrap": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "typings": "dist/bin.js" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/typings-core": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/typings-core/-/typings-core-2.3.3.tgz", + "integrity": "sha512-FI/cwKyu9t84BXf83aIhGYzitfhEdo02l09xZaqdwQo9Xj4RjWpS1m+m7vljz373zcx6rudgVuESuo/dY1N4cw==", "dependencies": { - "defaults": "^1.0.3" + "array-uniq": "^1.0.2", + "configstore": "^3.0.0", + "debug": "^2.2.0", + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "has": "^1.0.1", + "invariant": "^2.2.0", + "is-absolute": "^0.2.3", + "jspm-config": "^0.3.0", + "listify": "^1.0.0", + "lockfile": "^1.0.1", + "make-error-cause": "^1.2.1", + "mkdirp": "^0.5.1", + "object.pick": "^1.1.1", + "parse-json": "^2.2.0", + "popsicle": "^9.0.0", + "popsicle-proxy-agent": "^3.0.0", + "popsicle-retry": "^3.2.0", + "popsicle-rewrite": "^1.0.0", + "popsicle-status": "^2.0.0", + "promise-finally": "^3.0.0", + "rc": "^1.1.5", + "rimraf": "^2.4.4", + "sort-keys": "^1.0.0", + "string-template": "^1.0.0", + "strip-bom": "^3.0.0", + "thenify": "^3.1.0", + "throat": "^3.0.0", + "touch": "^1.0.0", + "typescript": "^2.1.4", + "xtend": "^4.0.0", + "zip-object": "^0.1.0" } }, - "node_modules/web3": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.6.0.tgz", - "integrity": "sha512-rWpXnO88MiVX5yTRqMBCVKASxc7QDkXZZUl1D48sKlbX4dt3BAV+nVMVUKCBKiluZ5Bp8pDrVCUdPx/jIYai5Q==", - "hasInstallScript": true, + "node_modules/typings-core/node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", "dependencies": { - "web3-bzz": "1.6.0", - "web3-core": "1.6.0", - "web3-eth": "1.6.0", - "web3-eth-personal": "1.6.0", - "web3-net": "1.6.0", - "web3-shh": "1.6.0", - "web3-utils": "1.6.0" + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-bzz": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.6.0.tgz", - "integrity": "sha512-ugYV6BsinwhIi0CsLWINBz4mqN9wR9vNG0WmyEbdECjxcPyr6vkaWt4qi0zqlUxEnYAwGj4EJXNrbjPILntQTQ==", - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, + "node_modules/typings-core/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-bzz/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" + "node_modules/typings-core/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/typings-core/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dependencies": { - "defer-to-connect": "^1.0.1" + "is-obj": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/web3-bzz/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, + "node_modules/typings-core/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/typings-core/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dependencies": { - "pump": "^3.0.0" + "pify": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { + "node_modules/typings-core/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/typings-core/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/web3-bzz/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/web3-bzz/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "node_modules/typings-core/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "error-ex": "^1.2.0" }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/web3-bzz/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/web3-bzz/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "node_modules/typings-core/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "json-buffer": "3.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/web3-bzz/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "node_modules/typings-core/node_modules/throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==" + }, + "node_modules/typings-core/node_modules/touch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz", + "integrity": "sha512-7PLLVW4cfMVYXtMgX0ynJvyZDiupF2rzGzzf0yATTzgCgNK98DHjRSTm5zU1bFUtRjFdXNrEynn9+vhflVpC0A==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "touch": "bin/touch.js" + }, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "node_modules/typings-core/node_modules/typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=6" + "node": ">=4.2.0" } }, - "node_modules/web3-bzz/node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "node_modules/typings-core/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/web3-bzz/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "node_modules/typings-core/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dependencies": { - "lowercase-keys": "^1.0.0" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "node_modules/web3-bzz/node_modules/url-parse-lax": { + "node_modules/typings-core/node_modules/xdg-basedir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", "engines": { "node": ">=4" } }, - "node_modules/web3-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.6.0.tgz", - "integrity": "sha512-o0WsLrJ2yD+HAAc29lGMWJef/MutTyuzpJC0UzLJtIAQJqtpDalzWINEu4j8XYXGk34N/V6vudtzRPo23QEE6g==", - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.6.0", - "web3-core-method": "1.6.0", - "web3-core-requestmanager": "1.6.0", - "web3-utils": "1.6.0" - }, + "node_modules/typings/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-helpers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.6.0.tgz", - "integrity": "sha512-H/IAH/0mrgvad/oxVKiAMC7qDzMrPPe/nRKmJOoIsupRg9/frvL62kZZiHhqVD1HMyyswbQFC69QRl7JqWzvxg==", - "dependencies": { - "web3-eth-iban": "1.6.0", - "web3-utils": "1.6.0" - }, + "node_modules/typings/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-method": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.6.0.tgz", - "integrity": "sha512-cHekyEil4mtcCOk6Q1Zh4y+2o5pTwsLIxP6Bpt4BRtZgdsyPiadYJpkLAVT/quch5xN7Qs5ZwG5AvRCS3VwD2g==", + "node_modules/typings/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dependencies": { - "@ethereumjs/common": "^2.4.0", - "@ethersproject/transactions": "^5.0.0-beta.135", - "web3-core-helpers": "1.6.0", - "web3-core-promievent": "1.6.0", - "web3-core-subscriptions": "1.6.0", - "web3-utils": "1.6.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-promievent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.6.0.tgz", - "integrity": "sha512-ZzsevjMXWkhqW9dnVfTfb1OUcK7jKcKPvPIbQ4boJccNgvNZPZKlo8xB4pkAX38n4c59O5mC7Lt/z2QL/M5CeQ==", + "node_modules/typings/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "eventemitter3": "4.0.4" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-promievent/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "node_modules/typings/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/web3-core-requestmanager": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.6.0.tgz", - "integrity": "sha512-CY5paPdiDXKTXPWaEUZekDfUXSuoE2vPxolwqzsvKwFWH5+H1NaXgrc+D5HpufgSvTXawTw0fy7IAicg8+PWqA==", + "node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.6.0", - "web3-providers-http": "1.6.0", - "web3-providers-ipc": "1.6.0", - "web3-providers-ws": "1.6.0" - }, - "engines": { - "node": ">=8.0.0" + "multiformats": "^9.4.2" } }, - "node_modules/web3-core-subscriptions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.6.0.tgz", - "integrity": "sha512-kY9WZUY/m1URSOv3uTLshoZD9ZDiFKReIzHuPUkxFpD5oYNmr1/aPQNPCrrMxKODR7UVX/D90FxWwCYqHhLaxQ==", + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.6.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-subscriptions/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, - "node_modules/web3-eth": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.6.0.tgz", - "integrity": "sha512-qJMvai//r0be6I9ghU24/152f0zgJfYC23TMszN3Y6jse1JtjCBP2TlTibFcvkUN1RRdIUY5giqO7ZqAYAmp7w==", + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, "dependencies": { - "web3-core": "1.6.0", - "web3-core-helpers": "1.6.0", - "web3-core-method": "1.6.0", - "web3-core-subscriptions": "1.6.0", - "web3-eth-abi": "1.6.0", - "web3-eth-accounts": "1.6.0", - "web3-eth-contract": "1.6.0", - "web3-eth-ens": "1.6.0", - "web3-eth-iban": "1.6.0", - "web3-eth-personal": "1.6.0", - "web3-net": "1.6.0", - "web3-utils": "1.6.0" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-abi": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.6.0.tgz", - "integrity": "sha512-fImomGE9McuTMJLwK8Tp0lTUzXqCkWeMm00qPVIwpJ/h7lCw9UFYV9+4m29wSqW6FF+FIZKwc6UBEf9dlx3orA==", - "dependencies": { - "@ethersproject/abi": "5.0.7", - "web3-utils": "1.6.0" - }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-names-generator": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", + "integrity": "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==", "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-accounts": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.6.0.tgz", - "integrity": "sha512-2f6HS4KIH4laAsNCOfbNX3dRiQosqSY2TRK86C8jtAA/QKGdx+5qlPfYzbI2RjG81iayb2+mVbHIaEaBGZ8sGw==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, "dependencies": { - "@ethereumjs/common": "^2.3.0", - "@ethereumjs/tx": "^3.2.1", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.6.0", - "web3-core-helpers": "1.6.0", - "web3-core-method": "1.6.0", - "web3-utils": "1.6.0" + "crypto-random-string": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-accounts/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-contract": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.6.0.tgz", - "integrity": "sha512-ZUtO77zFnxuFtrc+D+iJ3AzNgFXAVcKnhEYN7f1PNz/mFjbtE6dJ+ujO0mvMbxIZF02t9IZv0CIXRpK0rDvZAw==", + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, "dependencies": { - "@types/bn.js": "^4.11.5", - "web3-core": "1.6.0", - "web3-core-helpers": "1.6.0", - "web3-core-method": "1.6.0", - "web3-core-promievent": "1.6.0", - "web3-core-subscriptions": "1.6.0", - "web3-eth-abi": "1.6.0", - "web3-utils": "1.6.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-ens": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.6.0.tgz", - "integrity": "sha512-AG24PNv9qbYHSpjHcU2pViOII0jvIR7TeojJ2bxXSDqfcgHuRp3NZGKv6xFvT4uNI4LEQHUhSC7bzHoNF5t8CA==", + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.6.0", - "web3-core-helpers": "1.6.0", - "web3-core-promievent": "1.6.0", - "web3-eth-abi": "1.6.0", - "web3-eth-contract": "1.6.0", - "web3-utils": "1.6.0" + "isarray": "1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-iban": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.6.0.tgz", - "integrity": "sha512-HM/bKBS/e8qg0+Eh7B8C/JVG+GkR4AJty17DKRuwMtrh78YsonPj7GKt99zS4n5sDLFww1Imu/ZIk3+K5uJCjw==", - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.6.0" - }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-personal": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.6.0.tgz", - "integrity": "sha512-8ohf4qAwbShf4RwES2tLHVqa+pHZnS5Q6tV80sU//bivmlZeyO1W4UWyNn59vu9KPpEYvLseOOC6Muxuvr8mFQ==", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.6.0", - "web3-core-helpers": "1.6.0", - "web3-core-method": "1.6.0", - "web3-net": "1.6.0", - "web3-utils": "1.6.0" - }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "node_modules/web3-net": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.6.0.tgz", - "integrity": "sha512-LFfG95ovTT2sNHkO1TEfsaKpYcxOSUtbuwHQ0K3G0e5nevKDJkPEFIqIcob40yiwcWoqEjENJP9Bjk8CRrZ99Q==", + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dependencies": { - "web3-core": "1.6.0", - "web3-core-method": "1.6.0", - "web3-utils": "1.6.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-providers-http": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.6.0.tgz", - "integrity": "sha512-sNxHFNv3lnxpmULt34AS6M36IYB/Hzm2Et4yPNzdP1XE644D8sQBZQZaJQdTaza5HfrlwoqU6AOK935armqGuA==", + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "web3-core-helpers": "1.6.0", - "xhr2-cookies": "1.1.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-providers-ipc": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.6.0.tgz", - "integrity": "sha512-ETYdfhpGiGoWpmmSJnONvnPfd3TPivHEGjXyuX+L5FUsbMOVZj9MFLNIS19Cx/YGL8UWJ/8alLJoTcWSIdz/aA==", + "node_modules/update-notifier/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.6.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-providers-ws": { + "node_modules/update-notifier/node_modules/ci-info": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.6.0.tgz", - "integrity": "sha512-eNRmlhOPCpuVYwBrKBBQRLGPFb4U1Uo44r9EWV69Cpo4gP6XeBTl6nkawhLz6DS0fq79apyPfItJVuSfAy77pA==", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.6.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" + "color-name": "1.1.3" } }, - "node_modules/web3-providers-ws/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/web3-shh": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.6.0.tgz", - "integrity": "sha512-ymN0OFL81WtEeSyb+PFpuUv39fR3frGwsZnIg5EVPZvrOIdaDSFcGSLDmafUt0vKSubvLMVYIBOCskRD6YdtEQ==", - "hasInstallScript": true, + "node_modules/update-notifier/node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", "dependencies": { - "web3-core": "1.6.0", - "web3-core-method": "1.6.0", - "web3-core-subscriptions": "1.6.0", - "web3-net": "1.6.0" + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.6.0.tgz", - "integrity": "sha512-bgCAWAeQnJF035YTFxrcHJ5mGEfTi/McsjqldZiXRwlHK7L1PyOqvXiQLE053dlzvy1kdAxWl/sSSfLMyNUAXg==", + "node_modules/update-notifier/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dependencies": { - "bn.js": "^4.11.9", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "is-obj": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-utils/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" + "node_modules/update-notifier/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" } }, - "node_modules/web3-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/update-notifier/node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "ci-info": "^1.5.0" }, - "engines": { - "node": ">=10.0.0" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/web3-utils/node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "node_modules/update-notifier/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "node_modules/update-notifier/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" + "pify": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/update-notifier/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/update-notifier/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/update-notifier/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dependencies": { - "ms": "2.0.0" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/update-notifier/node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "engines": { + "node": ">=4" + } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "iconv-lite": "0.4.24" + "punycode": "^2.1.0" } }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", "dependencies": { - "isexe": "^2.0.0" + "prepend-http": "^1.0.1" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "node-gyp-build": "^4.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.14.2" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "optional": true, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "node_modules/util.promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.2.tgz", + "integrity": "sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==", + "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", + "define-properties": "^1.2.0", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "object.getownpropertydescriptors": "^2.1.6", + "safe-array-concat": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dependencies": { - "string-width": "^2.1.1" - }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, - "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", - "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 6.4.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/winston/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, - "node_modules/with-callback": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", - "integrity": "sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "optional": true, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "makeerror": "1.0.12" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dependencies": { - "color-name": "1.1.3" + "defaults": "^1.0.3" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/web3": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.6.0.tgz", + "integrity": "sha512-rWpXnO88MiVX5yTRqMBCVKASxc7QDkXZZUl1D48sKlbX4dt3BAV+nVMVUKCBKiluZ5Bp8pDrVCUdPx/jIYai5Q==", + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.6.0", + "web3-core": "1.6.0", + "web3-eth": "1.6.0", + "web3-eth-personal": "1.6.0", + "web3-net": "1.6.0", + "web3-shh": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "node_modules/web3-bzz": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.6.0.tgz", + "integrity": "sha512-ugYV6BsinwhIi0CsLWINBz4mqN9wR9vNG0WmyEbdECjxcPyr6vkaWt4qi0zqlUxEnYAwGj4EJXNrbjPILntQTQ==", + "hasInstallScript": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40" }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "engines": { "node": ">=6" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dependencies": { - "ansi-regex": "^4.1.0" + "defer-to-connect": "^1.0.1" }, "engines": { "node": ">=6" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "peer": true, + "node_modules/web3-bzz/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dependencies": { - "mkdirp": "^0.5.1" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "optional": true, + "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" + "pump": "^3.0.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "engines": { + "node": ">=8" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "optional": true, + "node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dependencies": { - "xhr-request": "^1.1.0" - } + "node_modules/web3-bzz/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, - "node_modules/xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", + "node_modules/web3-bzz/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dependencies": { - "cookiejar": "^2.1.1" + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/xml-name-validator": { + "node_modules/web3-bzz/node_modules/json-buffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, - "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, + "node_modules/web3-bzz/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "dev": true, - "engines": { - "node": ">=4.0" + "json-buffer": "3.0.0" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "node_modules/web3-bzz/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "node_modules/web3-bzz/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "node_modules/xregexp": { + "node_modules/web3-bzz/node_modules/prepend-http": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "engines": { - "node": "*" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "engines": { - "node": ">=0.10.32" + "node": ">=4" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, + "node_modules/web3-bzz/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "lowercase-keys": "^1.0.0" } }, - "node_modules/yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "node_modules/web3-bzz/node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dependencies": { - "camelcase": "^4.1.0" + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "node_modules/web3-core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.6.0.tgz", + "integrity": "sha512-o0WsLrJ2yD+HAAc29lGMWJef/MutTyuzpJC0UzLJtIAQJqtpDalzWINEu4j8XYXGk34N/V6vudtzRPo23QEE6g==", + "dependencies": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.6.0", + "web3-core-method": "1.6.0", + "web3-core-requestmanager": "1.6.0", + "web3-utils": "1.6.0" + }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, + "node_modules/web3-core-helpers": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.6.0.tgz", + "integrity": "sha512-H/IAH/0mrgvad/oxVKiAMC7qDzMrPPe/nRKmJOoIsupRg9/frvL62kZZiHhqVD1HMyyswbQFC69QRl7JqWzvxg==", "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "web3-eth-iban": "1.6.0", + "web3-utils": "1.6.0" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/web3-core-method": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.6.0.tgz", + "integrity": "sha512-cHekyEil4mtcCOk6Q1Zh4y+2o5pTwsLIxP6Bpt4BRtZgdsyPiadYJpkLAVT/quch5xN7Qs5ZwG5AvRCS3VwD2g==", + "dependencies": { + "@ethereumjs/common": "^2.4.0", + "@ethersproject/transactions": "^5.0.0-beta.135", + "web3-core-helpers": "1.6.0", + "web3-core-promievent": "1.6.0", + "web3-core-subscriptions": "1.6.0", + "web3-utils": "1.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "node_modules/web3-core-promievent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.6.0.tgz", + "integrity": "sha512-ZzsevjMXWkhqW9dnVfTfb1OUcK7jKcKPvPIbQ4boJccNgvNZPZKlo8xB4pkAX38n4c59O5mC7Lt/z2QL/M5CeQ==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "eventemitter3": "4.0.4" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "node_modules/web3-core-promievent/node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/web3-core-requestmanager": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.6.0.tgz", + "integrity": "sha512-CY5paPdiDXKTXPWaEUZekDfUXSuoE2vPxolwqzsvKwFWH5+H1NaXgrc+D5HpufgSvTXawTw0fy7IAicg8+PWqA==", "dependencies": { - "ansi-regex": "^4.1.0" + "util": "^0.12.0", + "web3-core-helpers": "1.6.0", + "web3-providers-http": "1.6.0", + "web3-providers-ipc": "1.6.0", + "web3-providers-ws": "1.6.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, + "node_modules/web3-core-subscriptions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.6.0.tgz", + "integrity": "sha512-kY9WZUY/m1URSOv3uTLshoZD9ZDiFKReIzHuPUkxFpD5oYNmr1/aPQNPCrrMxKODR7UVX/D90FxWwCYqHhLaxQ==", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "node_modules/web3-core-subscriptions/node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-eth": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.6.0.tgz", + "integrity": "sha512-qJMvai//r0be6I9ghU24/152f0zgJfYC23TMszN3Y6jse1JtjCBP2TlTibFcvkUN1RRdIUY5giqO7ZqAYAmp7w==", + "dependencies": { + "web3-core": "1.6.0", + "web3-core-helpers": "1.6.0", + "web3-core-method": "1.6.0", + "web3-core-subscriptions": "1.6.0", + "web3-eth-abi": "1.6.0", + "web3-eth-accounts": "1.6.0", + "web3-eth-contract": "1.6.0", + "web3-eth-ens": "1.6.0", + "web3-eth-iban": "1.6.0", + "web3-eth-personal": "1.6.0", + "web3-net": "1.6.0", + "web3-utils": "1.6.0" + }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/web3-eth-abi": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.6.0.tgz", + "integrity": "sha512-fImomGE9McuTMJLwK8Tp0lTUzXqCkWeMm00qPVIwpJ/h7lCw9UFYV9+4m29wSqW6FF+FIZKwc6UBEf9dlx3orA==", + "dependencies": { + "@ethersproject/abi": "5.0.7", + "web3-utils": "1.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/zip-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/zip-object/-/zip-object-0.1.0.tgz", - "integrity": "sha512-eujiZK9Z3F/WuswEIWqlaNUwUj67oRw4Op5a1VeKw4n9XBkV7EdxtgblroWBYvLmD7XqZ1cjqsbmE3jU43prTA==" - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "node_modules/web3-eth-abi/node_modules/@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "dependencies": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" } }, - "@aws-crypto/ie11-detection": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", - "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^1.11.1" + "node_modules/web3-eth-accounts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.6.0.tgz", + "integrity": "sha512-2f6HS4KIH4laAsNCOfbNX3dRiQosqSY2TRK86C8jtAA/QKGdx+5qlPfYzbI2RjG81iayb2+mVbHIaEaBGZ8sGw==", + "dependencies": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.1", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "3.3.2", + "web3-core": "1.6.0", + "web3-core-helpers": "1.6.0", + "web3-core-method": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-crypto/sha256-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", - "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", - "dev": true, - "optional": true, - "requires": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/sha256-js": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "node_modules/web3-eth-accounts/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" } }, - "@aws-crypto/sha256-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", - "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", - "dev": true, - "optional": true, - "requires": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" - } + "node_modules/web3-eth-accounts/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "@aws-crypto/supports-web-crypto": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", - "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^1.11.1" + "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "@aws-crypto/util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", - "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "^3.110.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "node_modules/web3-eth-contract": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.6.0.tgz", + "integrity": "sha512-ZUtO77zFnxuFtrc+D+iJ3AzNgFXAVcKnhEYN7f1PNz/mFjbtE6dJ+ujO0mvMbxIZF02t9IZv0CIXRpK0rDvZAw==", + "dependencies": { + "@types/bn.js": "^4.11.5", + "web3-core": "1.6.0", + "web3-core-helpers": "1.6.0", + "web3-core-method": "1.6.0", + "web3-core-promievent": "1.6.0", + "web3-core-subscriptions": "1.6.0", + "web3-eth-abi": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/abort-controller": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.200.0.tgz", - "integrity": "sha512-YflVl9JEFjy0cco+40FAocQfFGZ7fR2tnYhQPqXtfCJ9ywikB2PnzN3G6TtvNCFaSG1tLwnI0LZphVbk89sDtw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-eth-ens": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.6.0.tgz", + "integrity": "sha512-AG24PNv9qbYHSpjHcU2pViOII0jvIR7TeojJ2bxXSDqfcgHuRp3NZGKv6xFvT4uNI4LEQHUhSC7bzHoNF5t8CA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.6.0", + "web3-core-helpers": "1.6.0", + "web3-core-promievent": "1.6.0", + "web3-eth-abi": "1.6.0", + "web3-eth-contract": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/client-cognito-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.200.0.tgz", - "integrity": "sha512-9WdOjdayhzL+k5PQibj3l4/luAGs+NJKC5OjIDKEKL54SC9QwsgwTv6Mb+oqm0sQa9FCNieXyZhSHb2aeR60sQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.200.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-eth-iban": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.6.0.tgz", + "integrity": "sha512-HM/bKBS/e8qg0+Eh7B8C/JVG+GkR4AJty17DKRuwMtrh78YsonPj7GKt99zS4n5sDLFww1Imu/ZIk3+K5uJCjw==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "bn.js": "^4.11.9", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/client-sso": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.200.0.tgz", - "integrity": "sha512-EyOSl3hlkrTE9i0bgIvtdvMpCMplmZcLlkMy2mx2LdPKO+AWFOjUN7i5RgpFa7YdZq/csHkcakooJi48OOgSVA==", - "dev": true, - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-eth-personal": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.6.0.tgz", + "integrity": "sha512-8ohf4qAwbShf4RwES2tLHVqa+pHZnS5Q6tV80sU//bivmlZeyO1W4UWyNn59vu9KPpEYvLseOOC6Muxuvr8mFQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "@types/node": "^12.12.6", + "web3-core": "1.6.0", + "web3-core-helpers": "1.6.0", + "web3-core-method": "1.6.0", + "web3-net": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/client-sts": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.200.0.tgz", - "integrity": "sha512-9k3NlHDyaEdv5aUnt6V1wBugIl5fIL7AsKbvIH8+vCDaAknc9+9vLbxkBsskiOAh5rEWFeso60hjNJC+2ky5xQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/fetch-http-handler": "3.200.0", - "@aws-sdk/hash-node": "3.200.0", - "@aws-sdk/invalid-dependency": "3.200.0", - "@aws-sdk/middleware-content-length": "3.200.0", - "@aws-sdk/middleware-endpoint": "3.200.0", - "@aws-sdk/middleware-host-header": "3.200.0", - "@aws-sdk/middleware-logger": "3.200.0", - "@aws-sdk/middleware-recursion-detection": "3.200.0", - "@aws-sdk/middleware-retry": "3.200.0", - "@aws-sdk/middleware-sdk-sts": "3.200.0", - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/middleware-user-agent": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/node-http-handler": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/smithy-client": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "@aws-sdk/util-base64-node": "3.188.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.188.0", - "@aws-sdk/util-defaults-mode-browser": "3.200.0", - "@aws-sdk/util-defaults-mode-node": "3.200.0", - "@aws-sdk/util-endpoints": "3.200.0", - "@aws-sdk/util-user-agent-browser": "3.200.0", - "@aws-sdk/util-user-agent-node": "3.200.0", - "@aws-sdk/util-utf8-browser": "3.188.0", - "@aws-sdk/util-utf8-node": "3.199.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" - }, + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-net": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.6.0.tgz", + "integrity": "sha512-LFfG95ovTT2sNHkO1TEfsaKpYcxOSUtbuwHQ0K3G0e5nevKDJkPEFIqIcob40yiwcWoqEjENJP9Bjk8CRrZ99Q==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "web3-core": "1.6.0", + "web3-core-method": "1.6.0", + "web3-utils": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/config-resolver": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.200.0.tgz", - "integrity": "sha512-eq03XA4sPNJ6C3WbMLR5NPYQmS/S+TdFlNY044rG1ne0Mh+yrNPjIPggu42F4Xr5KtURB97et7bxSx1w7gvDeQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-config-provider": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-providers-http": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.6.0.tgz", + "integrity": "sha512-sNxHFNv3lnxpmULt34AS6M36IYB/Hzm2Et4yPNzdP1XE644D8sQBZQZaJQdTaza5HfrlwoqU6AOK935armqGuA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "web3-core-helpers": "1.6.0", + "xhr2-cookies": "1.1.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.200.0.tgz", - "integrity": "sha512-DrZbo4eGkKvzDEbFSA44iwQjzQSsMZKfU7fnBdA/Qs28TmNZ6oBgO9ljUuEHxhaWgDYxAE70KtJwEqD05IZVuw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-providers-ipc": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.6.0.tgz", + "integrity": "sha512-ETYdfhpGiGoWpmmSJnONvnPfd3TPivHEGjXyuX+L5FUsbMOVZj9MFLNIS19Cx/YGL8UWJ/8alLJoTcWSIdz/aA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "oboe": "2.1.5", + "web3-core-helpers": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/credential-provider-env": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.200.0.tgz", - "integrity": "sha512-I2hlRxEqcwsmr0C44RD083QYJ3nDIZE3K8WBQjNetFi5qTzXlI1usrOlCMfaIbee6k3BBB+cXIX1Vp8RUNkNQQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-providers-ws": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.6.0.tgz", + "integrity": "sha512-eNRmlhOPCpuVYwBrKBBQRLGPFb4U1Uo44r9EWV69Cpo4gP6XeBTl6nkawhLz6DS0fq79apyPfItJVuSfAy77pA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.6.0", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/credential-provider-imds": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.200.0.tgz", - "integrity": "sha512-qvUeUuK2DSQ0eVKijzh1ccOj1xNojVCTf+ENDa2EhXPVQmpERbhQiamTeSkLcKYOtDKxyEK7YBlkczIt/BL2UQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-providers-ws/node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/web3-shh": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.6.0.tgz", + "integrity": "sha512-ymN0OFL81WtEeSyb+PFpuUv39fR3frGwsZnIg5EVPZvrOIdaDSFcGSLDmafUt0vKSubvLMVYIBOCskRD6YdtEQ==", + "hasInstallScript": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "web3-core": "1.6.0", + "web3-core-method": "1.6.0", + "web3-core-subscriptions": "1.6.0", + "web3-net": "1.6.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/credential-provider-ini": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.200.0.tgz", - "integrity": "sha512-6b8CbfxAw7UiWJ2GWSP/RhA2qxgo9iLZOunMqCqOlI627JEZb+oFKTzXwcORrrjpTKbfb/Q6/3ev5yGPonewHw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.6.0.tgz", + "integrity": "sha512-bgCAWAeQnJF035YTFxrcHJ5mGEfTi/McsjqldZiXRwlHK7L1PyOqvXiQLE053dlzvy1kdAxWl/sSSfLMyNUAXg==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "bn.js": "^4.11.9", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@aws-sdk/credential-provider-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.200.0.tgz", - "integrity": "sha512-HpBiMJt+xvHBTf2BjJJwnH+gXf6JapX4cGk3nZlJxE8Uu6P0bIVeFnwD20+yQ5N6Pm0vsJuoA8MNz9vOiPjImg==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-ini": "3.200.0", - "@aws-sdk/credential-provider-process": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/web3-utils/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "@types/node": "*" } }, - "@aws-sdk/credential-provider-process": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.200.0.tgz", - "integrity": "sha512-Juio3viiz/ywrb88viwNxfauaxG+MrD2gMbnCfGEtZgdvix6XBYc6bRd+F94yY23EYWiU1s1tfdlScCIVeYfqA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "node_modules/web3-utils/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web3-utils/node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" } }, - "@aws-sdk/credential-provider-sso": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.200.0.tgz", - "integrity": "sha512-62ktkTAcr51GYshZiQdJcukps1O9QZGwJrVrmY+VdpKwdfSoJygpXmpFGWWlMs+hDkXLcNl3oLOPa3T+fxqN9Q==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/client-sso": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.200.0.tgz", - "integrity": "sha512-++C1vRu/9SJo3MJuC6ARMYfwNKkR2ioq0KDL2b4NQAIyQLgyw0hoOzPlfUgpfvyx0CnPecAoQIY8jGNWfdDSBA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" } }, - "@aws-sdk/credential-providers": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.200.0.tgz", - "integrity": "sha512-YpxALYacNhmcYznlcmNUbXJ3w7Tt49iXgsmx+tQRzMx3m/99E4XWCGCz/4GRAncu7GV2oJYLL5Iyj5HQqR+jVA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.200.0", - "@aws-sdk/client-sso": "3.200.0", - "@aws-sdk/client-sts": "3.200.0", - "@aws-sdk/credential-provider-cognito-identity": "3.200.0", - "@aws-sdk/credential-provider-env": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/credential-provider-ini": "3.200.0", - "@aws-sdk/credential-provider-node": "3.200.0", - "@aws-sdk/credential-provider-process": "3.200.0", - "@aws-sdk/credential-provider-sso": "3.200.0", - "@aws-sdk/credential-provider-web-identity": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "ms": "2.0.0" } }, - "@aws-sdk/fetch-http-handler": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.200.0.tgz", - "integrity": "sha512-sqYUn3sjEWy6Yx/mJXjGQcMxfJ1YsxqPGrE0qmMCa6EP6ENl1BWrX0eutQmwdCq85UiziYqxRpkflJ7nN2Abag==", + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/querystring-builder": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-base64-browser": "3.188.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "iconv-lite": "0.4.24" } }, - "@aws-sdk/hash-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.200.0.tgz", - "integrity": "sha512-iQ0K85BteaiSq7V5LTsMbOSa9RckraOQ3eLtUaJ7u98ywByb7v6H96jfaFdAOAYE0SZ7n2Qp87d+zkHs3kxS5w==", + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "@aws-sdk/invalid-dependency": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.200.0.tgz", - "integrity": "sha512-M3g8U1Nahj9ef2Tqn26j03FIwHwQuIVps39i5P+dWEyFAfFJsdwMtrDI/neXmf7BPcbPFUH9MMcrOJpq/MxYBQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "@aws-sdk/is-array-buffer": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz", - "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/middleware-content-length": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.200.0.tgz", - "integrity": "sha512-GOvtCgP0Q+dYvzWfn06DawaZbDkn+yz8p6R0UaoYMOWvpINFuR6kYu/tz9qjGhZsrjuDqVH+6mj6uuC87fupQQ==", - "dev": true, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/middleware-endpoint": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.200.0.tgz", - "integrity": "sha512-r0OkdhjYqdv/iYM3KXj6LubQFZbM848FhAVuEiJEUNBFpUvhS6pCkmjhkd5QIUT+bhiD0gUj1OFzIHhQaHwyWA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/middleware-serde": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/url-parser": "3.200.0", - "@aws-sdk/util-config-provider": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-sdk/middleware-host-header": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.200.0.tgz", - "integrity": "sha512-oFRSUBXGBw6+QiOXgzu3cTPqAN97y+Lc3z2mDS3wJRqA4/Wmdzx/oTWhB5G0IsYSJHTevhZhfQPBLbhK5Ffehw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "@aws-sdk/middleware-logger": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.200.0.tgz", - "integrity": "sha512-uTtu1bCDqKQNLoZ0MkEsn102T4itNC5o7U+FDNSRHKYHPY6o1MbS9nbcOKywMDBqhEit5nNKCw9vOoz49N6zpw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" } }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.200.0.tgz", - "integrity": "sha512-3Y5UaBBuBs3EE1NgYexhnOdFfozyxHvz4f/452b1K55IigJvovTl3TI46tFEkXiqhRs9bJZ/DiuakbsGfiKMFQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/winston": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "@aws-sdk/middleware-retry": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.200.0.tgz", - "integrity": "sha512-9YVofOwxocbNDfTcNQfWJsOA9MVdZIu0T6or0fr54cn1q0WJ69IoFeHVUmCiOXy9HRTop3GC6Fyc5pQmjaRRcQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/service-error-classification": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - } + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" } }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.200.0.tgz", - "integrity": "sha512-1kZVgK+hk5F4oFMbzjzvv5qZ4DXJfpXOrHRu7dpmOeV8KL+NKYqYq7BeToDMjTTTq8atTHlDyQ4YrlgaOHyVCQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/middleware-signing": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/winston/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/with-callback": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==", + "engines": { + "node": ">=4" } }, - "@aws-sdk/middleware-serde": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.200.0.tgz", - "integrity": "sha512-NDYLVC7UxIDvu906itssEJE5yobPdVhMuE3Ef3MEMk3UTawd8f7lmo40kzFDBS3cW/c4jluGiTsN8r+8fPc3oA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" } }, - "@aws-sdk/middleware-signing": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.200.0.tgz", - "integrity": "sha512-Guztdq7i/ZNWR68InHUJpSYpg668rNt+2N5z14SlWrZ8cup6ZHy3bRgzqClAPiXuHPKx9r9ysvczT6jCCyy+Xg==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/signature-v4": "3.200.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-middleware": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" } }, - "@aws-sdk/middleware-stack": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.200.0.tgz", - "integrity": "sha512-j2uSX4Bv347/14zXz7v/PKcTvE/AXQbXu+BQ1IQgqji7e3AT9QYJMsUD4TMK0SLYvCfBEtpfDXkA6WitT/ZPSA==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "@aws-sdk/middleware-user-agent": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.200.0.tgz", - "integrity": "sha512-RZ3cfaIIC3+xjm+raEb1xfOB/kJsH99mHHcVkOeGuKGzzYAG8wG1N6EYOZgqO2SaNsr87sx9fxCAd8A4X0wgRA==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "color-name": "1.1.3" } }, - "@aws-sdk/node-config-provider": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.200.0.tgz", - "integrity": "sha512-TUZB/7JZfFQ6Ra4AhFCt64JvScosSkNZmhBE3a5Wdbh1uQlhVoczMumWPs1Gsl9awmYGipsDhZybTeI9r0b66w==", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/shared-ini-file-loader": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "@aws-sdk/node-http-handler": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.200.0.tgz", - "integrity": "sha512-foqNf0qsHTdClogmtlzJgPk8/s/kEOjAnkMVwJwBPEjVTxTN8i5oC4rXUsPIZ7LOYBTz2QQGkl3vY6BBFMmVGw==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/abort-controller": "3.200.0", - "@aws-sdk/protocol-http": "3.200.0", - "@aws-sdk/querystring-builder": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "@aws-sdk/property-provider": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.200.0.tgz", - "integrity": "sha512-KABh7LSkcWXCkilBa/WY2PvyR5vRMn1nwa2HYu9s1UToHbPCxIG0/ybtQfWNwVR4x5AtNODQYZBqxpBYUwau8w==", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "peer": true, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" } }, - "@aws-sdk/protocol-http": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.200.0.tgz", - "integrity": "sha512-P61hkZtXXaTTk/ap+WCOxX/IIRCH1lTap6Yy8RigcDmblh/BE+vDRqqRiTebIq/pWgOzQ67OjFJLxDkkS/OMKQ==", - "dev": true, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "@aws-sdk/querystring-builder": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.200.0.tgz", - "integrity": "sha512-r4q7oUkcYsnxeVaIUEPGEPPobyn1CpAn7NmeuK8c3Lq4MrcfTx11aQMEtklmW+hvzavNPFxgYyUNiDuIyiVd6A==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-uri-escape": "3.188.0", - "tslib": "^2.3.1" + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, - "@aws-sdk/querystring-parser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.200.0.tgz", - "integrity": "sha512-9C6c+fas2hMqvuCK8m7vwMqLb5W/x1Wib9yYJnBx40bOSdnOADRoRQitxCE07Iuq8aeHjPZYn1IhLhE9i9EmOg==", - "dev": true, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "engines": { + "node": ">=8" } }, - "@aws-sdk/service-error-classification": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.200.0.tgz", - "integrity": "sha512-MFaMIJ/3v3C0XDerJDEfNYEquQXysnKtvuJJJWqPOPXMxCls4u8utyeXv0E6wO8ast6UW5xJKtzqEFRQ3t/+7w==", - "dev": true, - "optional": true + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } }, - "@aws-sdk/shared-ini-file-loader": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.200.0.tgz", - "integrity": "sha512-K7PxcJSsZ3ExdVsa6HP0l9f2kzsEeIfBn1bTBYsaacKmLeb1eUom+egSf5zr6cNmuyhPvKv0W7SbqYNC9MWTXg==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" } }, - "@aws-sdk/signature-v4": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.200.0.tgz", - "integrity": "sha512-2xMRWwfHTIthwV97/ubWFnXwzh4lMEXcAzPTpuqGljAaG5mtExUTkAQqoNuJqt4wLconkN6QBbhN5fREtkUlRQ==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/is-array-buffer": "3.188.0", - "@aws-sdk/types": "3.200.0", - "@aws-sdk/util-hex-encoding": "3.188.0", - "@aws-sdk/util-middleware": "3.200.0", - "@aws-sdk/util-uri-escape": "3.188.0", - "tslib": "^2.3.1" - }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "xhr-request": "^1.1.0" } }, - "@aws-sdk/smithy-client": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.200.0.tgz", - "integrity": "sha512-3tZHcvTHADz9H7su9w/fOJavOOAsC5olYfVVgeqteaHaSojFOaNm8fD4KvluSAIDpHyHZPVPLZIHwcEwuc7j9A==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/middleware-stack": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, + "node_modules/xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "cookiejar": "^2.1.1" } }, - "@aws-sdk/types": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.200.0.tgz", - "integrity": "sha512-4BfspYfvSwscstd5kUPAABu2rs6OfPZLKKq17frsNt6k3ax2WeHBsp3KIaOmqr0WDQnEBPjJginTB4uVsiSkdA==", - "dev": true, - "optional": true + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, - "@aws-sdk/url-parser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.200.0.tgz", - "integrity": "sha512-scoAdYsBRBcg4gNKcwVUZrQ4C/ewYWo2JLRjWcaptcGfcdCWcl6905iTzcE/n1OhmaqWJsmUL6YL5ERr/4x8lA==", + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/querystring-parser": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, - "@aws-sdk/util-base64-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", - "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "engines": { + "node": ">=4.0" } }, - "@aws-sdk/util-base64-node": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz", - "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "engines": { + "node": ">=0.4.0" } }, - "@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" } }, - "@aws-sdk/util-body-length-node": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz", - "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" } }, - "@aws-sdk/util-buffer-from": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz", - "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/is-array-buffer": "3.188.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" } }, - "@aws-sdk/util-config-provider": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz", - "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==", + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "@aws-sdk/util-defaults-mode-browser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.200.0.tgz", - "integrity": "sha512-WDFXifeo617AjCLd6ltddPDNvC7gsbCMQgUdXsuHt+paplyjqHF20jCU1+WXvFaTU5Ia1lN+SGDJb1nB1jawkw==", - "dev": true, - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, + "node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" } }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.200.0.tgz", - "integrity": "sha512-1S/Y/KzKnK/aCqQiPR3JUlXv8NWjHiuuGUB1po3neeWnsld10Q4o2ScWWT/v+XCXFac7ublX6yjrCQ+1YBZNCw==", + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/config-resolver": "3.200.0", - "@aws-sdk/credential-provider-imds": "3.200.0", - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/property-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" } }, - "@aws-sdk/util-endpoints": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.200.0.tgz", - "integrity": "sha512-qBPq/nVziDixIp8dLxL0Q+03JPy9HuJmL0sREHaE4sIHL1/g4gutXCQe5oYS4de82xSe4uNZo9qVBYW96h6m6A==", + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=10" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/util-hex-encoding": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz", - "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==", + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" + "engines": { + "node": ">=10" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/util-locate-window": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz", - "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==", + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "@aws-sdk/util-middleware": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.200.0.tgz", - "integrity": "sha512-yMC4pg9z31AxnvC9f2M+D7L1KCh6NgykPsNqQQxTz6fFIt/nXNc10eqYaVCJCn419bcSgQhtVDJ2RAudrCCabg==", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "@aws-sdk/util-uri-escape": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz", - "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "optional": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.200.0.tgz", - "integrity": "sha512-985Qtcw813q3UanTakl17OJzdVRcw6p1lIl1Xww1CmuA9sW6X8+q6oQavnmXtACMd059sTUR/f+V4Yloya2Pmg==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/types": "3.200.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "engines": { + "node": ">=6" } }, - "@aws-sdk/util-user-agent-node": { - "version": "3.200.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.200.0.tgz", - "integrity": "sha512-3dgMp31enW37VMg7GZDq5xhohEMo8mocwafQ1pKND/NDEjha9df3nk6Oy4F5Y2pG8GPdFvHnsTqJ6FJKwwYtxA==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.200.0", - "@aws-sdk/types": "3.200.0", - "tslib": "^2.3.1" + "engines": { + "node": ">=10" }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@aws-sdk/util-utf8-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", - "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "node_modules/zip-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/zip-object/-/zip-object-0.1.0.tgz", + "integrity": "sha512-eujiZK9Z3F/WuswEIWqlaNUwUj67oRw4Op5a1VeKw4n9XBkV7EdxtgblroWBYvLmD7XqZ1cjqsbmE3jU43prTA==" + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "optional": true, "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "optional": true - } + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "@aws-sdk/util-utf8-node": { - "version": "3.199.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.199.0.tgz", - "integrity": "sha512-Kk3qCdGbe5k0PUE8EBgMsRxNstvDCoWStYWjNwsHWuc/hJitSf44PColzXw6xxHqH1sY+6LcgIaMwJZ5C4bB6w==", + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "optional": true, "requires": { - "@aws-sdk/util-buffer-from": "3.188.0", - "tslib": "^2.3.1" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, "@babel/compat-data": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz", - "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { "debug": { @@ -24479,168 +22146,154 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.0.tgz", - "integrity": "sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, "requires": { - "@babel/types": "^7.20.0", + "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true }, "@babel/helpers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz", - "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -24697,9 +22350,9 @@ } }, "@babel/parser": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.0.tgz", - "integrity": "sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -24712,30 +22365,30 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.0.tgz", - "integrity": "sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -24752,13 +22405,13 @@ } }, "@babel/types": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.0.tgz", - "integrity": "sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", "to-fast-properties": "^2.0.0" } }, @@ -24881,19 +22534,19 @@ } }, "@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/abstract-provider": { @@ -24999,24 +22652,6 @@ "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - } } }, "@ethersproject/hash": { @@ -25081,13 +22716,6 @@ "requires": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } } }, "@ethersproject/logger": { @@ -25291,9 +22919,9 @@ } }, "@firebase/app-types": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.1.tgz", - "integrity": "sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", "peer": true }, "@firebase/auth-interop-types": { @@ -25445,9 +23073,9 @@ }, "dependencies": { "@types/node": { - "version": "18.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.8.tgz", - "integrity": "sha512-uGwPWlE0Hj972KkHtCDVwZ8O39GmyjfMane1Z3GUBGGnkZ2USDq7SxLpVIiIHpweY9DS0QTDH0Nw7RNBsAAZ5A==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "optional": true } } @@ -25902,19 +23530,20 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -25924,25 +23553,25 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "requires": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -25964,9 +23593,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -25978,6 +23607,15 @@ } } }, + "@mongodb-js/saslprep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "dev": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "@phc/format": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", @@ -26110,9 +23748,9 @@ "dev": true }, "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "@types/agenda": { @@ -26126,13 +23764,13 @@ } }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -26158,12 +23796,12 @@ } }, "@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/bn.js": { @@ -26193,25 +23831,25 @@ } }, "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "requires": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==" }, "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "requires": { "@types/node": "*" @@ -26228,9 +23866,12 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" }, "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "requires": { + "@types/node": "*" + } }, "@types/eslint-visitor-keys": { "version": "1.0.0", @@ -26239,26 +23880,27 @@ "dev": true }, "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "@types/fs-extra": { @@ -26275,6 +23917,12 @@ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -26307,23 +23955,23 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/keyv": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz", - "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { - "keyv": "*" + "@types/node": "*" } }, "@types/lodash": { - "version": "4.14.187", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", - "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", "dev": true }, "@types/long": { @@ -26332,9 +23980,9 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, "@types/minimatch": { @@ -26389,9 +24037,9 @@ } }, "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "@types/range-parser": { @@ -26416,12 +24064,23 @@ "@types/node": "*" } }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "requires": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -26445,14 +24104,19 @@ "dev": true }, "@types/superagent": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", - "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", + "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", "requires": { "@types/cookiejar": "*", "@types/node": "*" } }, + "@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, "@types/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -26819,6 +24483,15 @@ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -26847,36 +24520,55 @@ "dev": true }, "array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", + "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "optional": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -26897,9 +24589,9 @@ } }, "assert-options": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.7.0.tgz", - "integrity": "sha512-7q9uNH/Dh8gFgpIIb9ja8PJEWA5AQy3xnBC8jtKs8K/gNVCr1K6kIvlm59HUyYgvM7oEDoLzGgPcGd9FqhtXEQ==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.0.tgz", + "integrity": "sha512-qSELrEaEz4sGwTs4Qh+swQkjiHAysC4rot21+jzXU86dJzNG+FDqBzyS3ohSoTRf4ZLA3FSwxQdiuNl5NXUtvA==" }, "assert-plus": { "version": "1.0.0", @@ -26931,9 +24623,9 @@ }, "dependencies": { "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, @@ -26995,30 +24687,18 @@ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "axios": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz", - "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" - }, - "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } } }, "babel-jest": { @@ -27223,9 +24903,9 @@ } }, "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" }, "binary-extensions": { "version": "2.2.0", @@ -27259,9 +24939,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -27311,12 +24991,12 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -27324,7 +25004,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -27361,13 +25041,6 @@ "hoek": "6.x.x" } }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true, - "optional": true - }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -27582,15 +25255,15 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" } }, "bs-logger": { @@ -27630,25 +25303,10 @@ } }, "bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", - "dev": true, - "requires": { - "buffer": "^5.6.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.0.0.tgz", + "integrity": "sha512-FoWvdELfF2wQaUo8S/a1Rh2BDwJEUancDDnzdTpYymJTZjmvRpLWoqRPelKn+XSeh5D4YddWDG66cLtEhGGvcg==", + "dev": true }, "buffer": { "version": "4.9.2", @@ -27741,9 +25399,9 @@ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -27823,9 +25481,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001429", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz", - "integrity": "sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true }, "capture-exit": { @@ -27848,9 +25506,9 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "cborg": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.9.5.tgz", - "integrity": "sha512-fLBv8wmqtlXqy1Yu+pHzevAIkW6k2K0ZtMujNzWphLsA34vzzg9BHn+5GmZqOJkSA9V7EMKsWrf6K976c1QMjQ==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz", + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==" }, "celebrate": { "version": "9.1.0", @@ -27862,13 +25520,13 @@ } }, "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -27876,17 +25534,28 @@ } }, "chai-http": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", - "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz", + "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==", "requires": { "@types/chai": "4", - "@types/superagent": "^3.8.3", - "cookiejar": "^2.1.1", + "@types/superagent": "4.1.13", + "charset": "^1.0.1", + "cookiejar": "^2.1.4", "is-ip": "^2.0.0", "methods": "^1.1.2", - "qs": "^6.5.1", - "superagent": "^3.7.0" + "qs": "^6.11.2", + "superagent": "^8.0.9" + }, + "dependencies": { + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + } } }, "chalk": { @@ -27905,6 +25574,11 @@ "dev": true, "peer": true }, + "charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==" + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -27927,9 +25601,9 @@ }, "dependencies": { "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -27955,9 +25629,9 @@ } }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -28394,9 +26068,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { "version": "1.9.0", @@ -28415,9 +26089,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "copy-descriptor": { "version": "0.1.1", @@ -28515,11 +26189,11 @@ } }, "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "requires": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "cross-spawn": { @@ -28907,9 +26581,9 @@ } }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "decompress-response": { "version": "3.3.0", @@ -28920,34 +26594,37 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "requires": { "type-detect": "^4.0.0" } }, "deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "optional": true, "requires": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", - "object-is": "^1.1.4", + "object-is": "^1.1.5", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" + "which-typed-array": "^1.1.9" }, "dependencies": { "isarray": { @@ -28981,11 +26658,22 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, + "define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -29028,10 +26716,9 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depd": { "version": "2.0.0", @@ -29039,9 +26726,9 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -29058,9 +26745,9 @@ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==" }, "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" }, "detect-newline": { "version": "2.1.0", @@ -29068,6 +26755,15 @@ "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", "dev": true }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "dicer": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.1.tgz", @@ -29231,9 +26927,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -29314,9 +27010,9 @@ } }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "elegant-spinner": { @@ -29381,9 +27077,9 @@ } }, "engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", "requires": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -29393,8 +27089,8 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" }, "dependencies": { "cookie": { @@ -29411,21 +27107,21 @@ } }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "requires": {} } } }, "engine.io-client": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", - "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", + "engine.io-parser": "~5.2.1", "ws": "~8.11.0", "xmlhttprequest-ssl": "~2.0.0" }, @@ -29447,9 +27143,9 @@ } }, "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==" }, "ent": { "version": "2.2.0", @@ -29485,34 +27181,49 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" } }, "es-array-method-boxes-properly": { @@ -29521,18 +27232,19 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "dependencies": { "isarray": { @@ -29542,6 +27254,16 @@ } } }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -29724,9 +27446,9 @@ "peer": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true }, @@ -29812,9 +27534,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "peer": true, "requires": { @@ -29965,6 +27687,11 @@ "minimalistic-assert": "^1.0.0" } }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -30004,6 +27731,13 @@ "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + } } }, "eth-lib": { @@ -30066,13 +27800,6 @@ "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "requires": { "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } } }, "ethereum-checksum-address": { @@ -30107,9 +27834,9 @@ }, "dependencies": { "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -30216,24 +27943,6 @@ "@ethersproject/wallet": "5.7.0", "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - } } }, "ethjs-unit": { @@ -30527,6 +28236,25 @@ "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -30539,6 +28267,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } } } }, @@ -30673,15 +28412,15 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-fifo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.1.0.tgz", - "integrity": "sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -30693,22 +28432,17 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "fast-text-encoding": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", "optional": true }, - "fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", - "dev": true, - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, "faye-websocket": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", @@ -30956,9 +28690,9 @@ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -30966,9 +28700,15 @@ } }, "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + } }, "forwarded": { "version": "0.2.0", @@ -31010,6 +28750,21 @@ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "fs.realpath": { @@ -31066,14 +28821,14 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functional-red-black-tree": { @@ -31152,26 +28907,29 @@ } }, "gcp-metadata": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", - "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dev": true, "optional": true, + "peer": true, "requires": { - "gaxios": "^2.1.0", - "json-bigint": "^0.3.0" + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" }, "dependencies": { "gaxios": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", - "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dev": true, "optional": true, + "peer": true, "requires": { - "abort-controller": "^3.0.0", "extend": "^3.0.2", "https-proxy-agent": "^5.0.0", "is-stream": "^2.0.0", - "node-fetch": "^2.3.0" + "node-fetch": "^2.6.9" } } } @@ -31223,12 +28981,13 @@ "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -31287,9 +29046,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -31374,6 +29133,14 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, "google-auth-library": { "version": "5.10.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", @@ -31403,6 +29170,25 @@ "is-stream": "^2.0.0", "node-fetch": "^2.3.0" } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "json-bigint": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", + "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", + "optional": true, + "requires": { + "bignumber.js": "^9.0.0" + } } } }, @@ -31430,9 +29216,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "optional": true } } @@ -31454,6 +29240,14 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -31485,14 +29279,14 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" + "version": "16.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.0.tgz", + "integrity": "sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==" }, "graphql-request": { "version": "4.3.0", @@ -31502,6 +29296,18 @@ "cross-fetch": "^3.1.5", "extract-files": "^9.0.0", "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "growl": { @@ -31770,6 +29576,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -31851,6 +29662,11 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -31887,9 +29703,9 @@ "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-errors": { "version": "2.0.0", @@ -32239,11 +30055,11 @@ "integrity": "sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==" }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -32365,23 +30181,25 @@ } }, "ipfs-utils": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.7.tgz", - "integrity": "sha512-Umvb0Zydy2zZiTmQBGLfLISr8vOmXX8cxEIP+N8zGHrtRShG/j32yl1xd/BtS+Hbg0FIbVm3opwvxB2gmta0YA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-9.0.14.tgz", + "integrity": "sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==", "requires": { "any-signal": "^3.0.0", + "browser-readablestream-to-it": "^1.0.0", "buffer": "^6.0.1", "electron-fetch": "^1.7.2", "err-code": "^3.0.1", "is-electron": "^2.2.0", "iso-url": "^1.1.5", + "it-all": "^1.0.4", "it-glob": "^1.0.1", "it-to-stream": "^1.0.0", "merge-options": "^3.0.4", "nanoid": "^3.1.20", "native-fetch": "^3.0.0", - "node-fetch": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "react-native-fetch-api": "^2.0.0", + "node-fetch": "^2.6.8", + "react-native-fetch-api": "^3.0.0", "stream-to-it": "^0.2.2" }, "dependencies": { @@ -32398,10 +30216,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "node-fetch": { - "version": "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-iTASGs+HTFK5E4ZqcMsHmeJ4zodyq8L38lZV33jwqcBJYoUt3HjN4+ot+O9/0b+ke8ddE7UgOtVuZN/OkV19/g==" } } }, @@ -32439,6 +30253,16 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -32491,9 +30315,9 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "requires": { "has": "^1.0.3" } @@ -32527,9 +30351,9 @@ } }, "is-electron": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.1.tgz", - "integrity": "sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" }, "is-extendable": { "version": "1.0.1", @@ -32755,15 +30579,11 @@ } }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -32882,9 +30702,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -32923,9 +30743,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "supports-color": { @@ -32987,9 +30807,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -33670,9 +31490,9 @@ } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, @@ -33989,9 +31809,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "supports-color": { @@ -34260,9 +32080,9 @@ } }, "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "js-tokens": { "version": "4.0.0", @@ -34348,10 +32168,12 @@ "dev": true }, "json-bigint": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", - "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, "optional": true, + "peer": true, "requires": { "bignumber.js": "^9.0.0" } @@ -34389,9 +32211,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { @@ -34453,9 +32275,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -34568,9 +32390,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -34585,9 +32407,9 @@ } }, "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "requires": { "json-buffer": "3.0.1" } @@ -34802,11 +32624,12 @@ } }, "logform": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", - "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "requires": { "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", @@ -34841,9 +32664,9 @@ } }, "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "requires": { "get-func-name": "^2.0.0" } @@ -34862,9 +32685,9 @@ } }, "luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==" }, "mailgun-js": { "version": "0.22.0", @@ -34916,9 +32739,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -34983,7 +32806,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "devOptional": true }, "memorystream": { "version": "0.3.1", @@ -35089,8 +32912,7 @@ "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "optional": true + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mime-db": { "version": "1.52.0", @@ -35143,9 +32965,9 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minimist-options": { "version": "3.0.2", @@ -35169,19 +32991,9 @@ } }, "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, "minizlib": { "version": "2.1.2", @@ -35192,6 +33004,14 @@ "yallist": "^4.0.0" }, "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -35508,31 +33328,28 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", - "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", "requires": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" } }, "mongodb": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.11.0.tgz", - "integrity": "sha512-9l9n4Nk2BYZzljW3vHah3Z0rfS5npKw6ktnkmFgTcnzaXH1DRm3pDl6VMHu84EVb1lzmSaJC4OzWZqTkB5i2wg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.0.0.tgz", + "integrity": "sha512-wUIYesF4DTyDccm0noE5TwGi9ISdXUAi9T2cQ4xPc+EUBZG44bfMVt2ecOG5Ypca7eCz3oRpJm6YI6c7jAnuNw==", "dev": true, "requires": { - "@aws-sdk/credential-providers": "^3.186.0", - "bson": "^4.7.0", - "denque": "^2.1.0", - "mongodb-connection-string-url": "^2.5.4", - "saslprep": "^1.0.3", - "socks": "^2.7.1" + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.0.0", + "mongodb-connection-string-url": "^2.6.0" } }, "mongodb-connection-string-url": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz", - "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", "dev": true, "requires": { "@types/whatwg-url": "^8.2.1", @@ -35567,15 +33384,15 @@ } }, "mongoose": { - "version": "5.13.15", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz", - "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==", + "version": "5.13.20", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.20.tgz", + "integrity": "sha512-TjGFa/XnJYt+wLmn8y9ssjyO2OhBMeEBtOHb9iJM16EWu2Du6L1Q6zSiEK2ziyYQM8agb4tumNIQFzqbxId7MA==", "requires": { "@types/bson": "1.x || 4.0.x", "@types/mongodb": "^3.5.27", "bson": "^1.1.4", "kareem": "2.3.2", - "mongodb": "3.7.3", + "mongodb": "3.7.4", "mongoose-legacy-pluralize": "1.0.2", "mpath": "0.8.4", "mquery": "3.2.5", @@ -35601,15 +33418,10 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, "mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", @@ -35740,9 +33552,9 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -35956,9 +33768,9 @@ "integrity": "sha512-O84Y3Qx6UPRNGSApxHQ2xtp3xHOOhYK99JQaJ2phanHIA/JTIEJLvzV6bUwzVz2k3nFwEOfaqzgpUH8QME1BzA==" }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "nanomatch": { "version": "1.2.13", @@ -36013,9 +33825,9 @@ "dev": true }, "node-addon-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, "node-docker-api": { "version": "1.1.22", @@ -36027,9 +33839,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" }, @@ -36061,9 +33873,9 @@ "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" }, "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==" }, "node-int64": { "version": "0.4.0", @@ -36085,9 +33897,9 @@ } }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node-schedule": { @@ -36101,9 +33913,9 @@ } }, "nodemon": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", - "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", "dev": true, "requires": { "chokidar": "^3.5.2", @@ -36125,9 +33937,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "supports-color": { @@ -36161,11 +33973,11 @@ }, "dependencies": { "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -36222,9 +34034,9 @@ } }, "nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "oauth-sign": { @@ -36311,9 +34123,9 @@ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-is": { "version": "1.1.5", @@ -36351,15 +34163,16 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dev": true, "requires": { - "array.prototype.reduce": "^1.0.4", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" } }, "object.pick": { @@ -36417,9 +34230,9 @@ } }, "openpgp": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.5.0.tgz", - "integrity": "sha512-SpwcJnxrK9Y0HRM6KxSFqkAEOSWEabCH/c8dII/+y2e5f6KvuDG5ZE7JXaPBaVJNE4VUZZeTphxXDoZD0KOHrw==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.10.1.tgz", + "integrity": "sha512-SR5Ft+ej51d0+p53ld5Ney0Yiz0y8Mh1YYLJrvpRMbTaNhvS1QcDX0Oq1rW9sjBnQXtgrpWw2Zve3rm7K5C/pw==", "requires": { "asn1.js": "^5.0.0" } @@ -36639,9 +34452,9 @@ } }, "parse-duration": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.0.2.tgz", - "integrity": "sha512-Dg27N6mfok+ow1a2rj/nRjtCfaKrHUZV2SJpEn/s8GaVUSlf4GGRCRP1c13Hj+wfPKVMrFDqLMLITkYKgKxyyg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz", + "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==" }, "parse-headers": { "version": "2.0.5", @@ -36769,9 +34582,9 @@ } }, "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "pg-int8": { "version": "1.0.1", @@ -36784,26 +34597,26 @@ "integrity": "sha512-1KdmFGGTP6jplJoI8MfvRlfvMiyBivMRP7/ffh4a11RUFJ7kC2J0ZHlipoKiH/1hz+DVgceon9U2qbaHpPeyPg==" }, "pg-pool": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", - "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "requires": {} }, "pg-promise": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.12.1.tgz", - "integrity": "sha512-SiJkBUDGq7PNfJFJbWferodsSH+vLrhte0Q0kVgQbwlNYeKmp9Hhkr+357+5DWEuBGOHhSu1UQffSSf5HVqRtA==", + "version": "10.15.4", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.15.4.tgz", + "integrity": "sha512-BKlHCMCdNUmF6gagVbehRWSEiVcZzPVltEx14OJExR9Iz9/1R6KETDWLLGv2l6yRqYFnEZZy1VDjRhArzeIGrw==", "requires": { - "assert-options": "0.7.0", + "assert-options": "0.8.0", "pg": "8.8.0", "pg-minify": "1.6.2", "spex": "3.2.0" } }, "pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, "pg-types": { "version": "2.2.0", @@ -36858,9 +34671,9 @@ } }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { @@ -36969,9 +34782,9 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -37189,15 +35002,15 @@ "integrity": "sha512-hsF8r05ZnypT00IZTC71Ejiu9A7kyyVfHpdl3faasOHNJX62sNPfE8vDAz6P27RJ31i2O5ruhc6JV5xWR6GElQ==" }, "promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", + "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", "requires": { "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "iterate-value": "^1.0.2" } }, @@ -37220,9 +35033,9 @@ } }, "protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -37240,9 +35053,9 @@ }, "dependencies": { "@types/node": { - "version": "18.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.8.tgz", - "integrity": "sha512-uGwPWlE0Hj972KkHtCDVwZ8O39GmyjfMane1Z3GUBGGnkZ2USDq7SxLpVIiIHpweY9DS0QTDH0Nw7RNBsAAZ5A==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" } } }, @@ -37376,9 +35189,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { "version": "6.11.0", @@ -37448,9 +35261,9 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -37476,9 +35289,9 @@ "dev": true }, "react-native-fetch-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz", - "integrity": "sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz", + "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==", "requires": { "p-defer": "^3.0.0" } @@ -37543,9 +35356,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -37613,13 +35426,13 @@ "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" } }, "regexpp": { @@ -37952,6 +35765,24 @@ "tslib": "^1.9.0" } }, + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -37977,9 +35808,9 @@ } }, "safe-stable-stringify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", - "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" }, "safer-buffer": { "version": "2.1.2", @@ -38156,6 +35987,15 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -38274,9 +36114,9 @@ } }, "simple-update-notifier": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", - "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "dev": true, "requires": { "semver": "~7.0.0" @@ -38522,16 +36362,17 @@ } }, "socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "dependencies": { "debug": { @@ -38545,18 +36386,29 @@ } }, "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } }, "socket.io-client": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", - "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.4.0", + "engine.io-client": "~6.5.2", "socket.io-parser": "~4.2.4" }, "dependencies": { @@ -38590,20 +36442,18 @@ } }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" }, "dependencies": { "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" } } }, @@ -38623,20 +36473,6 @@ "requires": { "es6-promisify": "^5.0.0" } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } } } }, @@ -38699,15 +36535,15 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, + "devOptional": true, "requires": { "memory-pager": "^1.0.2" } }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -38728,9 +36564,9 @@ } }, "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" }, "spex": { "version": "3.2.0", @@ -38752,9 +36588,9 @@ } }, "split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, "sprintf-js": { "version": "1.0.3", @@ -38900,6 +36736,14 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==" }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -38965,24 +36809,34 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "strip-ansi": { @@ -39028,13 +36882,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "optional": true - }, "stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", @@ -39042,63 +36889,50 @@ "optional": true }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "ms": "2.1.2" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "yallist": "^4.0.0" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { - "safe-buffer": "~5.1.0" + "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -39177,9 +37011,9 @@ } }, "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -39298,13 +37132,13 @@ } }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -39636,9 +37470,9 @@ "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==" }, "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" }, "ts-jest": { "version": "24.3.0", @@ -39659,9 +37493,9 @@ } }, "ts-luxon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-4.0.1.tgz", - "integrity": "sha512-y7wCmgQ1sIjDUheejmLIOz08XeJ8sQ75m4zKd2ppI4OgTbQIuW8e4ZfNyp75zgomSZGi0I/PIiaHSYdrHd+tiQ==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-4.4.0.tgz", + "integrity": "sha512-da38ShNr8dHAXEMg2sBwecOmNus2Fd7Q4h/MAXUve00NVxaeEbR0DMbF2UECBCy22qKPN6F6fypfDdVUniLTEw==" }, "ts-node": { "version": "10.9.1", @@ -39748,12 +37582,12 @@ } }, "tsconfig-paths": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz", - "integrity": "sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "requires": { - "json5": "^2.2.1", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -39832,12 +37666,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -39921,6 +37755,49 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -40292,9 +38169,9 @@ "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==" }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -40521,16 +38398,18 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.2.tgz", + "integrity": "sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "object.getownpropertydescriptors": "^2.1.6", + "safe-array-concat": "^1.0.0" } }, "utils-merge": { @@ -40862,6 +38741,24 @@ "requires": { "@ethersproject/abi": "5.0.7", "web3-utils": "1.6.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + } } }, "web3-eth-accounts": { @@ -41175,22 +39072,21 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, "wide-align": { @@ -41210,9 +39106,9 @@ } }, "winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "requires": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -41250,9 +39146,9 @@ "integrity": "sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==" }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" }, "wordwrap": { "version": "1.0.0", diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts index e98bd17..aa6c877 100644 --- a/snode/src/services/messaging-common/messageBlock.ts +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -336,13 +336,14 @@ export class MessageBlockUtil { * And for every recipient finds which shard will host this address * * @param block + * @param shardCount total amount of shards; see smart contract for this value * @returns a set of shard ids */ - static calculateAffectedShards(block: Readonly): Set { + static calculateAffectedShards(block: Readonly, shardCount:number): Set { const shards = new Set() for (const fi of block.responses) { for (const recipient of fi.header.recipientsResolved) { - let shardId = this.calculateAffectedShard(recipient.addr); + let shardId = this.calculateAffectedShard(recipient.addr, shardCount); if (shardId == null) { this.log.error('cannot calculate shardId for recipient %o in %o', recipient, fi); continue; @@ -357,7 +358,9 @@ export class MessageBlockUtil { // eip155:5:0xD8634C39BBFd4033c0d3289C4515275102423681 -> d8 -> 216 // and use it as shard // 2) take sha256(addr) -> - public static calculateAffectedShard(recipientAddr: string): number | null { + // shard count is a smart contract constant; normally it should never change + // lets read this value from a contract + public static calculateAffectedShard(recipientAddr: string, shardCount:number): number | null { if (StrUtil.isEmpty(recipientAddr)) { return null; } @@ -377,7 +380,8 @@ export class MessageBlockUtil { } Check.notNull(shardId); Check.isTrue(shardId >= 0 && shardId <= 255 && NumUtil.isRoundedInteger(shardId)); - return shardId; + Check.isTrue(shardCount >= 1); + return shardId % shardCount; } public static checkBlock(block: MessageBlock, validatorsFromContract: Set): CheckResult { diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 090ee73..6b42445 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -1,4 +1,4 @@ -import {Service} from "typedi"; +import {Inject, Service} from "typedi"; import {Logger} from "winston"; import {WinstonUtil} from "../../utilz/winstonUtil"; import {EnvLoader} from "../../utilz/envLoader"; @@ -9,10 +9,15 @@ import fs, {readFileSync} from "fs"; import {ValidatorCtClient} from "./validatorContractState"; import {BitUtil} from "../../utilz/bitUtil"; import {EthersUtil} from "../../utilz/ethersUtil"; +import {CollectionUtil} from "../../utilz/collectionUtil"; +import StorageNode from "../messaging/storageNode"; @Service() export class StorageContractState { public log: Logger = WinstonUtil.newLog(StorageContractState); + @Inject(type => StorageNode) + private storageNode: StorageNode; + private provider: JsonRpcProvider private abi: string private rpcEndpoint: string @@ -26,6 +31,9 @@ export class StorageContractState { // CONTRACT STATE private storageCtAddr: string private storageCt: StorageContract; + public rf: number; + public shardCount: number; + public nodeShards: Set; public async postConstruct() { this.log.info('postConstruct()') @@ -39,8 +47,8 @@ export class StorageContractState { this.configDir = EnvLoader.getPropertyOrFail('CONFIG_DIR') this.abi = EthersUtil.loadAbi(this.configDir, 'StorageV1.json') this.storageCt = await this.buildRWClient(); - await this.readContractState(); // todo - await this.subscribeToContractChanges(); // todo + await this.readContractState(); + await this.subscribeToContractChanges(); // todo ? ethers or hardhat always emits 1 fake event } public async buildRWClient(): Promise { @@ -56,19 +64,34 @@ export class StorageContractState { return contract; } + // todo re-read on every change public async readContractState() { this.log.info(`connected to StorageContract: ${this.storageCt.address} as node ${this.nodeWallet.address}`) - let rf = await this.storageCt.rf(); + this.rf = await this.storageCt.rf(); let nodeCount = await this.storageCt.nodeCount(); - this.log.info(`rf: ${rf} , total nodeCount: ${nodeCount}`); - let nodeShards = await this.storageCt.getNodeShardsByAddr(this.nodeWallet.address); - const shards = BitUtil.bitsToPositions(nodeShards); - this.log.info(`this node ${this.nodeWallet.address} is assigned to shards (${nodeShards.toString(2)}) : ${JSON.stringify(shards)}`); - + this.shardCount = await this.storageCt.SHARD_COUNT(); + this.log.info(`rf: ${this.rf} , shard count: ${this.shardCount} total nodeCount: ${nodeCount}`); + let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeWallet.address); + // publish, new data would settle according to the new shards right away + this.nodeShards = CollectionUtil.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); + this.log.info(`this node %s is assigned to shards (%s) : %s`, + this.nodeWallet.address, nodeShardmask.toString(2), CollectionUtil.setToArray(this.nodeShards)); + await this.storageNode.handleReshard(this.nodeShards); } public async subscribeToContractChanges() { - + this.storageCt.on('SNodeMappingChanged', async (nodeList: string[]) => { + this.log.info(`EVENT: SNodeMappingChanged: nodeList=${JSON.stringify(nodeList)}`); + const pos = CollectionUtil.findIndex(nodeList, item => item === this.nodeAddress); + if (pos < 0) { + return; + } + let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeAddress); + const newShards = CollectionUtil.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); + // publish, new data would settle according to the new shards right away + this.nodeShards = newShards; + await this.storageNode.handleReshard(newShards); + }); } } @@ -81,4 +104,6 @@ export interface StorageContractAPI { getNodeShardsByAddr(addr: string): Promise; nodeCount(): Promise; + + SHARD_COUNT(): Promise; } \ No newline at end of file diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index a8e32f0..10fef5b 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -1,11 +1,13 @@ import {Service} from "typedi"; import {WinstonUtil} from "../../utilz/winstonUtil"; import {Logger} from "winston"; -import {Consumer, QItem} from "../messaging-dset/queueTypes"; import {MySqlUtil} from "../../utilz/mySqlUtil"; import {MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; -import {ObjectHasher} from "../../utilz/objectHasher"; +import StrUtil from "../../utilz/strUtil"; +import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Check} from "../../utilz/check"; +// stores everything in MySQL @Service() export class BlockStorage { public log: Logger = WinstonUtil.newLog(BlockStorage); @@ -28,8 +30,10 @@ export class BlockStorage { const objectAsJson = JSON.stringify(mb); const res = await MySqlUtil.insert( `INSERT - IGNORE INTO blocks(object, object_hash) VALUES (?, ?)`, - objectAsJson, calculatedHash); + IGNORE + INTO blocks(object, object_hash, object_shards) + VALUES (?, ?, ?)`, + objectAsJson, calculatedHash, JSON.stringify(shardSet)); let requiresProcessing = res.affectedRows === 1; if (!requiresProcessing) { return false; @@ -43,11 +47,120 @@ export class BlockStorage { } const res2 = await MySqlUtil.insert( `INSERT - IGNORE INTO dset_queue_mblock(object_hash, object_shard) VALUES - ${valuesStr}`, + IGNORE + INTO dset_queue_mblock(object_hash, object_shard) + VALUES + ${valuesStr}`, ...valuesArr); return true; } + /** + * Reads the latest row (by timestamp) + * ex: '[0,1,2,...,31]', 2023-05-05 17-00 + * and returns a set of {0,1,2..,31} + */ + public async loadNodeShards(): Promise | null> { + const row = await MySqlUtil.queryOneValueOrDefault<{ shards_assigned: string, ts: number }>( + 'select shards_assigned, ts from contract_shards order by ts desc limit 1', null); + let result: Set; + if (row != null && !StrUtil.isEmpty(row.shards_assigned)) { + const arr = JSON.parse(row.shards_assigned); + result = new Set(arr); + } else { + result = new Set(); + } + return result; + } + + /** + * Writes a set of {0,1,2..,31} + * to a new row with new timestamp + * @param nodeShards + */ + public async saveNodeShards(nodeShards: Set): Promise { + let arr = CollectionUtil.setToArray(nodeShards); + let arrAsJson = JSON.stringify(arr); + await MySqlUtil.insert('INSERT IGNORE INTO contract_shards(shards_assigned) VALUES(?)', arrAsJson); + } + + /** + * Iterates over all unique objectHash values in dset_queue_mblock_table. + * object gets filtered by specific shards + * + * handler will get all valid blocks which match the condition + * we also will query block contents from the blocks table + * + * @param shardCountFromStorageContract how many shards could be per 1 block + * @param pageSize how much data to load in 1 cycle + * @param shardsToLookFor shards filter + * @param handler callback for processing + */ + public async iterateAllStoredBlocks(shardCountFromStorageContract: number, + pageSize: number, + shardsToLookFor: Set, + handler: (messageBlockJson: string, + messageBlockHash: string, + messageBlockShards: Set) => Promise) { + // [1,2] => (1, 2) + let shardsAsCsv = Array.from(shardsToLookFor.keys()).join(','); + + // query size + let queryLimit = pageSize; + Check.isTrue(queryLimit > 0 && queryLimit < 1000, 'bad query limit'); + let subqueryRowLimit = Math.round(3 * pageSize * shardCountFromStorageContract / 2); + Check.isTrue(shardCountFromStorageContract > 0 && shardCountFromStorageContract < 1000, + 'bad subquery limit'); + + // remember last N object hashes; + // this is the amount of a page that should be enough to remove duplicate object hashes + // i.e. 32 shards x 30 rows = approx 1000 rows of history + let cache = new Set(); + let cacheMaxSize = 2 * subqueryRowLimit; + + let fromId = null; + let rows = null; + do { + /* + Finds rows + | minId | object_hash | shardsJson | + | 3 | 1 | [2,1] | + */ + rows = await MySqlUtil.queryArr<{ minId: number, object_hash: string, shardsJson: string }>( + `SELECT MIN(id) as minId, object_hash, CONCAT('[', GROUP_CONCAT(object_shard), ']') as shardsJson + FROM (SELECT id, object_hash, object_shard + FROM dset_queue_mblock + WHERE object_shard IN (${shardsAsCsv}) + and (? IS NULL OR id < ?) + ORDER BY id DESC + LIMIT ?) as sub + GROUP BY object_hash + ORDER BY minId DESC + LIMIT ?`, + fromId, fromId, subqueryRowLimit, queryLimit); + + for (const row of rows) { + const mbHash = row.object_hash; + if (!cache.has(mbHash)) { + const row = await MySqlUtil.queryOneRow<{ object: string, object_shards: string }>( + 'select object, object_shards from blocks where object_hash=?', mbHash); + if (row == null || StrUtil.isEmpty(row.object)) { + this.log.error('skipping objectHash=%s because there is no matching shard info in blocks table', + mbHash); + continue; + } + const mbShardSet = CollectionUtil.parseAsNumberSet(row.object_shards); + await handler(row.object, mbHash, mbShardSet); + cache.add(mbHash); + if (cache.size > cacheMaxSize) { + const firstCachedValue = cache.values().next().value; + cache.delete(firstCachedValue); + } + } + fromId = Math.min(fromId, row.minId); + } + Check.isTrue(cache.size <= cacheMaxSize); + } while (rows != null && rows.length > 0); + } -} +} \ No newline at end of file diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts new file mode 100644 index 0000000..1bf5a85 --- /dev/null +++ b/snode/src/services/messaging/IndexStorage.ts @@ -0,0 +1,123 @@ +import {WinstonUtil} from "../../utilz/winstonUtil"; +import {Inject, Service} from "typedi"; +import {Logger} from "winston"; +import {FPayload, MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; +import {Check} from "../../utilz/check"; +import {CollectionUtil} from "../../utilz/collectionUtil"; +import DateUtil from "../../utilz/dateUtil"; +import DbHelper from "../../helpers/dbHelper"; +import StrUtil from "../../utilz/strUtil"; +import {StorageContractState} from "../messaging-common/storageContractState"; +import {ValidatorContractState} from "../messaging-common/validatorContractState"; +import {PgUtil} from "../../utilz/pgUtil"; + + +// stores everything in Postgres (!) +@Service() +export class IndexStorage { + public log: Logger = WinstonUtil.newLog(IndexStorage); + + @Inject() + private valContractState: ValidatorContractState; + + @Inject() + private storageContractState: StorageContractState; + + /* + sends the block contents (internal messages from every response) + to every recipient's inbox + + This is POSTGRES + */ + public async unpackBlockToInboxes(mb: MessageBlock, shardSet: Set) { + // this is the list of shards that we support on this node + const nodeShards = this.storageContractState.nodeShards; + Check.notNull(nodeShards); + this.log.debug('storage node supports %s shards: %o', nodeShards.size, nodeShards); + let shardsToProcess = CollectionUtil.intersectSet(shardSet, nodeShards); + this.log.debug('block %s has %d inboxes to unpack', mb.id, shardsToProcess) + if (shardsToProcess.size == 0) { + this.log.debug('finished'); + return; + } + let nowStr = DateUtil.currentTimeSeconds() + ''; + const currentNodeId = this.valContractState.nodeId; + for (let i = 0; i < mb.responses.length; i++) { + const feedItem = mb.responses[i]; + const targetWallets: string[] = MessageBlockUtil.calculateRecipients(mb, i); + for (let i1 = 0; i1 < targetWallets.length; i1++) { + const targetAddr = targetWallets[i1]; + let targetShard = MessageBlockUtil.calculateAffectedShard(targetAddr, this.storageContractState.shardCount); + if (!shardsToProcess.has(targetShard)) { + continue; + } + await this.putPayloadToInbox('inbox', targetShard, targetAddr, nowStr, currentNodeId, feedItem.payload); + } + } + } + + + /** + * Puts a single item into + * This is POSTGRES + * + * @param nsName ex: inbox + * @param nsShardId ex: 0-31 + * @param nsId ex: eip155:0xAAAAA + * @param ts current time, ex: 1661214142.123456 + * @param nodeId current node id, ex: 0xAAAAAAA + * @param fpayload payload format + */ + public async putPayloadToInbox(nsName: string, nsShardId: number, nsId: string, + ts: string, + nodeId: string, + fpayload: FPayload) { + const key = fpayload.data.sid; + fpayload.recipients = null; // null recipients field because we don't need that + const date = DateUtil.parseUnixFloatAsDateTime(ts); + this.log.debug(`parsed date ${ts} -> ${date}`) + let storageTable = await DbHelper.findStorageTableByDate(nsName, nsShardId, date); + this.log.debug(`found table ${storageTable}`) + if (StrUtil.isEmpty(storageTable)) { + this.log.error('storage table not found'); + let monthStart = date.startOf('month').toISODate().toString(); + let monthEndExclusive = date.startOf('month').plus({months: 1}).toISODate().toString(); + this.log.debug('creating new storage table'); + const dateYYYYMM = DateUtil.formatYYYYMM(date); + const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; + const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, nsShardId, + monthStart, monthEndExclusive, tableName); + if (recordCreated) { + this.log.debug('record created: ', recordCreated) + // we've added a new record to node_storage_layout => we can safely try to create a table + // otherwise, if many connections attempt to create a table from multiple threads + // it leads to postgres deadlock sometimes + const createtable = await DbHelper.createNewStorageTable(tableName); + this.log.debug('creating node storage layout mapping') + this.log.debug(createtable); + } + } + const storageValue = await DbHelper.putValueInTable(nsName, nsShardId, nsId, storageTable, + ts, key, JSON.stringify(fpayload)); + this.log.debug(`found value: ${storageValue}`) + } + + public async deleteShardsFromInboxes(shardsToDelete: Set) { + if (shardsToDelete.size == 0) { + return; + } + // indexStorage + // delete from index + let shardsToDeleteAsString = CollectionUtil.setToArray(shardsToDelete).join(','); + const tableArr = await PgUtil.queryArr<{ table_name: string }>( + 'select table_name from node_storage_layout'); + for (const tableName of tableArr) { + this.log.debug('clearing table %s from shards %o', tableName, shardsToDeleteAsString); + await PgUtil.update(`delete + from ${tableName} + where namespace_shard_id in (?)`, + shardsToDeleteAsString); + } + } + +} \ No newline at end of file diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index d5e2539..b89c104 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -1,5 +1,4 @@ import {Inject, Service} from 'typedi' -import StrUtil from "../../utilz/strUtil"; import {ValidatorContractState} from "../messaging-common/validatorContractState"; import {Logger} from "winston"; import {FPayload, MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; @@ -10,9 +9,8 @@ import {QueueManager} from "./queueManager"; import {CollectionUtil} from "../../utilz/collectionUtil"; import {Check} from "../../utilz/check"; import {WinstonUtil} from "../../utilz/winstonUtil"; -import DateUtil from "../../utilz/dateUtil"; -import DbHelper from "../../helpers/dbHelper"; import {StorageContractState} from "../messaging-common/storageContractState"; +import {IndexStorage} from "./IndexStorage"; @Service() @@ -31,13 +29,16 @@ export default class StorageNode implements Consumer { @Inject() private blockStorage: BlockStorage; + @Inject() + private indexStorage: IndexStorage; + private client: QueueClient; public async postConstruct() { - // MySqlUtil.init(dbHelper.pool); todo postgres !!!!!!!!!!!!!! await this.valContractState.postConstruct(); await this.storageContractState.postConstruct(); await this.queueManager.postConstruct(); + // MySqlUtil.init(dbHelper.pool); todo postgres !!!!!!!!!!!!!! } // remote queue handler @@ -63,7 +64,7 @@ export default class StorageNode implements Consumer { return false; } // check database - let shardSet = MessageBlockUtil.calculateAffectedShards(mb); + let shardSet = MessageBlockUtil.calculateAffectedShards(mb, this.storageContractState.shardCount); let isNew = await this.blockStorage.saveBlockWithShardData(mb, calculatedHash, shardSet); if (!isNew) { // this is not an error, because we read duplicates from every validator @@ -71,95 +72,41 @@ export default class StorageNode implements Consumer { return false; } // send block - await this.unpackBlockToInboxes(mb, shardSet); + await this.indexStorage.unpackBlockToInboxes(mb, shardSet); } - // todo see DbHelper checkThatShardIsOnThisNode - public getNodeShards(): Set { - let set = new Set(); - for (let i = 0; i < 128; i++) { - set.add(i); - } - return set; - } - // sends the block contents (internal messages from every response) - // to every recipient's inbox - public async unpackBlockToInboxes(mb: MessageBlock, shardSet: Set) { - // this is the list of shards that we support on this node - const nodeShards = this.getNodeShards(); - this.log.debug('storage node supports %s shards: %o', nodeShards.size, nodeShards); - let shardsToProcess = CollectionUtil.intersectSets(shardSet, nodeShards); - this.log.debug('block %s has %d inboxes to unpack', mb.id, shardsToProcess) - if (shardsToProcess.size == 0) { - this.log.debug('finished'); - return; - } - let nowStr = DateUtil.currentTimeSeconds() + ''; - const currentNodeId = this.valContractState.nodeId; - for (let i = 0; i < mb.responses.length; i++) { - const feedItem = mb.responses[i]; - const targetWallets: string[] = MessageBlockUtil.calculateRecipients(mb, i); - for (let i1 = 0; i1 < targetWallets.length; i1++) { - const targetAddr = targetWallets[i1]; - const targetShard = MessageBlockUtil.calculateAffectedShard(targetAddr); - if (!shardsToProcess.has(targetShard)) { - continue; - } - await this.putToInbox('inbox', targetAddr, nowStr, currentNodeId, feedItem.payload); - } - } - } + // todo raise a flag while executing this; handle new updates somehow? + public async handleReshard(newShards: Set) { + this.log.debug('handleReshard(): newShards: %j', CollectionUtil.setToArray(newShards)) + const oldShards = await this.blockStorage.loadNodeShards(); + let shardsToAdd = CollectionUtil.substractSet(newShards, oldShards); + let shardsToDelete = CollectionUtil.substractSet(oldShards, newShards); + let commonShards = CollectionUtil.intersectSet(oldShards, newShards); + this.log.debug('shardsToAdd %j shardsToDelete %j shardsRemaining %j', + CollectionUtil.setToArray(shardsToAdd), + CollectionUtil.setToArray(shardsToDelete), + CollectionUtil.setToArray(commonShards)); + await this.indexStorage.deleteShardsFromInboxes(shardsToDelete); - /** - * - * @param nsName ex: inbox - * @param nsIndex ex: eip155:0xAAAAA - * @param ts current time, ex: 1661214142.123456 - * @param nodeId current node id, ex: 0xAAAAAAA - * @param fpayload payload format - */ - public async putToInbox(nsName: string, nsIndex: string, - ts: string, - nodeId: string, - fpayload: FPayload) { - const key = fpayload.data.sid; - fpayload.recipients = null; // null recipients field because we don't need that - this.log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} fpayload=${fpayload}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - this.log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId);// todo REMOVE !!!!!!!!!! - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - } - const date = DateUtil.parseUnixFloatAsDateTime(ts); - this.log.debug(`parsed date ${ts} -> ${date}`) - var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); - this.log.debug(`found table ${storageTable}`) - if (StrUtil.isEmpty(storageTable)) { - this.log.error('storage table not found'); - var monthStart = date.startOf('month').toISODate().toString(); - var monthEndExclusive = date.startOf('month').plus({months: 1}).toISODate().toString(); - this.log.debug('creating new storage table'); - const dateYYYYMM = DateUtil.formatYYYYMM(date); - const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; - const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, shardId, - monthStart, monthEndExclusive, tableName); - if (recordCreated) { - this.log.debug('record created: ', recordCreated) - // we've added a new record to node_storage_layout => we can safely try to create a table - // otherwise, if many connections attempt to create a table from multiple threads - // it leads to postgres deadlock sometimes - const createtable = await DbHelper.createNewStorageTable(tableName); - this.log.debug('creating node storage layout mapping') - this.log.debug(createtable); - } - } - const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, - ts, key, JSON.stringify(fpayload)); - this.log.debug(`found value: ${storageValue}`) - this.log.debug('success is ' + success); + // add to index + // reprocess every block from blocks table (only once per each block) + // if the block has shardsToAdd -> add anything which is in shardsToAdd + await this.blockStorage.iterateAllStoredBlocks(this.storageContractState.shardCount, + 1, + shardsToAdd, + async (messageBlockJson, messageBlockHash, messageBlockShards) => { + let mb: MessageBlock = JSON.parse(messageBlockJson); + let shardsToAddFromBlock = CollectionUtil.intersectSet(shardsToAdd, messageBlockShards); + this.log.debug('reindexing block %s, blockShards %s, shardsToAdd %s,, shardsToAddFromBlock', + messageBlockHash, messageBlockShards, shardsToAdd, shardsToAddFromBlock) + await this.indexStorage.unpackBlockToInboxes(mb, shardsToAddFromBlock); + }); + + // todo V2 redownload every block from peers (snodes), + // using the right virtual queue which exists for missing shards in (shardsToAdd) + + await this.blockStorage.saveNodeShards(newShards); } } \ No newline at end of file diff --git a/snode/src/utilz/collectionUtil.ts b/snode/src/utilz/collectionUtil.ts index 7101ee4..183c663 100644 --- a/snode/src/utilz/collectionUtil.ts +++ b/snode/src/utilz/collectionUtil.ts @@ -26,16 +26,38 @@ export class CollectionUtil { return Array.from(set.keys()) } - public static intersectSets(set1: Set, set2: Set): Set { + // [1,2,3] - [2,3] = [1] + public static substractSet(set1: Set, set2: Set): Set { + return new Set([...set1].filter(x => !set2.has(x))); + } + + // [1,2,3] x [2, 3] = [2,3] + public static intersectSet(set1: Set, set2: Set): Set { return new Set([...set1].filter(x => set2.has(x))); } - public static sortNumbersAsc(array:number[]) { - if(array==null || array.length==0) { + // [1,2,3] x [2, 3] = [2,3] + public static addSet(set1: Set, set2: Set): Set { + return new Set([...set1, ...set2]); + } + + public static sortNumbersAsc(array: number[]) { + if (array == null || array.length == 0) { return; } array.sort((a, b) => { return a - b; }) } + + // parse '[1,2,3]' into Set: 1,2,3 + public static parseAsNumberSet(jsonArray: string): Set { + const arr: number[] = JSON.parse(jsonArray); + return CollectionUtil.arrayToSet(arr); + } + + // store set 1,2,3 as array: [1,2,3] + public static numberSetToJson(s: Set): string { + return JSON.stringify([...s]); + } } From 8a13daf2001f0b280a2eeda92ecebbbcc9846fdc Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 14 Sep 2023 11:54:20 +0400 Subject: [PATCH 53/84] add: ignore empty state updated --- snode/src/services/messaging/storageNode.ts | 25 ++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index b89c104..0e87a2e 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -6,7 +6,7 @@ import {QueueClient} from "../messaging-dset/queueClient"; import {Consumer, QItem} from "../messaging-dset/queueTypes"; import {BlockStorage} from "./BlockStorage"; import {QueueManager} from "./queueManager"; -import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Coll} from "../../utilz/coll"; import {Check} from "../../utilz/check"; import {WinstonUtil} from "../../utilz/winstonUtil"; import {StorageContractState} from "../messaging-common/storageContractState"; @@ -57,7 +57,7 @@ export default class StorageNode implements Consumer { // check contents // since this check is not for historical data, but for realtime data, // so we do not care about old blocked validators which might occur in the historical queue - let activeValidators = CollectionUtil.arrayToFields(this.valContractState.getActiveValidators(), 'nodeId'); + let activeValidators = Coll.arrayToFields(this.valContractState.getActiveValidators(), 'nodeId'); let check1 = MessageBlockUtil.checkBlock(mb, activeValidators); if (!check1.success) { this.log.error('item validation failed: ', check1.err); @@ -78,15 +78,20 @@ export default class StorageNode implements Consumer { // todo raise a flag while executing this; handle new updates somehow? public async handleReshard(newShards: Set) { - this.log.debug('handleReshard(): newShards: %j', CollectionUtil.setToArray(newShards)) const oldShards = await this.blockStorage.loadNodeShards(); - let shardsToAdd = CollectionUtil.substractSet(newShards, oldShards); - let shardsToDelete = CollectionUtil.substractSet(oldShards, newShards); - let commonShards = CollectionUtil.intersectSet(oldShards, newShards); + this.log.debug('handleReshard(): newShards: %j', + Coll.setToArray(newShards), Coll.setToArray(oldShards)) + if (Coll.isEqualSet(newShards, oldShards)) { + this.log.debug('handleReshard(): no reshard is needed') + return; + } + let shardsToAdd = Coll.substractSet(newShards, oldShards); + let shardsToDelete = Coll.substractSet(oldShards, newShards); + let commonShards = Coll.intersectSet(oldShards, newShards); this.log.debug('shardsToAdd %j shardsToDelete %j shardsRemaining %j', - CollectionUtil.setToArray(shardsToAdd), - CollectionUtil.setToArray(shardsToDelete), - CollectionUtil.setToArray(commonShards)); + Coll.setToArray(shardsToAdd), + Coll.setToArray(shardsToDelete), + Coll.setToArray(commonShards)); await this.indexStorage.deleteShardsFromInboxes(shardsToDelete); @@ -98,7 +103,7 @@ export default class StorageNode implements Consumer { shardsToAdd, async (messageBlockJson, messageBlockHash, messageBlockShards) => { let mb: MessageBlock = JSON.parse(messageBlockJson); - let shardsToAddFromBlock = CollectionUtil.intersectSet(shardsToAdd, messageBlockShards); + let shardsToAddFromBlock = Coll.intersectSet(shardsToAdd, messageBlockShards); this.log.debug('reindexing block %s, blockShards %s, shardsToAdd %s,, shardsToAddFromBlock', messageBlockHash, messageBlockShards, shardsToAdd, shardsToAddFromBlock) await this.indexStorage.unpackBlockToInboxes(mb, shardsToAddFromBlock); From 3d343bb43570ffe3ad7e384608cd5b4da76404f4 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 14 Sep 2023 11:54:33 +0400 Subject: [PATCH 54/84] add: CollectionUtil -> Coll --- .../services/messaging-common/messageBlock.ts | 4 ++-- .../messaging-common/storageContractState.ts | 10 +++++----- snode/src/services/messaging/BlockStorage.ts | 14 +++++++------- snode/src/services/messaging/IndexStorage.ts | 6 +++--- snode/src/utilz/bitUtil.ts | 4 ++-- snode/src/utilz/{collectionUtil.ts => coll.ts} | 18 ++++++++++++++++-- 6 files changed, 35 insertions(+), 21 deletions(-) rename snode/src/utilz/{collectionUtil.ts => coll.ts} (81%) diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts index aa6c877..638301d 100644 --- a/snode/src/services/messaging-common/messageBlock.ts +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -9,7 +9,7 @@ { s1, 0xD}, { s2, 0xE}, { s3, 0xF}, { d1, 0x1}, { d2, 0x2}, { d3, 0x3} ] */ -import {CollectionUtil} from '../../utilz/collectionUtil' +import {Coll} from '../../utilz/coll' import StrUtil from '../../utilz/strUtil' import {EthSig} from '../../utilz/ethSig' import {Logger} from 'winston' @@ -315,7 +315,7 @@ export class MessageBlockUtil { Check.isTrue(requestOffset >= 0, 'requestOffset not found') const recipientsV = block.responses[requestOffset].header.recipientsResolved const signaturesA = block.responsesSignatures[requestOffset] - const allRecipients = CollectionUtil.arrayToMap(recipientsV, 'addr') + const allRecipients = Coll.arrayToMap(recipientsV, 'addr') for (const signatureA of signaturesA) { const recipientsMissing = signatureA.data.recipientsMissing for (const itemToRemove of recipientsMissing.recipients) { diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 6b42445..7d5a952 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -9,7 +9,7 @@ import fs, {readFileSync} from "fs"; import {ValidatorCtClient} from "./validatorContractState"; import {BitUtil} from "../../utilz/bitUtil"; import {EthersUtil} from "../../utilz/ethersUtil"; -import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Coll} from "../../utilz/coll"; import StorageNode from "../messaging/storageNode"; @Service() @@ -73,21 +73,21 @@ export class StorageContractState { this.log.info(`rf: ${this.rf} , shard count: ${this.shardCount} total nodeCount: ${nodeCount}`); let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeWallet.address); // publish, new data would settle according to the new shards right away - this.nodeShards = CollectionUtil.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); + this.nodeShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); this.log.info(`this node %s is assigned to shards (%s) : %s`, - this.nodeWallet.address, nodeShardmask.toString(2), CollectionUtil.setToArray(this.nodeShards)); + this.nodeWallet.address, nodeShardmask.toString(2), Coll.setToArray(this.nodeShards)); await this.storageNode.handleReshard(this.nodeShards); } public async subscribeToContractChanges() { this.storageCt.on('SNodeMappingChanged', async (nodeList: string[]) => { this.log.info(`EVENT: SNodeMappingChanged: nodeList=${JSON.stringify(nodeList)}`); - const pos = CollectionUtil.findIndex(nodeList, item => item === this.nodeAddress); + const pos = Coll.findIndex(nodeList, item => item === this.nodeAddress); if (pos < 0) { return; } let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeAddress); - const newShards = CollectionUtil.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); + const newShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); // publish, new data would settle according to the new shards right away this.nodeShards = newShards; await this.storageNode.handleReshard(newShards); diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index 10fef5b..49d9b52 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -4,7 +4,7 @@ import {Logger} from "winston"; import {MySqlUtil} from "../../utilz/mySqlUtil"; import {MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; import StrUtil from "../../utilz/strUtil"; -import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Coll} from "../../utilz/coll"; import {Check} from "../../utilz/check"; // stores everything in MySQL @@ -61,11 +61,11 @@ export class BlockStorage { * and returns a set of {0,1,2..,31} */ public async loadNodeShards(): Promise | null> { - const row = await MySqlUtil.queryOneValueOrDefault<{ shards_assigned: string, ts: number }>( - 'select shards_assigned, ts from contract_shards order by ts desc limit 1', null); + const shardsAssigned = await MySqlUtil.queryOneValueOrDefault( + 'select shards_assigned from contract_shards order by ts desc limit 1', null); let result: Set; - if (row != null && !StrUtil.isEmpty(row.shards_assigned)) { - const arr = JSON.parse(row.shards_assigned); + if (shardsAssigned != null && !StrUtil.isEmpty(shardsAssigned)) { + const arr = JSON.parse(shardsAssigned); result = new Set(arr); } else { result = new Set(); @@ -79,7 +79,7 @@ export class BlockStorage { * @param nodeShards */ public async saveNodeShards(nodeShards: Set): Promise { - let arr = CollectionUtil.setToArray(nodeShards); + let arr = Coll.setToArray(nodeShards); let arrAsJson = JSON.stringify(arr); await MySqlUtil.insert('INSERT IGNORE INTO contract_shards(shards_assigned) VALUES(?)', arrAsJson); } @@ -149,7 +149,7 @@ export class BlockStorage { mbHash); continue; } - const mbShardSet = CollectionUtil.parseAsNumberSet(row.object_shards); + const mbShardSet = Coll.parseAsNumberSet(row.object_shards); await handler(row.object, mbHash, mbShardSet); cache.add(mbHash); if (cache.size > cacheMaxSize) { diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index 1bf5a85..0af66fd 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -3,7 +3,7 @@ import {Inject, Service} from "typedi"; import {Logger} from "winston"; import {FPayload, MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; import {Check} from "../../utilz/check"; -import {CollectionUtil} from "../../utilz/collectionUtil"; +import {Coll} from "../../utilz/coll"; import DateUtil from "../../utilz/dateUtil"; import DbHelper from "../../helpers/dbHelper"; import StrUtil from "../../utilz/strUtil"; @@ -34,7 +34,7 @@ export class IndexStorage { const nodeShards = this.storageContractState.nodeShards; Check.notNull(nodeShards); this.log.debug('storage node supports %s shards: %o', nodeShards.size, nodeShards); - let shardsToProcess = CollectionUtil.intersectSet(shardSet, nodeShards); + let shardsToProcess = Coll.intersectSet(shardSet, nodeShards); this.log.debug('block %s has %d inboxes to unpack', mb.id, shardsToProcess) if (shardsToProcess.size == 0) { this.log.debug('finished'); @@ -108,7 +108,7 @@ export class IndexStorage { } // indexStorage // delete from index - let shardsToDeleteAsString = CollectionUtil.setToArray(shardsToDelete).join(','); + let shardsToDeleteAsString = Coll.setToArray(shardsToDelete).join(','); const tableArr = await PgUtil.queryArr<{ table_name: string }>( 'select table_name from node_storage_layout'); for (const tableName of tableArr) { diff --git a/snode/src/utilz/bitUtil.ts b/snode/src/utilz/bitUtil.ts index ce3488e..22c8115 100644 --- a/snode/src/utilz/bitUtil.ts +++ b/snode/src/utilz/bitUtil.ts @@ -1,4 +1,4 @@ -import {CollectionUtil} from "./collectionUtil"; +import {Coll} from "./coll"; export class BitUtil { /** @@ -54,7 +54,7 @@ export class BitUtil { number = number >>> 1; position++; } - CollectionUtil.sortNumbersAsc(result); + Coll.sortNumbersAsc(result); return result; } } diff --git a/snode/src/utilz/collectionUtil.ts b/snode/src/utilz/coll.ts similarity index 81% rename from snode/src/utilz/collectionUtil.ts rename to snode/src/utilz/coll.ts index 183c663..b2234da 100644 --- a/snode/src/utilz/collectionUtil.ts +++ b/snode/src/utilz/coll.ts @@ -1,4 +1,7 @@ -export class CollectionUtil { +// CollectionUtils +// all the proper type safe way to work with JS collections/sets/arrays +export class Coll { + public static arrayToMap(arr: V[], keyField: K): Map { if (arr == null || arr.length == 0) { return new Map() @@ -50,10 +53,21 @@ export class CollectionUtil { }) } + public static isEqualSet(a: Set, b: Set) { + if (a === b) return true; + if (a.size !== b.size) return false; + for (const value of a) { + if (!b.has(value)) { + return false; + } + } + return true; + } + // parse '[1,2,3]' into Set: 1,2,3 public static parseAsNumberSet(jsonArray: string): Set { const arr: number[] = JSON.parse(jsonArray); - return CollectionUtil.arrayToSet(arr); + return Coll.arrayToSet(arr); } // store set 1,2,3 as array: [1,2,3] From 4cc16a60be36b50fe6273dded147b7c6c76913e4 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 15 Sep 2023 01:38:12 +0400 Subject: [PATCH 55/84] add: unpack block to inboxes tests (1) --- snode/src/helpers/dbHelper.ts | 25 ++++++++++++------- .../services/messaging-common/messageBlock.ts | 10 +++++--- snode/src/services/messaging/IndexStorage.ts | 1 + 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 9ae234e..ed320d1 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -95,16 +95,23 @@ export default class DbHelper { namespace_shard_id VARCHAR(64) NOT NULL, namespace_id VARCHAR(64) NOT NULL, ts TIMESTAMP NOT NULL default NOW(), - skey VARCHAR(64) NOT NULL PRIMARY KEY, + skey VARCHAR(64) NOT NULL, dataSchema VARCHAR(20) NOT NULL, - payload JSONB - ); + payload JSONB, + PRIMARY KEY(namespace,namespace_shard_id,namespace_id,skey,ts) + );`; + /* + real primary key: namespace + namespase_id + skey + namespace_shard_id is evaluated from namespace_id + ts is not important - CREATE INDEX IF NOT EXISTS - ${tableName}_idx ON ${tableName} - USING btree (namespace ASC, namespace_shard_id ASC, namespace_id ASC, ts ASC); - ` - // todo CREATE INDEX CONCURRENTLY ? + we use all the fields to have good btree which allows search and sorting with + (namespace) + (namespace, namespace_shard_id) + (namespace, namespace_shard_id,namespace_id) + (namespace, namespace_shard_id,namespace_id, skey) + (namespace,namespace_shard_id,namespace_id, skey,ts) + */ console.log(sql) return pgPool.query(sql).then(data => { console.log(data) @@ -198,7 +205,7 @@ export default class DbHelper { const sql = `INSERT INTO ${storageTable} (namespace, namespace_shard_id, namespace_id, ts, skey, dataschema, payload) values ('${ns}', '${shardId}', '${nsIndex}', to_timestamp(${ts}),'${skey}', 'v1', '${body}') - ON CONFLICT (skey) DO UPDATE SET payload = '${body}'` + ON CONFLICT (namespace,namespace_shard_id,namespace_id,skey,ts) DO UPDATE SET payload = '${body}'` log.debug(sql); return pgPool.none(sql).then(data => { log.debug(data); diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts index 638301d..0a711ee 100644 --- a/snode/src/services/messaging-common/messageBlock.ts +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -318,8 +318,10 @@ export class MessageBlockUtil { const allRecipients = Coll.arrayToMap(recipientsV, 'addr') for (const signatureA of signaturesA) { const recipientsMissing = signatureA.data.recipientsMissing - for (const itemToRemove of recipientsMissing.recipients) { - allRecipients.delete(itemToRemove.addr) + if (recipientsMissing != null) { + for (const itemToRemove of recipientsMissing.recipients) { + allRecipients.delete(itemToRemove.addr) + } } } return Array.from(allRecipients.keys()) @@ -339,7 +341,7 @@ export class MessageBlockUtil { * @param shardCount total amount of shards; see smart contract for this value * @returns a set of shard ids */ - static calculateAffectedShards(block: Readonly, shardCount:number): Set { + static calculateAffectedShards(block: Readonly, shardCount: number): Set { const shards = new Set() for (const fi of block.responses) { for (const recipient of fi.header.recipientsResolved) { @@ -360,7 +362,7 @@ export class MessageBlockUtil { // 2) take sha256(addr) -> // shard count is a smart contract constant; normally it should never change // lets read this value from a contract - public static calculateAffectedShard(recipientAddr: string, shardCount:number): number | null { + public static calculateAffectedShard(recipientAddr: string, shardCount: number): number | null { if (StrUtil.isEmpty(recipientAddr)) { return null; } diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index 0af66fd..f8d5db0 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -95,6 +95,7 @@ export class IndexStorage { const createtable = await DbHelper.createNewStorageTable(tableName); this.log.debug('creating node storage layout mapping') this.log.debug(createtable); + storageTable = tableName; } } const storageValue = await DbHelper.putValueInTable(nsName, nsShardId, nsId, storageTable, From c000a08b0c50cf6baed6b87bf4e2406adef14086 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Fri, 15 Sep 2023 14:11:08 +0400 Subject: [PATCH 56/84] add: init pg and mysql on start with schema migrations --- snode/migrations/pg/V1__init.sql | 7 +-- snode/src/helpers/dbHelper.ts | 14 +++++ snode/src/services/messaging/BlockStorage.ts | 57 ++++++++++++++++++++ snode/src/services/messaging/IndexStorage.ts | 4 ++ snode/src/services/messaging/storageNode.ts | 2 + 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/snode/migrations/pg/V1__init.sql b/snode/migrations/pg/V1__init.sql index df15560..3cbd051 100755 --- a/snode/migrations/pg/V1__init.sql +++ b/snode/migrations/pg/V1__init.sql @@ -48,10 +48,7 @@ CREATE TABLE IF NOT EXISTS node_storage_layout namespace_shard_id VARCHAR(64) NOT NULL, ts_start TIMESTAMP NOT NULL default NOW(), ts_end TIMESTAMP NOT NULL default NOW(), - table_name VARCHAR(64) NOT NULL + table_name VARCHAR(64) NOT NULL, + PRIMARY KEY(namespace, namespace_shard_id, ts_start, ts_end) ); -DROP INDEX IF EXISTS shard_map_ts_index; -CREATE INDEX shard_map_ts_index ON node_storage_layout USING btree (namespace ASC, namespace_shard_id ASC, ts_start ASC, ts_end ASC); -ALTER TABLE node_storage_layout DROP CONSTRAINT IF EXISTS node_storage_layout_uniq; -ALTER TABLE node_storage_layout ADD CONSTRAINT node_storage_layout_uniq UNIQUE (namespace, namespace_shard_id, ts_start, ts_end); diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index ed320d1..20ab78f 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -41,6 +41,20 @@ PgUtil.init(pgPool); export default class DbHelper { + public static async createStorageTablesIfNeeded() { + await PgUtil.update(` + CREATE TABLE IF NOT EXISTS node_storage_layout + ( + namespace VARCHAR(20) NOT NULL, + namespace_shard_id VARCHAR(64) NOT NULL, + ts_start TIMESTAMP NOT NULL default NOW(), + ts_end TIMESTAMP NOT NULL default NOW(), + table_name VARCHAR(64) NOT NULL, + PRIMARY KEY (namespace, namespace_shard_id, ts_start, ts_end) + ); + `) + } + // maps key -> 8bit space (0..255) // uses first 4bit from an md5 hash public static calculateShardForNamespaceIndex(namespace: string, key: string): number { diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index 49d9b52..88a192f 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -6,12 +6,69 @@ import {MessageBlock, MessageBlockUtil} from "../messaging-common/messageBlock"; import StrUtil from "../../utilz/strUtil"; import {Coll} from "../../utilz/coll"; import {Check} from "../../utilz/check"; +import DbHelper from "../../helpers/dbHelper"; // stores everything in MySQL @Service() export class BlockStorage { public log: Logger = WinstonUtil.newLog(BlockStorage); + public async postConstruct() { + await this.createStorageTablesIfNeeded(); + } + + private async createStorageTablesIfNeeded() { + await MySqlUtil.insert(` + CREATE TABLE IF NOT EXISTS blocks + ( + object_hash VARCHAR(255) NOT NULL COMMENT 'optional: a uniq field to fight duplicates', + object MEDIUMTEXT NOT NULL, + object_shards JSON NOT NULL COMMENT 'message block shards', + PRIMARY KEY (object_hash) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + `); + + await MySqlUtil.insert(` + CREATE TABLE IF NOT EXISTS dset_queue_mblock + ( + id BIGINT NOT NULL AUTO_INCREMENT, + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'timestamp is used for querying the queu', + object_hash VARCHAR(255) NOT NULL, + object_shard INT NOT NULL COMMENT 'message block shard', + PRIMARY KEY (id), + UNIQUE KEY uniq_mblock_object_hash (object_hash, object_shard), + FOREIGN KEY (object_hash) REFERENCES blocks(object_hash) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + `); + + await MySqlUtil.insert(` + CREATE TABLE IF NOT EXISTS dset_client + ( + id INT NOT NULL AUTO_INCREMENT, + queue_name varchar(32) NOT NULL COMMENT 'target node queue name', + target_node_id varchar(128) NOT NULL COMMENT 'target node eth address', + target_node_url varchar(128) NOT NULL COMMENT 'target node url, filled from the contract', + target_offset bigint(20) NOT NULL DEFAULT 0 COMMENT 'initial offset to fetch target queue', + state tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 = enabled, 0 = disabled', + PRIMARY KEY (id), + UNIQUE KEY uniq_dset_name_and_target (queue_name, target_node_id) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + `); + + await MySqlUtil.insert(` + CREATE TABLE IF NOT EXISTS contract_shards + ( + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'update timestamp', + shards_assigned json NOT NULL COMMENT 'optional: a uniq field to fight duplicates', + PRIMARY KEY (ts) + ) ENGINE = InnoDB + DEFAULT CHARSET = utf8; + + `); + } async saveBlockWithShardData(mb: MessageBlock, calculatedHash: string, shardSet: Set): Promise { // NOTE: the code already atomically updates the db , diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index f8d5db0..5a7c9d6 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -23,6 +23,10 @@ export class IndexStorage { @Inject() private storageContractState: StorageContractState; + public async postConstruct() { + await DbHelper.createStorageTablesIfNeeded(); + } + /* sends the block contents (internal messages from every response) to every recipient's inbox diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 0e87a2e..5688aa8 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -35,6 +35,8 @@ export default class StorageNode implements Consumer { private client: QueueClient; public async postConstruct() { + await this.blockStorage.postConstruct(); + await this.indexStorage.postConstruct(); await this.valContractState.postConstruct(); await this.storageContractState.postConstruct(); await this.queueManager.postConstruct(); From e5e1552b81c75688f7eaafe33af4f558f7c4c2f8 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 16 Sep 2023 01:03:14 +0400 Subject: [PATCH 57/84] add: reshard(delete existing) , reshard (unpack existing) tests --- snode/src/api/middlewares/onlyLocalhost.ts | 65 ++++ snode/src/api/routes/storageRoutes.ts | 307 ++++++++++--------- snode/src/helpers/dbHelper.ts | 34 +- snode/src/services/messaging/BlockStorage.ts | 19 +- snode/src/services/messaging/IndexStorage.ts | 25 +- snode/src/services/messaging/storageNode.ts | 2 +- snode/src/utilz/coll.ts | 5 + snode/src/utilz/pgUtil.ts | 3 + 8 files changed, 271 insertions(+), 189 deletions(-) create mode 100644 snode/src/api/middlewares/onlyLocalhost.ts diff --git a/snode/src/api/middlewares/onlyLocalhost.ts b/snode/src/api/middlewares/onlyLocalhost.ts new file mode 100644 index 0000000..3c4f03a --- /dev/null +++ b/snode/src/api/middlewares/onlyLocalhost.ts @@ -0,0 +1,65 @@ +import { Container } from 'typedi' +import config from '../../config' + +var dns = require('dns') +var os = require('os') +var ifaces = os.networkInterfaces() + +/** + * @param {*} req Express req Object + * @param {*} res Express res Object + * @param {*} next Express next Function + */ +const onlyLocalhost = async (req, res, next) => { + const Logger = Container.get('logger') + try { + // Check if ip is localhost and only continue + var ip = req.connection.remoteAddress + var host = req.get('host') + + if (config.environment === 'production') { + // Return with unauthorized error + return res.sendStatus(401).json({ info: 'Only development config' }) + } + + checkLocalHost(ip) + .then((result) => { + if (!result) { + return res.sendStatus(401).json({ info: 'Only localhost connection allowed' }) + } + + return next() + }) + .catch((e) => { + Logger.error('🔥 Error attaching Only Localhost middleware to req: %o', e) + return next(e) + }) + } catch (e) { + Logger.error('🔥 Error attaching Only Localhost middleware to req: %o', e) + return next(e) + } +} + +const checkLocalHost = async (address) => { + return new Promise((resolve, reject) => { + dns.lookup(address, function (err, addr) { + if (err) { + resolve(false) + return + } + try { + address = addr + Object.keys(ifaces).forEach(function (ifname) { + ifaces[ifname].forEach(function (iface) { + if (iface.address === address) resolve(true) + }) + }) + resolve(false) + } catch (err) { + reject(err) + } + }) + }) +} + +export default onlyLocalhost diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index ca1cb52..fe45efd 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -8,165 +8,180 @@ import {ExpressUtil} from "../../utilz/expressUtil"; import DateUtil from "../../utilz/dateUtil"; import StrUtil from "../../utilz/strUtil"; import {ValidatorContractState} from "../../services/messaging-common/validatorContractState"; +import onlyLocalhost from "../middlewares/onlyLocalhost"; +import StorageNode from "../../services/messaging/storageNode"; +import {Coll} from "../../utilz/coll"; const route = Router(); const dbh = new DbHelper(); function logRequest(req: Request) { - log.debug('Calling %o %o with body: %o', req.method, req.url, req.body); + log.debug('Calling %o %o with body: %o', req.method, req.url, req.body); } // todo ValidatorContractState // todo remove logic from router -export function storageRoutes (app: Router) { - app.use(bodyParser.json()); +export function storageRoutes(app: Router) { + app.use(bodyParser.json()); - app.use('/v1/kv', route); + app.post( + '/v1/reshard', + onlyLocalhost, + async (req: Request, res: Response, next: NextFunction) => { + logRequest(req); + const storageNode = Container.get(StorageNode); + // ex: { "arr": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] } + let arr:number[] = req.body.arr; + let set = Coll.arrayToSet(arr); + await storageNode.handleReshard(set) + return res.status(200); + }); - route.get( - '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', /* */ - async (req: Request, res: Response, next: NextFunction) => { - logRequest(req); - const nsName = req.params.nsName; - const nsIndex = req.params.nsIndex; - const dt = req.params.dt; - const key = req.params.key; - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db - log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - return res.status(500) - .json({errorMessage: errMsg}) - } - const date = DateTime.fromISO(dt, {zone: 'utc'}); - if(!date.isValid) { - return res.status(400).json('Invalid date ' + dt); - } - log.debug(`parsed date ${dt} -> ${date}`) - const storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); - log.debug(`found table ${storageTable}`) - if (StrUtil.isEmpty(storageTable)) { - log.error('storage table not found'); - return res.status(401).json('storage table not found'); - } - const storageItems = await DbHelper.findStorageItem(nsName, storageTable, key); - log.debug(`found value: ${storageItems}`) - log.debug('success is ' + success); - try { - return res.status(200).json({ - items: storageItems - }); - } catch (e) { - return next(e); - } - } - ); + app.use('/v1/kv', route); - route.post( - '/ns/:nsName/nsidx/:nsIndex/ts/:ts/key/:key', /* */ - async (req: Request, res: Response, next: NextFunction) => { - logRequest(req); - const nsName = req.params.nsName; // ex: feeds - const nsIndex = req.params.nsIndex; // ex: 1000000 - const ts:string = req.params.ts; //ex: 1661214142.123456 - const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db - const body = JSON.stringify(req.body); - log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - return res.status(500) - .json({errorMessage: errMsg}) - } - const date = DateUtil.parseUnixFloatAsDateTime(ts); - log.debug(`parsed date ${ts} -> ${date}`) - var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); - log.debug(`found table ${storageTable}`) - if (StrUtil.isEmpty(storageTable)) { - log.error('storage table not found'); - var monthStart = date.startOf('month').toISODate().toString(); - var monthEndExclusive = date.startOf('month').plus({months: 1}).toISODate().toString(); - log.debug('creating new storage table'); - const dateYYYYMM = DateUtil.formatYYYYMM(date); - const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; - const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, shardId, - monthStart, monthEndExclusive, tableName); - if (recordCreated) { - log.debug('record created: ', recordCreated) - // we've added a new record to node_storage_layout => we can safely try to create a table - // otherwise, if many connections attempt to create a table from multiple threads - // it leads to postgres deadlock sometimes - const createtable = await DbHelper.createNewStorageTable(tableName); - log.debug('creating node storage layout mapping') - log.debug(createtable); - } - } - var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); - const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, ts, key, body); - log.debug(`found value: ${storageValue}`) - log.debug('success is ' + success); - try { - return res.status(201).json(storageValue); - } catch (e) { - return next(e); - } - } - ); + route.get( + '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', /* */ + async (req: Request, res: Response, next: NextFunction) => { + logRequest(req); + const nsName = req.params.nsName; + const nsIndex = req.params.nsIndex; + const dt = req.params.dt; + const key = req.params.key; + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); + let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); + log.debug(`nodeId=${nodeId} shardId=${shardId}`); + const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); + if (!success) { + let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; + console.log(errMsg); + return res.status(500) + .json({errorMessage: errMsg}) + } + const date = DateTime.fromISO(dt, {zone: 'utc'}); + if (!date.isValid) { + return res.status(400).json('Invalid date ' + dt); + } + log.debug(`parsed date ${dt} -> ${date}`) + const storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + log.debug(`found table ${storageTable}`) + if (StrUtil.isEmpty(storageTable)) { + log.error('storage table not found'); + return res.status(401).json('storage table not found'); + } + const storageItems = await DbHelper.findStorageItem(nsName, storageTable, key); + log.debug(`found value: ${storageItems}`) + log.debug('success is ' + success); + try { + return res.status(200).json({ + items: storageItems + }); + } catch (e) { + return next(e); + } + } + ); - /* Search for namespace:namespaceIndex data , ordered by timestamp asc, paginated by timestamp (!) - Pagination is achieved by using firstTs parameter, passed from the previous invocation - Timestamp example: 1661214142.000000 ( unixtime.microseconds ) - * */ - route.post( - '/ns/:nsName/nsidx/:nsIndex/month/:month/list/', /* */ - async (req: Request, res: Response, next: NextFunction) => { - logRequest(req); - // we will search for data starting from this key exclusive - // use lastTs from the previous request to get more data - const firstTs:string = req.query.firstTs; - const nsName = req.params.nsName; - const nsIndex = req.params.nsIndex; - const dt = req.params.month + '01'; - const key = req.params.key; - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db - const body = JSON.stringify(req.body); - const page = parseInt(req.params.page); - log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - return res.status(500) - .json({errorMessage: errMsg}) - } - const date = DateTime.fromISO(dt, {zone: 'utc'}); - log.debug(`parsed date ${date} -> ${date}`) - // since the date is 1st day of month - we can do a lookup of the table name - const storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); - log.debug(`found table ${storageTable}`) - if (StrUtil.isEmpty(storageTable)) { - log.error('storage table not found'); - return res.status(204).json(`storage table not found for date ${req.params.month}`); - } - const storageValue = await DbHelper.listInbox(nsName, shardId, nsIndex, storageTable, firstTs); - log.debug(`found value: ${storageValue}`) - log.debug('success is ' + success); - try { - return res.status(200).json(storageValue); - } catch (e) { - return next(e); - } + route.post( + '/ns/:nsName/nsidx/:nsIndex/ts/:ts/key/:key', /* */ + async (req: Request, res: Response, next: NextFunction) => { + logRequest(req); + const nsName = req.params.nsName; // ex: feeds + const nsIndex = req.params.nsIndex; // ex: 1000000 + const ts: string = req.params.ts; //ex: 1661214142.123456 + const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + const body = JSON.stringify(req.body); + log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); + let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); + log.debug(`nodeId=${nodeId} shardId=${shardId}`); + const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); + if (!success) { + let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; + console.log(errMsg); + return res.status(500) + .json({errorMessage: errMsg}) + } + const date = DateUtil.parseUnixFloatAsDateTime(ts); + log.debug(`parsed date ${ts} -> ${date}`) + var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + log.debug(`found table ${storageTable}`) + if (StrUtil.isEmpty(storageTable)) { + log.error('storage table not found'); + var monthStart = date.startOf('month').toISODate().toString(); + var monthEndExclusive = date.startOf('month').plus({months: 1}).toISODate().toString(); + log.debug('creating new storage table'); + const dateYYYYMM = DateUtil.formatYYYYMM(date); + const tableName = `storage_ns_${nsName}_d_${dateYYYYMM}`; + const recordCreated = await DbHelper.createNewNodestorageRecord(nsName, shardId, + monthStart, monthEndExclusive, tableName); + if (recordCreated) { + log.debug('record created: ', recordCreated) + // we've added a new record to node_storage_layout => we can safely try to create a table + // otherwise, if many connections attempt to create a table from multiple threads + // it leads to postgres deadlock sometimes + await DbHelper.createNewStorageTable(tableName); + log.debug('creating node storage layout mapping') } - ); + } + var storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + const storageValue = await DbHelper.putValueInTable(nsName, shardId, nsIndex, storageTable, ts, key, body); + log.debug(`found value: ${storageValue}`) + log.debug('success is ' + success); + try { + return res.status(201).json(storageValue); + } catch (e) { + return next(e); + } + } + ); + + /* Search for namespace:namespaceIndex data , ordered by timestamp asc, paginated by timestamp (!) + Pagination is achieved by using firstTs parameter, passed from the previous invocation + Timestamp example: 1661214142.000000 ( unixtime.microseconds ) + * */ + route.post( + '/ns/:nsName/nsidx/:nsIndex/month/:month/list/', /* */ + async (req: Request, res: Response, next: NextFunction) => { + logRequest(req); + // we will search for data starting from this key exclusive + // use lastTs from the previous request to get more data + const firstTs: string = req.query.firstTs; + const nsName = req.params.nsName; + const nsIndex = req.params.nsIndex; + const dt = req.params.month + '01'; + const key = req.params.key; + const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + const body = JSON.stringify(req.body); + const page = parseInt(req.params.page); + log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); + let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); + log.debug(`nodeId=${nodeId} shardId=${shardId}`); + const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); + if (!success) { + let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; + console.log(errMsg); + return res.status(500) + .json({errorMessage: errMsg}) + } + const date = DateTime.fromISO(dt, {zone: 'utc'}); + log.debug(`parsed date ${date} -> ${date}`) + // since the date is 1st day of month - we can do a lookup of the table name + const storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); + log.debug(`found table ${storageTable}`) + if (StrUtil.isEmpty(storageTable)) { + log.error('storage table not found'); + return res.status(204).json(`storage table not found for date ${req.params.month}`); + } + const storageValue = await DbHelper.listInbox(nsName, shardId, nsIndex, storageTable, firstTs); + log.debug(`found value: ${storageValue}`) + log.debug('success is ' + success); + try { + return res.status(200).json(storageValue); + } catch (e) { + return next(e); + } + } + ); }; diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 20ab78f..b579e1d 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -101,8 +101,10 @@ export default class DbHelper { }); } - public static async createNewStorageTable(tableName: string): Promise { - const sql = ` + public static async createNewStorageTable(tableName: string): Promise { + + // primary key should prevent duplicates by skey per inbox + await PgUtil.update(` CREATE TABLE IF NOT EXISTS ${tableName} ( namespace VARCHAR(20) NOT NULL, @@ -112,28 +114,12 @@ export default class DbHelper { skey VARCHAR(64) NOT NULL, dataSchema VARCHAR(20) NOT NULL, payload JSONB, - PRIMARY KEY(namespace,namespace_shard_id,namespace_id,skey,ts) - );`; - /* - real primary key: namespace + namespase_id + skey - namespace_shard_id is evaluated from namespace_id - ts is not important + PRIMARY KEY(namespace,namespace_shard_id,namespace_id,skey) + );`); - we use all the fields to have good btree which allows search and sorting with - (namespace) - (namespace, namespace_shard_id) - (namespace, namespace_shard_id,namespace_id) - (namespace, namespace_shard_id,namespace_id, skey) - (namespace,namespace_shard_id,namespace_id, skey,ts) - */ - console.log(sql) - return pgPool.query(sql).then(data => { - console.log(data) - return Promise.resolve(true) - }).catch(err => { - console.log(err); - return Promise.resolve(false); - }); + await PgUtil.update(`CREATE INDEX IF NOT EXISTS + ${tableName}_idx ON ${tableName} + USING btree (namespace ASC, namespace_id ASC, ts ASC);`); } // todo fix params substitution for the pg library; @@ -219,7 +205,7 @@ export default class DbHelper { const sql = `INSERT INTO ${storageTable} (namespace, namespace_shard_id, namespace_id, ts, skey, dataschema, payload) values ('${ns}', '${shardId}', '${nsIndex}', to_timestamp(${ts}),'${skey}', 'v1', '${body}') - ON CONFLICT (namespace,namespace_shard_id,namespace_id,skey,ts) DO UPDATE SET payload = '${body}'` + ON CONFLICT (namespace,namespace_shard_id,namespace_id,skey) DO UPDATE SET payload = '${body}'` log.debug(sql); return pgPool.none(sql).then(data => { log.debug(data); diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index 88a192f..5df72bf 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -32,13 +32,13 @@ export class BlockStorage { await MySqlUtil.insert(` CREATE TABLE IF NOT EXISTS dset_queue_mblock ( - id BIGINT NOT NULL AUTO_INCREMENT, - ts timestamp default CURRENT_TIMESTAMP() COMMENT 'timestamp is used for querying the queu', - object_hash VARCHAR(255) NOT NULL, - object_shard INT NOT NULL COMMENT 'message block shard', + id BIGINT NOT NULL AUTO_INCREMENT, + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'timestamp is used for querying the queu', + object_hash VARCHAR(255) NOT NULL, + object_shard INT NOT NULL COMMENT 'message block shard', PRIMARY KEY (id), UNIQUE KEY uniq_mblock_object_hash (object_hash, object_shard), - FOREIGN KEY (object_hash) REFERENCES blocks(object_hash) + FOREIGN KEY (object_hash) REFERENCES blocks (object_hash) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; `); @@ -61,7 +61,7 @@ export class BlockStorage { await MySqlUtil.insert(` CREATE TABLE IF NOT EXISTS contract_shards ( - ts timestamp default CURRENT_TIMESTAMP() COMMENT 'update timestamp', + ts timestamp default CURRENT_TIMESTAMP() COMMENT 'update timestamp', shards_assigned json NOT NULL COMMENT 'optional: a uniq field to fight duplicates', PRIMARY KEY (ts) ) ENGINE = InnoDB @@ -85,12 +85,13 @@ export class BlockStorage { // insert block this.log.info('received block with hash %s, adding to the db', calculatedHash); const objectAsJson = JSON.stringify(mb); + const shardSetAsJson = JSON.stringify(Coll.setToArray(shardSet)); const res = await MySqlUtil.insert( `INSERT IGNORE INTO blocks(object, object_hash, object_shards) VALUES (?, ?, ?)`, - objectAsJson, calculatedHash, JSON.stringify(shardSet)); + objectAsJson, calculatedHash, shardSetAsJson); let requiresProcessing = res.affectedRows === 1; if (!requiresProcessing) { return false; @@ -159,6 +160,10 @@ export class BlockStorage { handler: (messageBlockJson: string, messageBlockHash: string, messageBlockShards: Set) => Promise) { + if (shardsToLookFor.size == 0) { + this.log.debug('iterateAllStoredBlocks(): no shards to unpack '); + return; + } // [1,2] => (1, 2) let shardsAsCsv = Array.from(shardsToLookFor.keys()).join(','); diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index 5a7c9d6..010965b 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -96,9 +96,8 @@ export class IndexStorage { // we've added a new record to node_storage_layout => we can safely try to create a table // otherwise, if many connections attempt to create a table from multiple threads // it leads to postgres deadlock sometimes - const createtable = await DbHelper.createNewStorageTable(tableName); + await DbHelper.createNewStorageTable(tableName); this.log.debug('creating node storage layout mapping') - this.log.debug(createtable); storageTable = tableName; } } @@ -107,21 +106,25 @@ export class IndexStorage { this.log.debug(`found value: ${storageValue}`) } + // todo remove shard entries from node_storage_layout also? public async deleteShardsFromInboxes(shardsToDelete: Set) { + this.log.debug('deleteShardsFromInboxes(): shardsToDelete: %j', + Coll.setToArray(shardsToDelete)); if (shardsToDelete.size == 0) { return; } - // indexStorage // delete from index - let shardsToDeleteAsString = Coll.setToArray(shardsToDelete).join(','); - const tableArr = await PgUtil.queryArr<{ table_name: string }>( - 'select table_name from node_storage_layout'); - for (const tableName of tableArr) { - this.log.debug('clearing table %s from shards %o', tableName, shardsToDeleteAsString); + let idsToDelete = Coll.numberSetToSqlQuoted(shardsToDelete); + const rows = await PgUtil.queryArr<{ table_name: string }>( + `select distinct table_name + from node_storage_layout + where namespace_shard_id in ${idsToDelete}`); + for (const row of rows) { + this.log.debug('clearing table %s from shards %o', row, idsToDelete); await PgUtil.update(`delete - from ${tableName} - where namespace_shard_id in (?)`, - shardsToDeleteAsString); + from ${row.table_name} + where namespace_shard_id in ${idsToDelete}`, + idsToDelete); } } diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 5688aa8..d908117 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -81,7 +81,7 @@ export default class StorageNode implements Consumer { // todo raise a flag while executing this; handle new updates somehow? public async handleReshard(newShards: Set) { const oldShards = await this.blockStorage.loadNodeShards(); - this.log.debug('handleReshard(): newShards: %j', + this.log.debug('handleReshard(): newShards: %j oldShards: %j', Coll.setToArray(newShards), Coll.setToArray(oldShards)) if (Coll.isEqualSet(newShards, oldShards)) { this.log.debug('handleReshard(): no reshard is needed') diff --git a/snode/src/utilz/coll.ts b/snode/src/utilz/coll.ts index b2234da..6a1e9b0 100644 --- a/snode/src/utilz/coll.ts +++ b/snode/src/utilz/coll.ts @@ -74,4 +74,9 @@ export class Coll { public static numberSetToJson(s: Set): string { return JSON.stringify([...s]); } + + // set 1,2,3 to sql: ('1','2','3') + public static numberSetToSqlQuoted(s:Set): string { + return '(' + Coll.setToArray(s).map(num => "'" + num + "'").join(',') + ')'; + } } diff --git a/snode/src/utilz/pgUtil.ts b/snode/src/utilz/pgUtil.ts index 1690da7..03ea7f2 100644 --- a/snode/src/utilz/pgUtil.ts +++ b/snode/src/utilz/pgUtil.ts @@ -59,18 +59,21 @@ export class PgUtil { public static async update(query: string, ...sqlArgs: any[]): Promise { query = StrUtil.replaceAllMySqlToPostre(query); + this.log.debug(query, ' ---> args ', sqlArgs); let result = await this.pool.result(query, sqlArgs,r => r.rowCount); return result; } public static async insert(query: string, ...sqlArgs: any[]): Promise { query = StrUtil.replaceAllMySqlToPostre(query); + this.log.debug(query, ' ---> args ', sqlArgs); let result = await this.pool.result(query, sqlArgs,r => r.rowCount); return result; } public static async queryArr(query: string, ...sqlArgs: any[]): Promise { query = StrUtil.replaceAllMySqlToPostre(query); + this.log.debug(query, ' ---> args ', sqlArgs); let result = await this.pool.query(query, sqlArgs); return result; } From 7f5c7e1fdbf8ff1df56d79698a91a67f1439454a Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 16 Sep 2023 14:52:25 +0400 Subject: [PATCH 58/84] fix: fixed bug - when lowering rf we don't clear shards for some cases --- smart-contracts/README.md | 2 +- smart-contracts/contracts/Storage.sol | 16 +++++- smart-contracts/test/StorageContract.test.ts | 53 +++++++++++++++++++- snode/src/services/messaging/storageNode.ts | 16 +++--- 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/smart-contracts/README.md b/smart-contracts/README.md index 8f0170a..994551e 100644 --- a/smart-contracts/README.md +++ b/smart-contracts/README.md @@ -12,7 +12,7 @@ Storage.sol tests npx hardhat test --grep StorageTestAutoRf npx hardhat test --grep StorageTestNoAutoRf # for fuzzy tests (takes 5-15min) -npx hardhat test --grep StorageTestBig +StorageTestBig=true npx hardhat test --grep StorageTestBig ``` ## 2 How to set up the local env diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index b72a451..05e9fde 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -128,6 +128,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- // allows to set replication factor manually; however this is limited by node count; + // call shuffle after this to take effect function overrideRf(uint8 rf_) public onlyOwner { require(rf_ <= nodeIdList.length, 'rf is limited by node count'); rf = rf_; @@ -135,6 +136,18 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { rfTarget = 0; } + // revert back to automated replication factor (rf grows up to rfTarget when possible) + // call shuffle after this to take effect + function setRfTarget(uint8 rfTarget_) public onlyOwner { + rfTarget = rfTarget_; + uint rf_ = rfTarget_; + if (rf_ > nodeIdList.length) { + rf_ = nodeIdList.length; + } + rf = uint8(rf_); + rfChangedByAdmin = true; + } + // allows to set function setNodeShardsByAddr(address nodeAddress_, uint32 bitmap_) public onlyOwner { uint8 node = mapAddrToNodeId[nodeAddress_]; @@ -416,13 +429,14 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // decide if (unusedPos_ == - 1) { // over-assigned - this food is no longer available - nodeShardsBitmap_[nodeId_] = setBit(shardmask_, shard); + shardmask_ = clearBit(shardmask_, shard); nodeModifiedSet_[nodeId_]++; } else { // this food is used unusedArr_[uint(unusedPos_)] = NULL_SHARD; } } + nodeShardsBitmap_[nodeId_] = shardmask_; } // cleanup unused from empty slots (-1); normally most of them would be empty; { diff --git a/smart-contracts/test/StorageContract.test.ts b/smart-contracts/test/StorageContract.test.ts index 90fa4e5..573f237 100644 --- a/smart-contracts/test/StorageContract.test.ts +++ b/smart-contracts/test/StorageContract.test.ts @@ -438,13 +438,64 @@ describe("StorageTestNoAutoRf", function () { s.checkDistribution(2); } }) + + + it('test_admin_lowers_rf_2to1', async () => { + let t1 = await ct.addNode(nodes[1]); + await expect(t1).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1]]); + let t2 = await ct.addNode(nodes[2]); + await expect(t2).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[2]]); + assert.equal(2, await ct.rf()); + debug('------ admin sets a fixed rf of 1; so we need to grab a lot at unassigned check stage'); + let t3 = await ct.overrideRf(1); + await t.confirmTransaction(t3); + assert.equal(1, await ct.rf()); + assert.equal(0, await ct.rfTarget()); + + let t4 = await ct.shuffle(); + await expect(t4).to.emit(ct, "SNodeMappingChanged").withArgs([nodes[1], nodes[2]]); + assert.equal(1, await ct.rf()); + assert.equal(0, await ct.rfTarget()); + + }); + + + it('test_admin_lowers_rf_5_to_0', async () => { + // add nodes from 1 to 20 + let nodeCount = 0; + for (let nodeId = 1; nodeId <= 25; nodeId++) { + const addr = nodes[nodeId]; + debug('adding nodeId: %s with address: %s', nodeId, addr); + let t1 = await ct.addNode(addr); + await t.confirmTransaction(t1); + nodeCount++; + } + debug('---- added nodes, lowering rf') + // lower rf from 5 to 0 manually + for (let rf = 5; rf >= 1; rf--) { + debug('---- rf set to ', rf); + let t1 = await ct.overrideRf(rf); + await t.confirmTransaction(t1); + + assert.equal(rf, await ct.rf()); + assert.equal(0, await ct.rfTarget()); + + let t2 = await ct.shuffle(); + await t.confirmTransaction(t2); + + let s = await State.readFromEvm(); + s.checkRf(rf); + s.checkNodeCount(nodeCount); + s.checkDistribution(); + } + }).timeout(600000) }); describe('StorageTestBig', function () { // runs only when ENV is set because it takes time - if(process.env.StorageTestBig!=='true') { + if (process.env.StorageTestBig !== 'true') { return; } diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index d908117..5083008 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -12,7 +12,11 @@ import {WinstonUtil} from "../../utilz/winstonUtil"; import {StorageContractState} from "../messaging-common/storageContractState"; import {IndexStorage} from "./IndexStorage"; - +// todo reshard(): +// raise a flag while executing this; handle new updates somehow? +// todo V2 reshard(): +// redownload every block from peers (snodes), +// using the right virtual queue which exists for missing shards in (shardsToAdd) @Service() export default class StorageNode implements Consumer { public log: Logger = WinstonUtil.newLog(StorageNode) @@ -78,7 +82,6 @@ export default class StorageNode implements Consumer { } - // todo raise a flag while executing this; handle new updates somehow? public async handleReshard(newShards: Set) { const oldShards = await this.blockStorage.loadNodeShards(); this.log.debug('handleReshard(): newShards: %j oldShards: %j', @@ -100,20 +103,17 @@ export default class StorageNode implements Consumer { // add to index // reprocess every block from blocks table (only once per each block) // if the block has shardsToAdd -> add anything which is in shardsToAdd + const pageSize = 30; await this.blockStorage.iterateAllStoredBlocks(this.storageContractState.shardCount, - 1, + pageSize, shardsToAdd, async (messageBlockJson, messageBlockHash, messageBlockShards) => { let mb: MessageBlock = JSON.parse(messageBlockJson); let shardsToAddFromBlock = Coll.intersectSet(shardsToAdd, messageBlockShards); this.log.debug('reindexing block %s, blockShards %s, shardsToAdd %s,, shardsToAddFromBlock', - messageBlockHash, messageBlockShards, shardsToAdd, shardsToAddFromBlock) + messageBlockHash, Coll.setToArray(messageBlockShards), Coll.setToArray(shardsToAdd), Coll.setToArray(shardsToAddFromBlock)) await this.indexStorage.unpackBlockToInboxes(mb, shardsToAddFromBlock); }); - - // todo V2 redownload every block from peers (snodes), - // using the right virtual queue which exists for missing shards in (shardsToAdd) - await this.blockStorage.saveNodeShards(newShards); } } \ No newline at end of file From 32c97770b1895a139f4ab83fc844de668236d4bf Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sat, 16 Sep 2023 15:24:20 +0400 Subject: [PATCH 59/84] add: tested 2 snodes with a Storage contract manual reshard --- snode/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/snode/package.json b/snode/package.json index b538cb2..f621fdd 100755 --- a/snode/package.json +++ b/snode/package.json @@ -7,6 +7,7 @@ "build": "rimraf ./build && tsc", "dev": "ts-node-dev --respawn --inspect=9229 --transpile-only ./src/app.ts", "dev6001": "ts-node-dev --inspect=6001 --transpile-only ./src/app.ts", + "dev6002": "ts-node-dev --inspect=6002 --transpile-only ./src/app.ts", "heroku-postbuild": "npm run build", "start": "nodemon", "inspect": "nodemon --inspect src/app.ts", From 92ff63f9a45d0e661c0e4c759342770b26f8bb3f Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 19 Sep 2023 12:16:46 +0400 Subject: [PATCH 60/84] add: queue client bug --- .../src/services/messaging-dset/queueClient.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/snode/src/services/messaging-dset/queueClient.ts b/snode/src/services/messaging-dset/queueClient.ts index 1dceef4..93253cd 100644 --- a/snode/src/services/messaging-dset/queueClient.ts +++ b/snode/src/services/messaging-dset/queueClient.ts @@ -1,10 +1,10 @@ // ------------------------------ // reads other node queue fully, appends everything to the local queue/storage -import { Logger } from 'winston' -import { WinstonUtil } from '../../utilz/winstonUtil' -import { MySqlUtil } from '../../utilz/mySqlUtil' +import {Logger} from 'winston' +import {WinstonUtil} from '../../utilz/winstonUtil' +import {MySqlUtil} from '../../utilz/mySqlUtil' import axios from 'axios' -import { Consumer, QItem } from './queueTypes' +import {Consumer, QItem} from './queueTypes' export class QueueClient { public log: Logger = WinstonUtil.newLog(QueueClient) @@ -66,7 +66,12 @@ export class QueueClient { } for (const item of reply.items) { endpointStats.downloadedItems++ - const appendSuccessful = await this.consumer.accept(item) + let appendSuccessful = false; + try { + appendSuccessful = await this.consumer.accept(item); + } catch (e) { + this.log.error('error processing accept(): queue %s: ', this.queueName, e); + } if (appendSuccessful) { endpointStats.newItems++ } @@ -107,7 +112,7 @@ export class QueueClient { public async readLastOffset(queueName: string, baseUri: string): Promise { const url = `${baseUri}/api/v1/dset/queue/${queueName}/lastOffset` - const resp: { result: number } = await axios.get(url, { timeout: 3000 }) + const resp: { result: number } = await axios.get(url, {timeout: 3000}) return resp.result } } From f11fe1cd707cd599517b2406a38b7dbf8f694c0b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 19 Sep 2023 12:17:06 +0400 Subject: [PATCH 61/84] add: storageContractState now uses listeners instead of DI --- .../messaging-common/storageContractState.ts | 21 ++++++++++--------- snode/src/services/messaging/storageNode.ts | 7 +++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 7d5a952..5916130 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -4,20 +4,17 @@ import {WinstonUtil} from "../../utilz/winstonUtil"; import {EnvLoader} from "../../utilz/envLoader"; import {Contract, ethers, Wallet} from "ethers"; import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; -import path from "path"; import fs, {readFileSync} from "fs"; -import {ValidatorCtClient} from "./validatorContractState"; import {BitUtil} from "../../utilz/bitUtil"; import {EthersUtil} from "../../utilz/ethersUtil"; import {Coll} from "../../utilz/coll"; -import StorageNode from "../messaging/storageNode"; + @Service() export class StorageContractState { public log: Logger = WinstonUtil.newLog(StorageContractState); - @Inject(type => StorageNode) - private storageNode: StorageNode; + private listener: StorageContractListener; private provider: JsonRpcProvider private abi: string private rpcEndpoint: string @@ -35,8 +32,9 @@ export class StorageContractState { public shardCount: number; public nodeShards: Set; - public async postConstruct() { - this.log.info('postConstruct()') + public async postConstruct(listener: StorageContractListener) { + this.log.info('postConstruct()'); + this.listener = listener; this.storageCtAddr = EnvLoader.getPropertyOrFail('STORAGE_CONTRACT_ADDRESS') this.rpcEndpoint = EnvLoader.getPropertyOrFail('VALIDATOR_RPC_ENDPOINT') this.rpcNetwork = Number.parseInt(EnvLoader.getPropertyOrFail('VALIDATOR_RPC_NETWORK')) @@ -64,7 +62,6 @@ export class StorageContractState { return contract; } - // todo re-read on every change public async readContractState() { this.log.info(`connected to StorageContract: ${this.storageCt.address} as node ${this.nodeWallet.address}`) this.rf = await this.storageCt.rf(); @@ -76,7 +73,7 @@ export class StorageContractState { this.nodeShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); this.log.info(`this node %s is assigned to shards (%s) : %s`, this.nodeWallet.address, nodeShardmask.toString(2), Coll.setToArray(this.nodeShards)); - await this.storageNode.handleReshard(this.nodeShards); + await this.listener.handleReshard(this.nodeShards); } public async subscribeToContractChanges() { @@ -90,7 +87,7 @@ export class StorageContractState { const newShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); // publish, new data would settle according to the new shards right away this.nodeShards = newShards; - await this.storageNode.handleReshard(newShards); + await this.listener.handleReshard(newShards); }); } } @@ -106,4 +103,8 @@ export interface StorageContractAPI { nodeCount(): Promise; SHARD_COUNT(): Promise; +} + +export interface StorageContractListener { + handleReshard(nodeShards: Set): Promise; } \ No newline at end of file diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 5083008..9afe3c4 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -9,7 +9,7 @@ import {QueueManager} from "./queueManager"; import {Coll} from "../../utilz/coll"; import {Check} from "../../utilz/check"; import {WinstonUtil} from "../../utilz/winstonUtil"; -import {StorageContractState} from "../messaging-common/storageContractState"; +import {StorageContractListener, StorageContractState} from "../messaging-common/storageContractState"; import {IndexStorage} from "./IndexStorage"; // todo reshard(): @@ -18,7 +18,7 @@ import {IndexStorage} from "./IndexStorage"; // redownload every block from peers (snodes), // using the right virtual queue which exists for missing shards in (shardsToAdd) @Service() -export default class StorageNode implements Consumer { +export default class StorageNode implements Consumer, StorageContractListener { public log: Logger = WinstonUtil.newLog(StorageNode) @Inject() @@ -42,9 +42,8 @@ export default class StorageNode implements Consumer { await this.blockStorage.postConstruct(); await this.indexStorage.postConstruct(); await this.valContractState.postConstruct(); - await this.storageContractState.postConstruct(); + await this.storageContractState.postConstruct(this); await this.queueManager.postConstruct(); - // MySqlUtil.init(dbHelper.pool); todo postgres !!!!!!!!!!!!!! } // remote queue handler From db7d66d412949706839768bf3f2c06b561af5211 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 19 Sep 2023 14:33:04 +0400 Subject: [PATCH 62/84] add: storageContractState reads all nodes state on modify --- .../messaging-common/storageContractState.ts | 50 ++++++++++++------- snode/src/services/messaging/IndexStorage.ts | 3 +- snode/src/services/messaging/storageNode.ts | 3 +- snode/src/utilz/check.ts | 7 +++ 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 5916130..015c7f7 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -1,13 +1,14 @@ -import {Inject, Service} from "typedi"; +import {Service} from "typedi"; import {Logger} from "winston"; import {WinstonUtil} from "../../utilz/winstonUtil"; import {EnvLoader} from "../../utilz/envLoader"; import {Contract, ethers, Wallet} from "ethers"; import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; -import fs, {readFileSync} from "fs"; +import {readFileSync} from "fs"; import {BitUtil} from "../../utilz/bitUtil"; import {EthersUtil} from "../../utilz/ethersUtil"; import {Coll} from "../../utilz/coll"; +import {Check} from "../../utilz/check"; @Service() @@ -30,7 +31,7 @@ export class StorageContractState { private storageCt: StorageContract; public rf: number; public shardCount: number; - public nodeShards: Set; + public nodeShardMap: Map> = new Map(); public async postConstruct(listener: StorageContractListener) { this.log.info('postConstruct()'); @@ -68,28 +69,39 @@ export class StorageContractState { let nodeCount = await this.storageCt.nodeCount(); this.shardCount = await this.storageCt.SHARD_COUNT(); this.log.info(`rf: ${this.rf} , shard count: ${this.shardCount} total nodeCount: ${nodeCount}`); - let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeWallet.address); + let nodesAddrList = await this.storageCt.getNodeAddresses(); + await this.reloadEveryAddressMask(nodesAddrList); + this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); // publish, new data would settle according to the new shards right away - this.nodeShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); - this.log.info(`this node %s is assigned to shards (%s) : %s`, - this.nodeWallet.address, nodeShardmask.toString(2), Coll.setToArray(this.nodeShards)); - await this.listener.handleReshard(this.nodeShards); + await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); } public async subscribeToContractChanges() { this.storageCt.on('SNodeMappingChanged', async (nodeList: string[]) => { this.log.info(`EVENT: SNodeMappingChanged: nodeList=${JSON.stringify(nodeList)}`); - const pos = Coll.findIndex(nodeList, item => item === this.nodeAddress); - if (pos < 0) { - return; - } - let nodeShardmask = await this.storageCt.getNodeShardsByAddr(this.nodeAddress); - const newShards = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); - // publish, new data would settle according to the new shards right away - this.nodeShards = newShards; - await this.listener.handleReshard(newShards); + await this.reloadEveryAddressMask(nodeList); + await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); }); } + + // todo we can add 1 contract call for all addrs + async reloadEveryAddressMask(nodeAddrList: string[]): Promise { + for (const nodeAddr of nodeAddrList) { + let nodeShardmask = await this.storageCt.getNodeShardsByAddr(nodeAddr); + const shardSet = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); + this.nodeShardMap.set(nodeAddr, shardSet); + this.log.info(`node %s is re-assigned to shards (%s) : %s`, + nodeAddr, nodeShardmask.toString(2), Coll.setToArray(shardSet)); + } + } + + // fails if this.nodeAddress is not defined + public getNodeShards(): Set { + Check.notEmpty(this.nodeAddress); + const nodeShards = this.nodeShardMap.get(this.nodeAddress); + Check.notEmptySet(nodeShards); + return nodeShards; + } } type StorageContract = StorageContractAPI & Contract; @@ -98,6 +110,8 @@ export interface StorageContractAPI { rf(): Promise; + getNodeAddresses(): Promise; + getNodeShardsByAddr(addr: string): Promise; nodeCount(): Promise; @@ -106,5 +120,5 @@ export interface StorageContractAPI { } export interface StorageContractListener { - handleReshard(nodeShards: Set): Promise; + handleReshard(currentNodeShards: Set|null, allNodeShards: Map>): Promise; } \ No newline at end of file diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index 010965b..d2db04f 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -35,8 +35,7 @@ export class IndexStorage { */ public async unpackBlockToInboxes(mb: MessageBlock, shardSet: Set) { // this is the list of shards that we support on this node - const nodeShards = this.storageContractState.nodeShards; - Check.notNull(nodeShards); + const nodeShards = this.storageContractState.getNodeShards(); this.log.debug('storage node supports %s shards: %o', nodeShards.size, nodeShards); let shardsToProcess = Coll.intersectSet(shardSet, nodeShards); this.log.debug('block %s has %d inboxes to unpack', mb.id, shardsToProcess) diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index 9afe3c4..df0f97b 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -81,7 +81,8 @@ export default class StorageNode implements Consumer, StorageContractList } - public async handleReshard(newShards: Set) { + public async handleReshard(currentNodeShards: Set|null, allNodeShards: Map>) { + let newShards = currentNodeShards; const oldShards = await this.blockStorage.loadNodeShards(); this.log.debug('handleReshard(): newShards: %j oldShards: %j', Coll.setToArray(newShards), Coll.setToArray(oldShards)) diff --git a/snode/src/utilz/check.ts b/snode/src/utilz/check.ts index 7368fda..6209236 100644 --- a/snode/src/utilz/check.ts +++ b/snode/src/utilz/check.ts @@ -13,6 +13,7 @@ export class Check { } } + // todo make var types public static notEmpty(value: string, err?: string) { if (StrUtil.isEmpty(value)) { throw new Error(StrUtil.isEmpty(err) ? 'Str empty check failed' : err) @@ -24,4 +25,10 @@ export class Check { throw new Error(StrUtil.isEmpty(err) ? 'Str empty check failed' : err) } } + + public static notEmptySet(value: Set, err?: string) { + if (value == null || value.size == 0) { + throw new Error(StrUtil.isEmpty(err) ? 'Set empty check failed' : err) + } + } } From 63bd521f2561c047b6bb364b7742a33823c4263c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 19 Sep 2023 15:20:04 +0400 Subject: [PATCH 63/84] add: storageContractState works with and without signer --- .../messaging-common/storageContractState.ts | 78 +++++++++++-------- .../validatorContractState.ts | 4 +- snode/src/services/messaging/storageNode.ts | 2 +- snode/src/utilz/ethersUtil.ts | 48 ++++++++++++ 4 files changed, 98 insertions(+), 34 deletions(-) diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 015c7f7..2aa54fd 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -17,23 +17,23 @@ export class StorageContractState { private listener: StorageContractListener; private provider: JsonRpcProvider - private abi: string private rpcEndpoint: string private rpcNetwork: number - private configDir: string - private pkFile: string; - private pkPass: string; // NODE STATE - private nodeWallet: Wallet; - private nodeAddress: string; + private nodeWallet: Wallet | null; + private nodeAddress: string | null; // CONTRACT STATE private storageCtAddr: string private storageCt: StorageContract; public rf: number; public shardCount: number; + // node0xA -> shard0, shard1, shard2 public nodeShardMap: Map> = new Map(); + // VARS + // shard0 -> node0xA, node0xB + public shardToNodesMap: Map> = new Map(); - public async postConstruct(listener: StorageContractListener) { + public async postConstruct(useSigner: boolean, listener: StorageContractListener) { this.log.info('postConstruct()'); this.listener = listener; this.storageCtAddr = EnvLoader.getPropertyOrFail('STORAGE_CONTRACT_ADDRESS') @@ -43,26 +43,30 @@ export class StorageContractState { this.rpcEndpoint, this.rpcNetwork ) - this.configDir = EnvLoader.getPropertyOrFail('CONFIG_DIR') - this.abi = EthersUtil.loadAbi(this.configDir, 'StorageV1.json') - this.storageCt = await this.buildRWClient(); + if (useSigner) { + let connect = await EthersUtil.connectWithKey( + EnvLoader.getPropertyOrFail('CONFIG_DIR'), + EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE'), + EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS'), + 'StorageV1.json', + EnvLoader.getPropertyOrFail('STORAGE_CONTRACT_ADDRESS'), + this.provider + ); + this.storageCt = connect.contract; + this.nodeWallet = connect.nodeWallet; + this.nodeAddress = connect.nodeAddress; + } else { + this.storageCt = await EthersUtil.connectWithoutKey( + EnvLoader.getPropertyOrFail('CONFIG_DIR'), + 'StorageV1.json', + EnvLoader.getPropertyOrFail('STORAGE_CONTRACT_ADDRESS'), + this.provider + ) + } await this.readContractState(); await this.subscribeToContractChanges(); // todo ? ethers or hardhat always emits 1 fake event } - public async buildRWClient(): Promise { - this.pkFile = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE') - this.pkPass = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS') - - const jsonFile = readFileSync(this.configDir + '/' + this.pkFile, 'utf-8') - this.nodeWallet = await Wallet.fromEncryptedJson(jsonFile, this.pkPass) - this.nodeAddress = await this.nodeWallet.getAddress() - - const signer = this.nodeWallet.connect(this.provider) - const contract = new ethers.Contract(this.storageCtAddr, this.abi, signer) - return contract; - } - public async readContractState() { this.log.info(`connected to StorageContract: ${this.storageCt.address} as node ${this.nodeWallet.address}`) this.rf = await this.storageCt.rf(); @@ -70,22 +74,19 @@ export class StorageContractState { this.shardCount = await this.storageCt.SHARD_COUNT(); this.log.info(`rf: ${this.rf} , shard count: ${this.shardCount} total nodeCount: ${nodeCount}`); let nodesAddrList = await this.storageCt.getNodeAddresses(); - await this.reloadEveryAddressMask(nodesAddrList); - this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); - // publish, new data would settle according to the new shards right away - await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); + + await this.reloadEveryAddressAndNotifyListeners(nodesAddrList); } public async subscribeToContractChanges() { this.storageCt.on('SNodeMappingChanged', async (nodeList: string[]) => { this.log.info(`EVENT: SNodeMappingChanged: nodeList=${JSON.stringify(nodeList)}`); - await this.reloadEveryAddressMask(nodeList); - await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); + await this.reloadEveryAddressAndNotifyListeners(nodeList); }); } // todo we can add 1 contract call for all addrs - async reloadEveryAddressMask(nodeAddrList: string[]): Promise { + async reloadEveryAddressAndNotifyListeners(nodeAddrList: string[]): Promise { for (const nodeAddr of nodeAddrList) { let nodeShardmask = await this.storageCt.getNodeShardsByAddr(nodeAddr); const shardSet = Coll.arrayToSet(BitUtil.bitsToPositions(nodeShardmask)); @@ -93,6 +94,21 @@ export class StorageContractState { this.log.info(`node %s is re-assigned to shards (%s) : %s`, nodeAddr, nodeShardmask.toString(2), Coll.setToArray(shardSet)); } + + this.shardToNodesMap.clear(); + for (const [nodeAddr, shardSet] of this.nodeShardMap) { + for (const shard of shardSet) { + let nodes = this.shardToNodesMap.get(shard); + if (nodes == null) { + nodes = new Set(); + this.shardToNodesMap.set(shard, nodes); + } + nodes.add(nodeAddr); + } + } + + this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); + await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); } // fails if this.nodeAddress is not defined @@ -120,5 +136,5 @@ export interface StorageContractAPI { } export interface StorageContractListener { - handleReshard(currentNodeShards: Set|null, allNodeShards: Map>): Promise; + handleReshard(currentNodeShards: Set | null, allNodeShards: Map>): Promise; } \ No newline at end of file diff --git a/snode/src/services/messaging-common/validatorContractState.ts b/snode/src/services/messaging-common/validatorContractState.ts index cd8c0e1..df6e484 100644 --- a/snode/src/services/messaging-common/validatorContractState.ts +++ b/snode/src/services/messaging-common/validatorContractState.ts @@ -119,13 +119,13 @@ class ContractClientFactory { return abi; } - // creates a client which can only read blockchain state + public async buildROClient(log: Logger): Promise { const contract = new ethers.Contract(this.validatorCtAddr, this.abi, this.provider) return new ValidatorCtClient(contract, log) } - // creates a client, using an encrypted private key from disk, so that we could write to the blockchain + public async buildRWClient(log: Logger): Promise { this.validatorPrivateKeyFile = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE') this.validatorPrivateKeyPass = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS') diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index df0f97b..f45fdbd 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -42,7 +42,7 @@ export default class StorageNode implements Consumer, StorageContractList await this.blockStorage.postConstruct(); await this.indexStorage.postConstruct(); await this.valContractState.postConstruct(); - await this.storageContractState.postConstruct(this); + await this.storageContractState.postConstruct(true, this); await this.queueManager.postConstruct(); } diff --git a/snode/src/utilz/ethersUtil.ts b/snode/src/utilz/ethersUtil.ts index 9040a10..6f0613e 100644 --- a/snode/src/utilz/ethersUtil.ts +++ b/snode/src/utilz/ethersUtil.ts @@ -1,7 +1,15 @@ import path from "path"; import fs from "fs"; +import {EnvLoader} from "./envLoader"; +import {Contract, ethers, Wallet} from "ethers"; +import {JsonRpcProvider} from "@ethersproject/providers/src.ts/json-rpc-provider"; +import {Logger} from "winston"; +import {ValidatorCtClient} from "../services/messaging-common/validatorContractState"; +import {WinstonUtil} from "./winstonUtil"; export class EthersUtil { + static log = WinstonUtil.newLog(EthersUtil); + public static loadAbi(configDir: string, fileNameInConfigDir: string): string { const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); const file = fs.readFileSync(fileAbsolute, 'utf8'); @@ -10,4 +18,44 @@ export class EthersUtil { console.log(`abi size:`, abi.length); return abi; } + + // creates a client, using an encrypted private key from disk, so that we could sign/write to the blockchain + public static async connectWithKey(configDir: string, + privateKeyFileName: string, + privateKeyPass: string, + contractAbiFileName: string, + contractAddr: string, + provider: JsonRpcProvider): Promise { + let abi = EthersUtil.loadAbi(configDir, contractAbiFileName); + const jsonFile = fs.readFileSync(configDir + '/' + privateKeyFileName, 'utf-8'); + let nodeWallet = await Wallet.fromEncryptedJson(jsonFile, privateKeyPass); + let nodeAddress = await nodeWallet.getAddress(); + const signer = nodeWallet.connect(provider) + const contract = new ethers.Contract(contractAddr, abi, signer); + this.log.debug('connecting contract %s using signer %s (keydir: %s, keyfile: %s, abi: %s) ', + contractAddr, signer.address, configDir, privateKeyFileName, contractAbiFileName); + return { + contract, + nodeWallet, + nodeAddress + }; + } + + // creates a client which can only read blockchain state + public static async connectWithoutKey(configDir: string, + contractAbiFileName: string, + contractAddr: string, + provider: JsonRpcProvider): Promise { + let abi = EthersUtil.loadAbi(configDir, contractAbiFileName); + const contract = new ethers.Contract(contractAddr, abi, provider); + this.log.debug('connecting contract %s (no key, abi: %s) ', + contractAddr, contractAbiFileName); + return contract; + } +} + +type ContractWithMeta = { + contract: Contract; + nodeWallet: Wallet; + nodeAddress: string; } \ No newline at end of file From 915c4129e7a152058cf73e0a33620ea17bdb049b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 20 Sep 2023 00:40:56 +0400 Subject: [PATCH 64/84] add: getItem tested --- smart-contracts/tasks/registerTasks.ts | 3 +- snode/src/api/routes/storageRoutes.ts | 26 +++++----- snode/src/helpers/dbHelper.ts | 7 +-- .../messaging-common/storageContractState.ts | 16 ++++-- .../validatorContractState.ts | 49 +++++++++++++------ 5 files changed, 64 insertions(+), 37 deletions(-) diff --git a/smart-contracts/tasks/registerTasks.ts b/smart-contracts/tasks/registerTasks.ts index bab983c..1fd6abd 100644 --- a/smart-contracts/tasks/registerTasks.ts +++ b/smart-contracts/tasks/registerTasks.ts @@ -52,6 +52,7 @@ task("v:registerStorage", "adds a new storage node") .addParam("validatorProxyCt", "validatorCt proxy address") .addParam("pushCt", "push token contract") .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeUrl", "") .addPositionalParam("nodeAmount", "") .setAction(async (args, hre) => { const validatorProxyCt = args.validatorProxyCt; @@ -62,7 +63,7 @@ task("v:registerStorage", "adds a new storage node") info(`nodeOwner is ${nodeOwner.address}`); const nodeAddress = args.nodeAddress; - const nodeUrl = ''; + const nodeUrl = args.nodeUrl; const nodeAmount = args.nodeAmount; info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, NodeType.SNode); diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index fe45efd..75a0535 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -11,6 +11,8 @@ import {ValidatorContractState} from "../../services/messaging-common/validatorC import onlyLocalhost from "../middlewares/onlyLocalhost"; import StorageNode from "../../services/messaging/storageNode"; import {Coll} from "../../utilz/coll"; +import {MessageBlockUtil} from "../../services/messaging-common/messageBlock"; +import {StorageContractState} from "../../services/messaging-common/storageContractState"; const route = Router(); const dbh = new DbHelper(); @@ -40,25 +42,20 @@ export function storageRoutes(app: Router) { app.use('/v1/kv', route); + route.get( - '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', /* */ + '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', async (req: Request, res: Response, next: NextFunction) => { logRequest(req); const nsName = req.params.nsName; const nsIndex = req.params.nsIndex; const dt = req.params.dt; const key = req.params.key; - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + const valContractState = Container.get(ValidatorContractState); + const storageContractState = Container.get(StorageContractState); + const nodeId = valContractState.nodeId; // todo read this from db log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - return res.status(500) - .json({errorMessage: errMsg}) - } + let shardId = MessageBlockUtil.calculateAffectedShard(nsIndex, storageContractState.shardCount); const date = DateTime.fromISO(dt, {zone: 'utc'}); if (!date.isValid) { return res.status(400).json('Invalid date ' + dt); @@ -70,9 +67,8 @@ export function storageRoutes(app: Router) { log.error('storage table not found'); return res.status(401).json('storage table not found'); } - const storageItems = await DbHelper.findStorageItem(nsName, storageTable, key); + const storageItems = await DbHelper.findStorageItem(nsName, nsIndex, storageTable, key); log.debug(`found value: ${storageItems}`) - log.debug('success is ' + success); try { return res.status(200).json({ items: storageItems @@ -91,7 +87,7 @@ export function storageRoutes(app: Router) { const nsIndex = req.params.nsIndex; // ex: 1000000 const ts: string = req.params.ts; //ex: 1661214142.123456 const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + const nodeId = validatorContractState.nodeId; // todo read this from db const body = JSON.stringify(req.body); log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); @@ -152,7 +148,7 @@ export function storageRoutes(app: Router) { const nsIndex = req.params.nsIndex; const dt = req.params.month + '01'; const key = req.params.key; - const nodeId = Container.get(ValidatorContractState).nodeId; // todo read this from db + const nodeId = validatorContractState.nodeId; // todo read this from db const body = JSON.stringify(req.body); const page = parseInt(req.params.page); log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index b579e1d..af30936 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -38,7 +38,8 @@ const pg: pgPromise.IMain<{}, IClient> = pgPromise(options); export const pgPool = pg(`postgres://${EnvLoader.getPropertyOrFail('PG_USER')}:${EnvLoader.getPropertyOrFail('PG_PASS')}@${EnvLoader.getPropertyOrFail('PG_HOST')}:5432/${EnvLoader.getPropertyOrFail('PG_NAME')}`); PgUtil.init(pgPool); - +// todo use PgUtil +// todo use placeholders (?) export default class DbHelper { public static async createStorageTablesIfNeeded() { @@ -175,13 +176,13 @@ export default class DbHelper { }); } - public static async findStorageItem(ns: string, tableName: string, skey: string): Promise { + public static async findStorageItem(ns: string, nsIndex: string, tableName: string, skey: string): Promise { log.debug(`tableName is ${tableName} , skey is ${skey}`); const sql = `select skey as skey, extract(epoch from ts) as ts, payload as payload from ${tableName} - where skey = '${skey}'`; + where skey = '${skey}' and namespace_id='${nsIndex}' and namespace='${ns}'`; log.debug(sql); return pgPool.query(sql).then(data => { log.debug(data); diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 2aa54fd..9c1e48d 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -19,6 +19,7 @@ export class StorageContractState { private provider: JsonRpcProvider private rpcEndpoint: string private rpcNetwork: number + private useSigner: boolean; // NODE STATE private nodeWallet: Wallet | null; private nodeAddress: string | null; @@ -68,7 +69,7 @@ export class StorageContractState { } public async readContractState() { - this.log.info(`connected to StorageContract: ${this.storageCt.address} as node ${this.nodeWallet.address}`) + this.log.info(`connected to StorageContract`) this.rf = await this.storageCt.rf(); let nodeCount = await this.storageCt.nodeCount(); this.shardCount = await this.storageCt.SHARD_COUNT(); @@ -106,9 +107,12 @@ export class StorageContractState { nodes.add(nodeAddr); } } - - this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); - await this.listener.handleReshard(this.getNodeShards(), this.nodeShardMap); + let nodeShards: Set = null; + if (this.useSigner) { + this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); + nodeShards = this.getNodeShards(); + } + await this.listener.handleReshard(nodeShards, this.nodeShardMap); } // fails if this.nodeAddress is not defined @@ -118,6 +122,10 @@ export class StorageContractState { Check.notEmptySet(nodeShards); return nodeShards; } + + public getStorageNodesForShard(shard: number): Set | null { + return this.shardToNodesMap.get(shard); + } } type StorageContract = StorageContractAPI & Contract; diff --git a/snode/src/services/messaging-common/validatorContractState.ts b/snode/src/services/messaging-common/validatorContractState.ts index df6e484..2791d48 100644 --- a/snode/src/services/messaging-common/validatorContractState.ts +++ b/snode/src/services/messaging-common/validatorContractState.ts @@ -24,7 +24,7 @@ export class ValidatorContractState { public contractCli: ValidatorCtClient public async postConstruct() { - this.log.info('postConstruct()') + this.log.info('ValidatorContractState.postConstruct()') this.contractFactory = new ContractClientFactory() this.contractCli = await this.contractFactory.buildRWClient(this.log) await this.contractCli.connect() @@ -111,21 +111,21 @@ class ContractClientFactory { } private static loadValidatorContractAbi(configDir: string, fileNameInConfigDir: string): string { - const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`); - const file = fs.readFileSync(fileAbsolute, 'utf8'); - const json = JSON.parse(file); - const abi = json.abi; - console.log(`abi size:`, abi.length); - return abi; + const fileAbsolute = path.resolve(configDir, `./${fileNameInConfigDir}`) + const file = fs.readFileSync(fileAbsolute, 'utf8') + const json = JSON.parse(file) + const abi = json.abi + console.log(`abi size:`, abi.length) + return abi } - + // creates a client which can only read blockchain state public async buildROClient(log: Logger): Promise { const contract = new ethers.Contract(this.validatorCtAddr, this.abi, this.provider) return new ValidatorCtClient(contract, log) } - + // creates a client, using an encrypted private key from disk, so that we could write to the blockchain public async buildRWClient(log: Logger): Promise { this.validatorPrivateKeyFile = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_FILE') this.validatorPrivateKeyPass = EnvLoader.getPropertyOrFail('VALIDATOR_PRIVATE_KEY_PASS') @@ -140,19 +140,40 @@ class ContractClientFactory { } } +interface ValidatorContract { + attestersRequired(): Promise + nodeRandomMinCount(): Promise + nodeRandomPingCount(): Promise + getNodes(): Promise + getNodeInfo(address: string): Promise +} + +interface NodeInfo2 { + shortAddr: number + ownerWallet: string + nodeWallet: string + nodeType: NodeType + nodeTokens: number + nodeApiBaseUrl: string + counters: any + status: NodeStatus +} + +type TypedValidatorContract = ValidatorContract & Contract + // all Validator contract interactions are wrapped into this class export class ValidatorCtClient { - contract: Contract + contract: TypedValidatorContract private log: Logger // contract state nodeMap: Map = new Map() - public attestersRequired: number; - public nodeRandomMinCount: number; - public nodeRandomPingCount: number; + public attestersRequired: number + public nodeRandomMinCount: number + public nodeRandomPingCount: number constructor(contract: ethers.Contract, log: Logger) { - this.contract = contract + this.contract = contract this.log = log } From 9972f3941b7400dc21b3f62de8cda3f10a3c6d46 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 20 Sep 2023 04:46:57 +0400 Subject: [PATCH 65/84] add: listItem tested --- snode/src/api/routes/storageRoutes.ts | 43 ++++++++++--------- snode/src/helpers/dbHelper.ts | 28 +++++++----- .../services/messaging-common/messageBlock.ts | 9 ++++ .../messaging-common/storageContractState.ts | 5 ++- snode/src/services/messaging/IndexStorage.ts | 11 ++++- snode/src/services/messaging/storageNode.ts | 2 +- snode/src/utilz/coll.ts | 23 +++++++++- 7 files changed, 86 insertions(+), 35 deletions(-) diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index 75a0535..61e0b93 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -43,6 +43,7 @@ export function storageRoutes(app: Router) { app.use('/v1/kv', route); + // todo move to StorageNode route.get( '/ns/:nsName/nsidx/:nsIndex/date/:dt/key/:key', async (req: Request, res: Response, next: NextFunction) => { @@ -51,11 +52,13 @@ export function storageRoutes(app: Router) { const nsIndex = req.params.nsIndex; const dt = req.params.dt; const key = req.params.key; + const valContractState = Container.get(ValidatorContractState); const storageContractState = Container.get(StorageContractState); const nodeId = valContractState.nodeId; // todo read this from db log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId}`); let shardId = MessageBlockUtil.calculateAffectedShard(nsIndex, storageContractState.shardCount); + const date = DateTime.fromISO(dt, {zone: 'utc'}); if (!date.isValid) { return res.status(400).json('Invalid date ' + dt); @@ -79,6 +82,8 @@ export function storageRoutes(app: Router) { } ); + // todo move to StorageNode + // todo not tested with new sharing (we don't use it anymore) route.post( '/ns/:nsName/nsidx/:nsIndex/ts/:ts/key/:key', /* */ async (req: Request, res: Response, next: NextFunction) => { @@ -87,10 +92,13 @@ export function storageRoutes(app: Router) { const nsIndex = req.params.nsIndex; // ex: 1000000 const ts: string = req.params.ts; //ex: 1661214142.123456 const key = req.params.key; // ex: 5b62a7b2-d6eb-49ef-b080-20a7fa3091ad - const nodeId = validatorContractState.nodeId; // todo read this from db + const valContractState = Container.get(ValidatorContractState); + const storageContractState = Container.get(StorageContractState); + + const nodeId = valContractState.nodeId; const body = JSON.stringify(req.body); log.debug(`nsName=${nsName} nsIndex=${nsIndex} ts=${ts} key=${key} nodeId=${nodeId} body=${body}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); + let shardId = MessageBlockUtil.calculateAffectedShard(nsIndex, storageContractState.shardCount); log.debug(`nodeId=${nodeId} shardId=${shardId}`); const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); if (!success) { @@ -137,6 +145,7 @@ export function storageRoutes(app: Router) { Pagination is achieved by using firstTs parameter, passed from the previous invocation Timestamp example: 1661214142.000000 ( unixtime.microseconds ) * */ + // todo move to StorageNode route.post( '/ns/:nsName/nsidx/:nsIndex/month/:month/list/', /* */ async (req: Request, res: Response, next: NextFunction) => { @@ -147,32 +156,26 @@ export function storageRoutes(app: Router) { const nsName = req.params.nsName; const nsIndex = req.params.nsIndex; const dt = req.params.month + '01'; - const key = req.params.key; - const nodeId = validatorContractState.nodeId; // todo read this from db - const body = JSON.stringify(req.body); - const page = parseInt(req.params.page); - log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} key=${key} nodeId=${nodeId} firstTs=${firstTs} body=${body}`); - let shardId = DbHelper.calculateShardForNamespaceIndex(nsName, nsIndex); - log.debug(`nodeId=${nodeId} shardId=${shardId}`); - const success = await DbHelper.checkThatShardIsOnThisNode(nsName, shardId, nodeId); - if (!success) { - let errMsg = `${nsName}.${nsIndex} maps to shard ${shardId} which is missing on node ${nodeId}`; - console.log(errMsg); - return res.status(500) - .json({errorMessage: errMsg}) - } + + const valContractState = Container.get(ValidatorContractState); + const storageContractState = Container.get(StorageContractState); + const nodeId = valContractState.nodeId; // todo read this from db + log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} nodeId=${nodeId}`); + let shardId = MessageBlockUtil.calculateAffectedShard(nsIndex, storageContractState.shardCount); const date = DateTime.fromISO(dt, {zone: 'utc'}); - log.debug(`parsed date ${date} -> ${date}`) - // since the date is 1st day of month - we can do a lookup of the table name + if (!date.isValid) { + return res.status(400).json('Invalid date ' + dt); + } + log.debug(`parsed date ${dt} -> ${date}`) const storageTable = await DbHelper.findStorageTableByDate(nsName, shardId, date); log.debug(`found table ${storageTable}`) if (StrUtil.isEmpty(storageTable)) { log.error('storage table not found'); - return res.status(204).json(`storage table not found for date ${req.params.month}`); + return res.status(401).json('storage table not found'); } + const storageValue = await DbHelper.listInbox(nsName, shardId, nsIndex, storageTable, firstTs); log.debug(`found value: ${storageValue}`) - log.debug('success is ' + success); try { return res.status(200).json(storageValue); } catch (e) { diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index af30936..826fd22 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -227,18 +227,21 @@ export default class DbHelper { extract(epoch from ts) as ts, payload as payload from ${storageTable} - where namespace_id='${nsIndex}' ${ isFirstQuery ? '' : `and ts > to_timestamp(${firstTsExcluded})` } + where namespace='${namespace}' + and namespace_id='${nsIndex}' + ${ isFirstQuery ? '' : `and ts > to_timestamp(${firstTsExcluded})` } order by ts limit ${pageSize + pageLookAhead}`; log.debug(sql); let data1 = await pgPool.any(sql); - var items = []; + var items = new Map(); var lastTs: number = 0; for (let i = 0; i < Math.min(data1.length, pageSize); i++) { - items.push(DbHelper.convertRowToItem(data1[i], namespace)); + const item = DbHelper.convertRowToItem(data1[i], namespace); + items.set(item.skey, item); lastTs = data1[i].ts; } - log.debug(`added ${items.length} items; lastTs=${lastTs}`) + log.debug(`added ${items.size} items; lastTs=${lastTs}`) // [0...{pagesize-1 (lastTs)}...{data1.length-1 (lastTsRowId)}....] // we always request pageSize+3 rows; so if we have these additional rows we can verify that their ts != last row ts, // otherwise we should add these additional rows to the output (works only for 2..3 rows) @@ -260,30 +263,35 @@ export default class DbHelper { extract(epoch from ts) as ts, payload as payload from ${storageTable} - where ts = to_timestamp(${lastTs}) + where namespace='${namespace}' + and namespace_id='${nsIndex}' + and ts = to_timestamp(${lastTs}) order by ts limit ${pageSizeForSameTimestamp}`; log.debug(sql2); let data2 = await pgPool.any(sql2); for (let row of data2) { - items.push(DbHelper.convertRowToItem(row, namespace)); + const item = DbHelper.convertRowToItem(row, namespace); + items.set(item.skey, item); } log.debug(`extra query with ${data2.length} items to fix duplicate timestamps pagination, total size is ${items.length}`); } else if (lastTsRowId > pageSize - 1) { // we have more rows with same timestamp, they fit in pageSize+pageLookAhead rows for (let i = pageSize; i <= lastTsRowId; i++) { - items.push(DbHelper.convertRowToItem(data1[i], namespace)); + const item = DbHelper.convertRowToItem(data1[i], namespace); + items.set(item.skey, item); } - log.debug(`updated to ${items.length} items to fix duplicate timestamps pagination`) + log.debug(`updated to ${items.size} items to fix duplicate timestamps pagination`) } } + let itemsArr = [...items.values()]; return { - 'items': items, + 'items': itemsArr, 'lastTs': lastTs }; } - private static convertRowToItem(rowObj: any, namespace: string): any { + private static convertRowToItem(rowObj: any, namespace: string) { return { ns: namespace, skey: rowObj.skey, diff --git a/snode/src/services/messaging-common/messageBlock.ts b/snode/src/services/messaging-common/messageBlock.ts index 0a711ee..1a4953b 100644 --- a/snode/src/services/messaging-common/messageBlock.ts +++ b/snode/src/services/messaging-common/messageBlock.ts @@ -386,6 +386,15 @@ export class MessageBlockUtil { return shardId % shardCount; } + public static getBlockCreationTimeMillis(block: MessageBlock): number | null { + if (block.responsesSignatures.length > 0 + && block.responsesSignatures[0].length > 0) { + const sig = block.responsesSignatures[0][0]; + return sig?.nodeMeta?.tsMillis; + } + return null; + } + public static checkBlock(block: MessageBlock, validatorsFromContract: Set): CheckResult { if (block.requests.length != block.responses.length) { return CheckResult.failWithText( diff --git a/snode/src/services/messaging-common/storageContractState.ts b/snode/src/services/messaging-common/storageContractState.ts index 9c1e48d..2d9f27a 100644 --- a/snode/src/services/messaging-common/storageContractState.ts +++ b/snode/src/services/messaging-common/storageContractState.ts @@ -44,6 +44,7 @@ export class StorageContractState { this.rpcEndpoint, this.rpcNetwork ) + this.useSigner = useSigner; if (useSigner) { let connect = await EthersUtil.connectWithKey( EnvLoader.getPropertyOrFail('CONFIG_DIR'), @@ -109,7 +110,9 @@ export class StorageContractState { } let nodeShards: Set = null; if (this.useSigner) { - this.log.info(`this node %s is assigned to shards (%s) : %s`, Coll.setToArray(this.getNodeShards())); + this.log.info(`this node %s is assigned to shards (%s) : %s`, + this.nodeAddress, + Coll.setToArray(this.getNodeShards())); nodeShards = this.getNodeShards(); } await this.listener.handleReshard(nodeShards, this.nodeShardMap); diff --git a/snode/src/services/messaging/IndexStorage.ts b/snode/src/services/messaging/IndexStorage.ts index d2db04f..68c6d9f 100644 --- a/snode/src/services/messaging/IndexStorage.ts +++ b/snode/src/services/messaging/IndexStorage.ts @@ -43,7 +43,12 @@ export class IndexStorage { this.log.debug('finished'); return; } - let nowStr = DateUtil.currentTimeSeconds() + ''; + + // ex: 1661214142.123456 + let tsString = '' + (MessageBlockUtil.getBlockCreationTimeMillis(mb) / 1000.0); + if (tsString == null) { + tsString = '' + DateUtil.currentTimeSeconds(); + } const currentNodeId = this.valContractState.nodeId; for (let i = 0; i < mb.responses.length; i++) { const feedItem = mb.responses[i]; @@ -54,7 +59,7 @@ export class IndexStorage { if (!shardsToProcess.has(targetShard)) { continue; } - await this.putPayloadToInbox('inbox', targetShard, targetAddr, nowStr, currentNodeId, feedItem.payload); + await this.putPayloadToInbox('inbox', targetShard, targetAddr, tsString, currentNodeId, feedItem.payload); } } } @@ -70,6 +75,8 @@ export class IndexStorage { * @param ts current time, ex: 1661214142.123456 * @param nodeId current node id, ex: 0xAAAAAAA * @param fpayload payload format + * + * todo pass ts as number */ public async putPayloadToInbox(nsName: string, nsShardId: number, nsId: string, ts: string, diff --git a/snode/src/services/messaging/storageNode.ts b/snode/src/services/messaging/storageNode.ts index f45fdbd..0f69292 100644 --- a/snode/src/services/messaging/storageNode.ts +++ b/snode/src/services/messaging/storageNode.ts @@ -82,7 +82,7 @@ export default class StorageNode implements Consumer, StorageContractList public async handleReshard(currentNodeShards: Set|null, allNodeShards: Map>) { - let newShards = currentNodeShards; + let newShards = currentNodeShards ?? new Set(); const oldShards = await this.blockStorage.loadNodeShards(); this.log.debug('handleReshard(): newShards: %j oldShards: %j', Coll.setToArray(newShards), Coll.setToArray(oldShards)) diff --git a/snode/src/utilz/coll.ts b/snode/src/utilz/coll.ts index 6a1e9b0..b700d2d 100644 --- a/snode/src/utilz/coll.ts +++ b/snode/src/utilz/coll.ts @@ -9,7 +9,25 @@ export class Coll { return new Map(arr.map((value) => [value[keyField], value])) } + public static mapValuesToArray(map: Map): V[] { + if (map == null || map.size == 0) { + return [] + } + return [...map.values()]; + } + + public static mapKeysToArray(map: Map): K[] { + if (map == null || map.size == 0) { + return [] + } + return [...map.keys()]; + } + + public static arrayToSet(arr: V[]): Set { + if (arr == null) { + return new Set(); + } return new Set(arr) } @@ -26,6 +44,9 @@ export class Coll { } public static setToArray(set: Set): V[] { + if (set == null) { + return []; + } return Array.from(set.keys()) } @@ -76,7 +97,7 @@ export class Coll { } // set 1,2,3 to sql: ('1','2','3') - public static numberSetToSqlQuoted(s:Set): string { + public static numberSetToSqlQuoted(s: Set): string { return '(' + Coll.setToArray(s).map(num => "'" + num + "'").join(',') + ')'; } } From ea2c8f10a64f7304329de0db59ec0686f55c7478 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 23 Nov 2023 23:06:03 +0700 Subject: [PATCH 66/84] add: post review fix --- smart-contracts/contracts/Storage.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index 05e9fde..f2e783e 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -114,7 +114,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { ) initializer public { // init libraries __UUPSUpgradeable_init(); - __Ownable_init_unchained(); + __Ownable_init(); unusedNodeId = 1; rf = 0; @@ -207,9 +207,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function removeNode(address nodeAddress_) public onlyV { uint8 nodeId_ = mapAddrToNodeId[nodeAddress_]; unusedNodeIdList.push(nodeId_); - if (nodeId_ == NULL_NODE) { - revert('no address found'); - } + require(nodeId_ != NULL_NODE, 'no address found'); if (nodeIdList.length == 0) { // mapping exists, but node has no short id delete mapAddrToNodeId[nodeAddress_]; @@ -324,7 +322,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { maxNode_ = nodeId; } } - require(maxNode_ < MAX_NODE_ID); + require(maxNode_ < MAX_NODE_ID, "bad maxnode"); // copy storage to memory // nodeShardsSet[i]: bit(J) = 1, if nodeI has shard J @@ -332,9 +330,12 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint32[] memory nodeShardsBitmap_ = new uint32[](maxNode_ + 1); for (uint i = 0; i < nodeList_.length; i++) { uint8 nodeId = nodeList_[i]; + // this is intentionally left to check the node list for bad values at least once require(nodeId >= 1, 'nodes are 1 based'); nodeShardsBitmap_[nodeId] = mapNodeToShards[nodeId]; } + // 0 find all shards that are not yet assigned to every node + // also if a node owns shards that no longer exists (rf decreased) - grab them uint8[] memory unusedArr_ = buildUnused(nodeList_, nodeShardsBitmap_, nodeModifiedSet_, rf_, rfChanged_, nodeRemoved_, removedNodeShardmask_); From 6f3f6a7c4a78ddd6520c5154ff74b34ce530f345 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 23 Nov 2023 23:06:47 +0700 Subject: [PATCH 67/84] add: attestersTarget --- smart-contracts/contracts/Validator.sol | 361 +++++++++++++++++------- 1 file changed, 259 insertions(+), 102 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 099ebaf..c5253b3 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -12,22 +12,27 @@ Validator smart contract # Enables a network of Validator (V), Storage (S), Delivery (D) nodes - V performs a multi-sig on a message block within a specified group -- D unpacks message block (a threshold amount of sigs required), -and for every single message: delivers it to the end-users + stakes tokens; + Lifecycle: new - reported - slashed - banned + - S unpacks message block (a threshold amount of sigs required), and indexes every single message: the message gets copied to every person's inbox So that later V can query a group of storage nodes responsible for some data range and show that inbox to the UI. + stakes tokens ; + Lifecycle: new - reported - slashed - banned (TBD) + + +- D unpacks message block (a threshold amount of sigs required), +and for every single message: delivers it to the end-users + stakes tokens + Lifecycle: none (TBD) + # Contracts All the stacking, node management, slashing is done in this contrect Validator.sol S has it's own Storage.sol contract, which manages only S shard assignments. -todo recalculate on addNode: - REPORT_NODES,REPORT_CNT_MAX,SLASH_CNT_MAX - attestersRequired,nodeRandomMinCount,nodeRandomPingCount - -todo ensure NodeInfo storage targetNode_ , is used carefully in all methods */ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { @@ -46,19 +51,21 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* validator slashing params (effectively constant) - report = bad behaviour, after REPORT_NODES would report REPORT_CNT_MAX times - we perform a slash + report = bad behaviour, + we accept a VoteData sign by this amout of nodes: REPORT_THRESHOLD + we perform a slash after this amount of reports: REPORTS_BEFORE_SLASH + */ + uint32 public REPORT_THRESHOLD; // i.e. 66 = 66% = 2/3 + uint32 public REPORTS_BEFORE_SLASH; // todo should be 10 for V and 50 for S nodes + /* slash = reduces node collateral for SLASH_PERCENT % - after SLASH_CNT_MAX slashes the node would get a bat + after SLASH_BEFORE_BAN iterations, the node would get a ban ban = reduces node collateral for BAN_PERCENT, node address is banned forever */ - uint32 public REPORT_NODES; - uint32 public REPORT_CNT_MAX; - uint32 public SLASH_PERCENT; - uint32 public SLASH_CNT_MAX; + uint32 public SLASHES_BEFORE_BAN; // todo should be 5? uint32 public BAN_PERCENT; @@ -67,8 +74,23 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { for the contract these a simply constants; all the logic is in JS */ - // how many attesters should sign the message block, after validator proposes a block - uint8 public attestersRequired; + // attestersRequired should group up to attestersTarget, when new nodes join + uint8 public attestersTarget; + + /* + how many signatures is needed for a block + + A block gets signed by a validator + N attesters + numberOfSignatures = attestersCountPerBlock (maxed by attersterTarget) + + if REPORT_PERCENT is 66% ( 2/3 of signers should agree on a block) + 3 * 67 / 100 = 201 / 100 = 2 + if we have at least 2 valid signatures out of 3 - that's a good block + + attestersCountPerBlock would grow as more nodes join the network; + up to attestersTarget + */ + uint8 public attestersCountPerBlock; // how many networkRandom objects are required to compute a random value uint8 public nodeRandomMinCount; // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random @@ -85,15 +107,21 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address public storageContract; // node colleciton - address[] public nodes; + address[] public nodes; // todo split into 3 arrays based on type mapping(address => NodeInfo) public nodeMap; - uint public totalStaked; // push tokens owned by this contract; which have an owner - uint public totalPenalties; // push tokens owned by this contract; comes from penalties + // push tokens owned by this contract; which have an owner + uint public totalStaked; + + // push tokens owned by this contract; + // comes from penalties from BAN only; + // SLASH benefits the voters + uint public totalUnstaked; // ----------------------------- EVENTS -------------------------------------------------- event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); + event NodeReported(address nodeWallet, address reporterWallet, address[] voters, VoteAction voteAction); event AttestersRequiredUpdated(uint32 value); event NodeRandomMinCountUpdated(uint32 value); @@ -102,7 +130,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- TYPES -------------------------------------------------- struct NodeInfo { - uint16 shortAddr; // todo address ownerWallet; address nodeWallet; // eth wallet NodeType nodeType; @@ -113,16 +140,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } struct NodeCounters { - uint16 reportCounter; + uint16 reportCounter; // how many times this node was reported uint16 slashCounter; - } - struct Vote { - uint256 ts; - address[] voters; // this is not the node which decided to vote, this is the one who reported - // a message, signed by X other nodes - address target; - VoteAction voteAction; + // block numbers where this node was reported (cleaned on BAN) + uint128[] reportedInBlocks; + // addresses who did the reports (they will receive slash rewards) (cleaned on SLASH) + address[] reportedBy; } enum NodeStatus { @@ -134,9 +158,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } enum VoteAction { + None, Report - // Slash, - // Ban } enum NodeType { @@ -146,8 +169,12 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } struct VoteMessage { - VoteAction vote; - address target; + // block which was the reason to apply sanctions (i.e. bad conversion) + uint128 blockId; + // node to punish + address targetNode; + // action + uint8 voteAction; } // ----------------------------- UPGRADABLE -------------------------------------------------- @@ -160,7 +187,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function initialize( uint16 protocolVersion_, address pushToken_, - uint8 attestersRequired_, + uint8 attestersTarget_, uint8 nodeRandomMinCount_, uint8 nodeRandomPingCount_ ) initializer public { @@ -171,8 +198,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { protocolVersion = protocolVersion_; require(pushToken_ != address(0)); pushToken = IERC20(pushToken_); - require(attestersRequired_ > 0, "invalid attesters amount"); - attestersRequired = attestersRequired_; + require(attestersTarget_ > 0, "invalid attesters amount"); + attestersTarget = attestersTarget_; require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); nodeRandomMinCount = nodeRandomMinCount_; require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); @@ -181,12 +208,14 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { minStakeV = 100; minStakeS = 100; minStakeD = 100; - REPORT_CNT_MAX = 2; + REPORTS_BEFORE_SLASH = 2; SLASH_PERCENT = 1; - SLASH_CNT_MAX = 2; + SLASHES_BEFORE_BAN = 2; BAN_PERCENT = 10; - REPORT_NODES = 1; - // todo update this on node join + + + REPORT_THRESHOLD = 66; + attestersCountPerBlock = 0; } function _authorizeUpgrade(address) internal override onlyOwner {} @@ -204,8 +233,23 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { storageContract = addr_; } - // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- + function updateAttestersCountPerBlock(uint8 val_) public onlyOwner { + _updateAttestersCountPerBlock(val_); + } + + function updateNodeRandomMinCount(uint8 val_) public onlyOwner { + require(val_ >= 0 && val_ < nodes.length); + nodeRandomMinCount = val_; + emit NodeRandomMinCountUpdated(val_); + } + function updateNodeRandomPingCount(uint8 val_) public onlyOwner { + require(val_ >= 0 && val_ < nodes.length); + nodeRandomPingCount = val_; + emit NodeRandomPingCountUpdated(val_); + } + + // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- /* Registers a new validator node @@ -246,7 +290,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(pushToken.transferFrom(msg.sender, address(this), coll), "failed to transfer tokens to contract"); totalStaked += coll; // post actions - if(nodeType_ == NodeType.SNode) { + if (nodeType_ == NodeType.VNode) { + recalcualteAttestersCountPerBlock(); + } else if (nodeType_ == NodeType.SNode) { // try to register this node for shard mappings require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); @@ -256,6 +302,28 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit NodeAdded(msg.sender, nodeWallet_, nodeType_, coll, nodeApiBaseUrl_); } + // raise the number of required signatures per block + // from 1 up to attestersTarget + // or down to 1 + function recalcualteAttestersCountPerBlock() private { + uint activeValidators_ = 0; + for (uint i = 0; i < nodes.length; i++) { + address nodeAddr_ = nodes[i]; + NodeInfo storage nodeInfo_ = nodeMap[nodeAddr_]; + if (nodeInfo_.nodeType == NodeType.VNode && isActiveValidator(nodeInfo_.status)) { + activeValidators_++; + } + } + uint newValue = activeValidators_; + if (attestersCountPerBlock > attestersTarget) { + newValue = attestersTarget; + } + _updateAttestersCountPerBlock(uint8(newValue)); + } + + function isActiveValidator(NodeStatus status) private pure returns (bool) { + return status == NodeStatus.Unstaked || status == NodeStatus.BannedAndUnstaked; + } /* Remove node (if you are the node owner) @@ -270,7 +338,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit NodeStatusChanged(node.nodeWallet, NodeStatus.Unstaked, 0); } - /* Complain on an existing node; N attesters can request to report malicious activity for a specific node also slashes if the # of complains meet the required threshold @@ -280,49 +347,96 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { Returns 1 (number of affected nodes) or 0 (if nothing happened) */ // ACCESS: Any node can call this - function reportNode(bytes memory _message, bytes[] memory _signatures) public returns (uint8) { - uint validSigCount = 0; - NodeInfo storage callerNodeId = nodeMap[msg.sender]; - if (callerNodeId.nodeWallet == address(0)) { - return 0; + function reportNode(bytes memory voteBlob_, + bytes[] memory signatures_) public { + console.log('reportNode()', voteBlob_.length); + NodeInfo storage reporterNode_ = nodeMap[msg.sender]; + if (reporterNode_.nodeWallet == address(0)) { + revert('invalid reporter'); } - for (uint i = 0; i < _signatures.length; i++) { - address nodeWallet = SigUtil.recoverSignerEx(_message, _signatures[i]); - NodeInfo storage voterNode = nodeMap[nodeWallet]; - if (voterNode.nodeWallet != address(0)) { - validSigCount++; + + console.log('got signatures', signatures_.length); + uint uniqVotersSize_ = 0; + address[] memory uniqVoters_ = new address[](signatures_.length); + for (uint i = 0; i < signatures_.length; i++) { + address voterWallet = SigUtil.recoverSignerEx(voteBlob_, signatures_[i]); + console.log('voter wallet is', voterWallet); + NodeInfo storage voterNode = nodeMap[voterWallet]; + if (voterNode.nodeWallet == address(0)) { + console.log('invalid voter wallet'); + continue; + } + // this is not very efficient, but there is no in-memory set support + bool foundDuplicate_ = false; + for (uint j = 0; j < uniqVotersSize_; j++) { + if (uniqVoters_[j] == voterWallet) { + foundDuplicate_ = true; + break; + } } + if (foundDuplicate_) { + continue; + } + uniqVoters_[uniqVotersSize_++] = voterWallet; } - if (validSigCount < REPORT_NODES) { - return 0; + if (uniqVotersSize_ < attestersCountPerBlock * REPORT_THRESHOLD / 100) { + revert('sig count is too low'); } - VoteMessage memory vm = decodeVoteMessage(_message); - // always Report - NodeInfo storage targetNode = nodeMap[vm.target]; - if (targetNode.nodeWallet == address(0)) { - revert("a node with _targetPubKey does not exists"); + console.log('sigcount=', uniqVotersSize_); + // compactify + if (uniqVotersSize_ < signatures_.length) { + address[] memory tmp = new address[](uniqVotersSize_); + for (uint i = 0; i < uniqVotersSize_; i++) { + tmp[i] = uniqVoters_[i]; + } + uniqVoters_ = tmp; } - return _reportNode(vm, targetNode); + + // unpack and verify + VoteMessage memory vm_; + uint128 _blockId; + address _targetNode; + uint8 _voteAction; + (_blockId, _targetNode, _voteAction) = abi.decode(voteBlob_, (uint128, address, uint8)); + + require(_voteAction == uint8(VoteAction.Report), 'report action only supported'); + NodeInfo storage targetNode_ = nodeMap[_targetNode]; + require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); + require(targetNode_.nodeType == NodeType.VNode, "report only for VNodes"); + + _reportNode(vm_, reporterNode_, uniqVoters_, targetNode_); } // ----------------------------- IMPL -------------------------------------------------- + function _updateAttestersCountPerBlock(uint8 val_) private { + require(val_ >= 0 && val_ < nodes.length); + if (val_ == attestersCountPerBlock) { + return; + } + attestersCountPerBlock = val_; + emit AttestersRequiredUpdated(val_); + } + // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler - function _reportNode(VoteMessage memory _vm, NodeInfo storage targetNode) private returns (uint8){ + function _reportNode(VoteMessage memory _vm, + NodeInfo storage reporterNode, + address[] memory uniqVoters_, + NodeInfo storage targetNode) private returns (uint8){ require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); NodeStatus ns = targetNode.status; // 2 check count - if (_vm.vote == VoteAction.Report) { - doReport(targetNode); + if (_vm.voteAction == uint8(VoteAction.Report)) { + doReportIfBlockIsNew(reporterNode, uniqVoters_, _vm.blockId, targetNode); } else { revert("unsupported"); } if (ns == NodeStatus.OK || ns == NodeStatus.Slashed) { - if (targetNode.counters.reportCounter >= REPORT_CNT_MAX) { - doSlash(targetNode); + if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH) { + doSlash(reporterNode, targetNode); } - if (targetNode.counters.slashCounter >= SLASH_CNT_MAX) { + if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN) { doBan(targetNode); } } else if (ns == NodeStatus.BannedAndUnstaked) { @@ -334,18 +448,15 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* Returns remaining collateral */ - function reduceCollateral(address nodeWallet_, uint32 percentage_) private returns (uint256) { - require(nodeWallet_ != address(0)); + function reduceCollateral(NodeInfo storage slashedNode, uint32 percentage_ + ) private returns (uint256 newAmount_, uint256 delta_) { require(percentage_ >= 0 && percentage_ <= 100, "percentage should be in [0, 100]"); // reduce only nodeTokens; we do not transfer any tokens; it will affect only 'unstake' - NodeInfo storage node = nodeMap[nodeWallet_]; - uint256 currentAmount_ = node.nodeTokens; - uint256 newAmount_ = (currentAmount_ * (100 - percentage_)) / 100; - uint256 delta_ = currentAmount_ - newAmount_; - node.nodeTokens = newAmount_; - totalStaked -= delta_; - totalPenalties += delta_; - return newAmount_; + uint256 currentAmount_ = slashedNode.nodeTokens; + newAmount_ = (currentAmount_ * (100 - percentage_)) / 100; + delta_ = currentAmount_ - newAmount_; + slashedNode.nodeTokens = newAmount_; + return (newAmount_, delta_); } /* @@ -356,7 +467,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(pushToken.transfer(targetNode_.ownerWallet, delta), "failed to trasfer funds back to owner"); targetNode_.nodeTokens = 0; totalStaked -= delta; - if(targetNode_.nodeType == NodeType.SNode) { + if (targetNode_.nodeType == NodeType.VNode) { + recalcualteAttestersCountPerBlock(); + delete targetNode_.counters.reportedInBlocks; + delete targetNode_.counters.reportedBy; + } else if (targetNode_.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); s.removeNode(targetNode_.nodeWallet); @@ -365,10 +480,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function decodeVoteMessage(bytes memory data) private pure returns (VoteMessage memory) { - (VoteAction vote, address target) = abi.decode(data, (VoteAction, address)); VoteMessage memory result; - result.vote = vote; - result.target = target; + (result.blockId, result.targetNode, result.voteAction) = abi.decode(data, (uint128, address, uint8)); return result; } @@ -380,43 +493,87 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return nodes; } - function doReport(NodeInfo storage targetNode) private { + // alters newVoters_ ! + // reportedInBlocks, reportedBy - arrays are used for a reason + // to be more compact and to clean easier later. + function doReportIfBlockIsNew(NodeInfo storage reporterNode, address[] memory newVoters_, + uint128 blockId_, NodeInfo storage targetNode + ) private { + console.log('doReport'); + + // check that we encounter this report X this block only for the first time + uint128[] memory knownBlocks = targetNode.counters.reportedInBlocks; + for (uint i = 0; i < knownBlocks.length; i++) { + if (blockId_ == knownBlocks[i]) { + revert('block is not new'); + } + } targetNode.counters.reportCounter++; + targetNode.counters.reportedInBlocks.push(blockId_); + + // calculate new voters; they will collectively split payments on slash + address [] memory knownVoters = targetNode.counters.reportedBy; + for (uint n = 0; n < newVoters_.length; n++) { + for (uint k = 0; k < knownVoters.length; k++) { + if (newVoters_[n] == knownVoters[k] && newVoters_[n] != address(0)) { + newVoters_[n] = address(0); + break; + } + } + } + for (uint n = 0; n < newVoters_.length; n++) { + address voter_ = newVoters_[n]; + if (voter_ != address(0)) { + targetNode.counters.reportedBy.push(newVoters_[n]); + } + } + + + emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, VoteAction.Report); // todo do we need this ? emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); } - function doSlash(NodeInfo storage targetNode) private { + function doSlash(NodeInfo storage reporterNode, NodeInfo storage targetNode) private { + console.log('doSlash'); + // targetNode gets slashed by SLASH_PERCENT, this deducts delta_ tokens + uint256 coll_; + uint256 delta_; + (coll_, delta_) = reduceCollateral(targetNode, SLASH_PERCENT); + + // every pre-exising-signed-reporter will get a slice of the bonus + address[] memory reportedBy_ = targetNode.counters.reportedBy; + uint256 reporterBonus_; + reporterBonus_ = delta_ / (reportedBy_.length + 1); + for (uint i = 0; i < reportedBy_.length; i++) { + NodeInfo storage ni = nodeMap[reportedBy_[i]]; + if (ni.ownerWallet == address(0)) { + continue; + } + ni.nodeTokens += reporterBonus_; + delta_ -= reporterBonus_; + } + // current reporter will get a slice of the bonus (so he gets 2xbonus) + reporterNode.nodeTokens += delta_; // reporter gets slashed profils + + + delete targetNode.counters.reportedBy; targetNode.status = NodeStatus.Slashed; targetNode.counters.reportCounter = 0; targetNode.counters.slashCounter++; - uint256 coll = reduceCollateral(targetNode.nodeWallet, SLASH_PERCENT); - emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll); + emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll_); } function doBan(NodeInfo storage targetNode) private { - reduceCollateral(targetNode.nodeWallet, BAN_PERCENT); + uint256 coll_; + uint256 delta_; + (coll_, delta_) = reduceCollateral(targetNode, BAN_PERCENT); + totalStaked -= delta_; + totalUnstaked += delta_; _unstakeNode(targetNode); targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } - function updateAttestersRequired(uint8 amount) public onlyOwner { - require(amount >= 0 && amount < nodes.length); - attestersRequired = amount; - emit AttestersRequiredUpdated(amount); - } - - function updateNodeRandomMinCount(uint8 amount) public onlyOwner { - require(amount >= 0 && amount < nodes.length); - nodeRandomMinCount = amount; - emit NodeRandomMinCountUpdated(amount); - } - - function updateNodeRandomPingCount(uint8 amount) public onlyOwner { - require(amount >= 0 && amount < nodes.length); - nodeRandomPingCount = amount; - emit NodeRandomPingCountUpdated(amount); - } } // a lib that abstracts privKey signature and pubKey+signature checks From 94d90398225166260bdb9278b192121afa7c9f64 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 30 Nov 2023 21:19:22 +0700 Subject: [PATCH 68/84] add: storage node reporting (1) --- smart-contracts/contracts/Validator.sol | 297 +++++++++++++++--------- 1 file changed, 192 insertions(+), 105 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index c5253b3..82af871 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -38,6 +38,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- STATE -------------------------------------------------- + string public constant VERSION = "0.0.2"; uint16 public protocolVersion; /* staking params (effectively constant ) */ @@ -55,8 +56,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { we accept a VoteData sign by this amout of nodes: REPORT_THRESHOLD we perform a slash after this amount of reports: REPORTS_BEFORE_SLASH */ - uint32 public REPORT_THRESHOLD; // i.e. 66 = 66% = 2/3 - uint32 public REPORTS_BEFORE_SLASH; // todo should be 10 for V and 50 for S nodes + uint32 public REPORT_THRESHOLD_PER_BLOCK; // i.e. 66 = 66% = 2/3 + uint32 public REPORTS_BEFORE_SLASH_V; + uint32 public REPORTS_BEFORE_SLASH_S; /* slash = reduces node collateral for SLASH_PERCENT % @@ -65,7 +67,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { ban = reduces node collateral for BAN_PERCENT, node address is banned forever */ uint32 public SLASH_PERCENT; - uint32 public SLASHES_BEFORE_BAN; // todo should be 5? + uint32 public SLASHES_BEFORE_BAN_V; + uint32 public SLASHES_BEFORE_BAN_S; uint32 public BAN_PERCENT; @@ -74,23 +77,25 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { for the contract these a simply constants; all the logic is in JS */ - // attestersRequired should group up to attestersTarget, when new nodes join - uint8 public attestersTarget; - /* how many signatures is needed for a block - A block gets signed by a validator + N attesters - numberOfSignatures = attestersCountPerBlock (maxed by attersterTarget) + A block gets signed by a 1 validator + N attesters = valPerBlockTarget - if REPORT_PERCENT is 66% ( 2/3 of signers should agree on a block) - 3 * 67 / 100 = 201 / 100 = 2 - if we have at least 2 valid signatures out of 3 - that's a good block + if REPORT_PERCENT is 66% ( 2/3 of signers should agree on a block) + 3 * 67 / 100 = 201 / 100 = 2 + if we have at least 2 valid signatures out of 3 - that's a good block - attestersCountPerBlock would grow as more nodes join the network; - up to attestersTarget + attestersCountPerBlock would grow as more nodes join the network; + up to attestersTarget */ - uint8 public attestersCountPerBlock; + uint8 public valPerBlock; + + // maximum amount of validator signatures per block + // we will grow or shrink valPerBlock up to this number + uint8 public valPerBlockTarget; + + // how many networkRandom objects are required to compute a random value uint8 public nodeRandomMinCount; // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random @@ -107,7 +112,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address public storageContract; // node colleciton - address[] public nodes; // todo split into 3 arrays based on type + address[] public vnodes; + address[] public snodes; + address[] public dnodes; mapping(address => NodeInfo) public nodeMap; // push tokens owned by this contract; which have an owner @@ -115,8 +122,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // push tokens owned by this contract; // comes from penalties from BAN only; - // SLASH benefits the voters - uint public totalUnstaked; + // while SLASH benefits the voters + uint public totalFees; // ----------------------------- EVENTS -------------------------------------------------- event NodeAdded(address indexed ownerWallet, address indexed nodeWallet, NodeType nodeType, uint256 nodeTokens, string nodeApiBaseUrl); @@ -147,6 +154,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint128[] reportedInBlocks; // addresses who did the reports (they will receive slash rewards) (cleaned on SLASH) address[] reportedBy; + uint128[] reportedKeys; // keys missing (for storage nodes only) } enum NodeStatus { @@ -159,7 +167,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { enum VoteAction { None, - Report + ReportV, + ReportS } enum NodeType { @@ -187,7 +196,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function initialize( uint16 protocolVersion_, address pushToken_, - uint8 attestersTarget_, + uint8 valPerBlockTarget_, uint8 nodeRandomMinCount_, uint8 nodeRandomPingCount_ ) initializer public { @@ -198,8 +207,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { protocolVersion = protocolVersion_; require(pushToken_ != address(0)); pushToken = IERC20(pushToken_); - require(attestersTarget_ > 0, "invalid attesters amount"); - attestersTarget = attestersTarget_; + require(valPerBlockTarget_ > 0, "invalid attesters amount"); + valPerBlockTarget = valPerBlockTarget_; require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); nodeRandomMinCount = nodeRandomMinCount_; require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); @@ -208,25 +217,20 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { minStakeV = 100; minStakeS = 100; minStakeD = 100; - REPORTS_BEFORE_SLASH = 2; + REPORTS_BEFORE_SLASH_V = 10; + REPORTS_BEFORE_SLASH_S = 50; // todo should be 10 for V and 50 for S nodes SLASH_PERCENT = 1; - SLASHES_BEFORE_BAN = 2; + SLASHES_BEFORE_BAN_V = 2; + SLASHES_BEFORE_BAN_S = 2; BAN_PERCENT = 10; - REPORT_THRESHOLD = 66; - attestersCountPerBlock = 0; + REPORT_THRESHOLD_PER_BLOCK = 66; + valPerBlock = 0; } function _authorizeUpgrade(address) internal override onlyOwner {} - function getProtocolVersion() public view returns (uint16) { - return protocolVersion; - } - - function getCodeVersion() public pure returns (uint16){ - return 2; - } // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- function setStorageContract(address addr_) public onlyOwner { @@ -238,13 +242,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function updateNodeRandomMinCount(uint8 val_) public onlyOwner { - require(val_ >= 0 && val_ < nodes.length); + require(val_ >= 0 && val_ < vnodes.length); nodeRandomMinCount = val_; emit NodeRandomMinCountUpdated(val_); } function updateNodeRandomPingCount(uint8 val_) public onlyOwner { - require(val_ >= 0 && val_ < nodes.length); + require(val_ >= 0 && val_ < vnodes.length); nodeRandomPingCount = val_; emit NodeRandomPingCountUpdated(val_); } @@ -252,20 +256,24 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- /* - Registers a new validator node + Registers a new V, S, D node Locks PUSH tokens ($_token) with $_collateral amount. A node will run from a _nodeWallet ACCESS: Any node can call this */ function registerNodeAndStake(uint256 nodeTokens_, NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { - uint256 coll = nodeTokens_; + + // pre-actions if (nodeType_ == NodeType.VNode) { - require(coll >= minStakeV, "Insufficient collateral for VNODE"); - } else if (nodeType_ == NodeType.DNode) { - require(coll >= minStakeD, "Insufficient collateral for DNODE"); + require(nodeTokens_ >= minStakeV, "Insufficient collateral for VNODE"); + vnodes.push(nodeWallet_); } else if (nodeType_ == NodeType.SNode) { - require(coll >= minStakeS, "Insufficient collateral for SNODE"); + require(nodeTokens_ >= minStakeS, "Insufficient collateral for SNODE"); + snodes.push(nodeWallet_); + } else if (nodeType_ == NodeType.DNode) { + require(nodeTokens_ >= minStakeD, "Insufficient collateral for DNODE"); + dnodes.push(nodeWallet_); } else { revert("unsupported nodeType "); } @@ -273,22 +281,27 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { if (old.ownerWallet != address(0)) { revert("a node with pubKey is already defined"); } + // check that collateral is allowed to spend - uint256 allowed = pushToken.allowance(msg.sender, address(this)); - require(allowed >= nodeTokens_, "_nodeTokens cannot be transferred, check allowance"); + if (nodeTokens_ > 0) { + uint256 allowed = pushToken.allowance(msg.sender, address(this)); + require(allowed >= nodeTokens_, "_nodeTokens cannot be transferred, check allowance"); + } // new mapping console.log('node owner is ', msg.sender); NodeInfo memory n; n.ownerWallet = msg.sender; n.nodeWallet = nodeWallet_; n.nodeType = nodeType_; - n.nodeTokens = coll; + n.nodeTokens = nodeTokens_; n.nodeApiBaseUrl = nodeApiBaseUrl_; - nodes.push(nodeWallet_); nodeMap[nodeWallet_] = n; // take collateral - require(pushToken.transferFrom(msg.sender, address(this), coll), "failed to transfer tokens to contract"); - totalStaked += coll; + if (nodeTokens_ > 0) { + require(pushToken.transferFrom(msg.sender, address(this), nodeTokens_), "failed to transfer tokens to contract"); + } + totalStaked += nodeTokens_; + // post actions if (nodeType_ == NodeType.VNode) { recalcualteAttestersCountPerBlock(); @@ -299,7 +312,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { s.addNode(nodeWallet_); } // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); - emit NodeAdded(msg.sender, nodeWallet_, nodeType_, coll, nodeApiBaseUrl_); + emit NodeAdded(msg.sender, nodeWallet_, nodeType_, nodeTokens_, nodeApiBaseUrl_); } // raise the number of required signatures per block @@ -307,16 +320,16 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // or down to 1 function recalcualteAttestersCountPerBlock() private { uint activeValidators_ = 0; - for (uint i = 0; i < nodes.length; i++) { - address nodeAddr_ = nodes[i]; + for (uint i = 0; i < vnodes.length; i++) { + address nodeAddr_ = vnodes[i]; NodeInfo storage nodeInfo_ = nodeMap[nodeAddr_]; if (nodeInfo_.nodeType == NodeType.VNode && isActiveValidator(nodeInfo_.status)) { activeValidators_++; } } uint newValue = activeValidators_; - if (attestersCountPerBlock > attestersTarget) { - newValue = attestersTarget; + if (valPerBlock > valPerBlockTarget) { + newValue = valPerBlockTarget; } _updateAttestersCountPerBlock(uint8(newValue)); } @@ -327,7 +340,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* Remove node (if you are the node owner) - ACCESS: Any node can call this + ACCESS: Any node owner can call this */ function unstakeNode(address nodeWallet_) public { NodeInfo storage node = nodeMap[nodeWallet_]; @@ -347,8 +360,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { Returns 1 (number of affected nodes) or 0 (if nothing happened) */ // ACCESS: Any node can call this - function reportNode(bytes memory voteBlob_, - bytes[] memory signatures_) public { + function reportNode(NodeType targetNodeType_, bytes memory voteBlob_, bytes[] memory signatures_) public { console.log('reportNode()', voteBlob_.length); NodeInfo storage reporterNode_ = nodeMap[msg.sender]; if (reporterNode_.nodeWallet == address(0)) { @@ -379,9 +391,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } uniqVoters_[uniqVotersSize_++] = voterWallet; } - if (uniqVotersSize_ < attestersCountPerBlock * REPORT_THRESHOLD / 100) { - revert('sig count is too low'); - } console.log('sigcount=', uniqVotersSize_); // compactify if (uniqVotersSize_ < signatures_.length) { @@ -392,52 +401,65 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uniqVoters_ = tmp; } - // unpack and verify - VoteMessage memory vm_; - uint128 _blockId; - address _targetNode; - uint8 _voteAction; - (_blockId, _targetNode, _voteAction) = abi.decode(voteBlob_, (uint128, address, uint8)); - - require(_voteAction == uint8(VoteAction.Report), 'report action only supported'); - NodeInfo storage targetNode_ = nodeMap[_targetNode]; - require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); - require(targetNode_.nodeType == NodeType.VNode, "report only for VNodes"); + if (targetNodeType_ == NodeType.VNode) { + // unpack and verify + uint8 voteAction_; + uint128 blockId_; + address targetNodeAddr_; + (voteAction_, blockId_, targetNodeAddr_) = abi.decode(voteBlob_, (uint8, uint128, address)); + + require(voteAction_ == uint8(VoteAction.ReportV), 'report action only supported'); + NodeInfo storage targetNode_ = nodeMap[targetNodeAddr_]; + require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); + require(targetNode_.nodeType == NodeType.VNode, "report only for VNodes"); + + _reportVNode(VoteAction(voteAction_), reporterNode_, uniqVoters_, targetNode_, blockId_); + } else if (targetNodeType_ == NodeType.SNode) { + uint8 voteAction_; + uint128 blockId_; + address targetNodeAddr_; + uint128 skey_; + (voteAction_, blockId_, targetNodeAddr_, skey_) = abi.decode(voteBlob_, (uint8, uint128, address, uint128)); + + require(voteAction_ == uint8(VoteAction.ReportS), 'report action only supported'); + NodeInfo storage targetNode_ = nodeMap[targetNodeAddr_]; + require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); + require(targetNode_.nodeType == NodeType.SNode, "report only for SNodes"); + _reportSNode(VoteAction(voteAction_), reporterNode_, uniqVoters_, targetNode_, blockId_, skey_); + } - _reportNode(vm_, reporterNode_, uniqVoters_, targetNode_); } // ----------------------------- IMPL -------------------------------------------------- function _updateAttestersCountPerBlock(uint8 val_) private { - require(val_ >= 0 && val_ < nodes.length); - if (val_ == attestersCountPerBlock) { + require(val_ >= 0 && val_ < vnodes.length); + if (val_ == valPerBlock) { return; } - attestersCountPerBlock = val_; + valPerBlock = val_; emit AttestersRequiredUpdated(val_); } // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler - function _reportNode(VoteMessage memory _vm, - NodeInfo storage reporterNode, - address[] memory uniqVoters_, - NodeInfo storage targetNode) private returns (uint8){ + function _reportVNode(VoteAction voteAction_, NodeInfo storage reporterNode, + address[] memory uniqVoters_, NodeInfo storage targetNode, uint128 blockId_ + ) private returns (uint8) { require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); - NodeStatus ns = targetNode.status; - // 2 check count - if (_vm.voteAction == uint8(VoteAction.Report)) { - doReportIfBlockIsNew(reporterNode, uniqVoters_, _vm.blockId, targetNode); - } else { - revert("unsupported"); + + if (uniqVoters_.length < valPerBlock * REPORT_THRESHOLD_PER_BLOCK / 100) { + revert('sig count is too low'); } + + reportIfNew(voteAction_, reporterNode, targetNode, uniqVoters_, blockId_, 0); + NodeStatus ns = targetNode.status; if (ns == NodeStatus.OK || ns == NodeStatus.Slashed) { - if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH) { - doSlash(reporterNode, targetNode); + if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_V) { + slash(reporterNode, targetNode); } - if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN) { - doBan(targetNode); + if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_V) { + ban(targetNode); } } else if (ns == NodeStatus.BannedAndUnstaked) { // do nothing; terminal state @@ -445,6 +467,28 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return 0; } + function _reportSNode(VoteAction voteAction_, NodeInfo storage reporterNode, address[] memory uniqVoters_, + NodeInfo storage targetNode, uint128 blockId_, uint128 storageKey_) private returns (uint8) { + require(targetNode.nodeType == NodeType.SNode, "report only for SNodes"); + + if (uniqVoters_.length < valPerBlock * REPORT_THRESHOLD_PER_BLOCK / 100) { + revert('sig count is too low'); + } + reportIfNew(voteAction_, reporterNode, targetNode, uniqVoters_, blockId_, storageKey_); + NodeStatus ns_ = targetNode.status; + if (ns_ == NodeStatus.OK || ns_ == NodeStatus.Slashed) { + if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_S) { + slash(reporterNode, targetNode); + } + if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_S) { + ban(targetNode); + } + } else if (ns_ == NodeStatus.BannedAndUnstaked) { + // do nothing; terminal state + } + return 0; + } + /* Returns remaining collateral */ @@ -459,10 +503,25 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return (newAmount_, delta_); } + // remove value from nodes array, preserving space + function findAndRemove(address[] storage addrArray, address addrToRemove) private returns (bool) { + uint len_ = addrArray.length; + for (uint i = 0; i < len_; i++) { + if (addrArray[i] == addrToRemove) { + if (i != len_ - 1) { + addrArray[i] = addrArray[len_ - 1]; + } + addrArray.pop(); + return true; + } + } + return false; + } + /* Returns unstaked amount */ - function _unstakeNode(NodeInfo storage targetNode_) private returns (uint256){ + function _unstakeNode(NodeInfo storage targetNode_) private returns (uint256) { uint256 delta = targetNode_.nodeTokens; require(pushToken.transfer(targetNode_.ownerWallet, delta), "failed to trasfer funds back to owner"); targetNode_.nodeTokens = 0; @@ -471,10 +530,15 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { recalcualteAttestersCountPerBlock(); delete targetNode_.counters.reportedInBlocks; delete targetNode_.counters.reportedBy; + findAndRemove(vnodes, targetNode_.nodeWallet); } else if (targetNode_.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); s.removeNode(targetNode_.nodeWallet); + delete targetNode_.counters.reportedInBlocks; + delete targetNode_.counters.reportedBy; + delete targetNode_.counters.reportedKeys; + findAndRemove(snodes, targetNode_.nodeWallet); } return delta; } @@ -489,33 +553,53 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return nodeMap[_nodeWallet]; } - function getNodes() public view returns (address[] memory) { - return nodes; - } - // alters newVoters_ ! - // reportedInBlocks, reportedBy - arrays are used for a reason - // to be more compact and to clean easier later. - function doReportIfBlockIsNew(NodeInfo storage reporterNode, address[] memory newVoters_, - uint128 blockId_, NodeInfo storage targetNode + /* + A reporterNode reports on targetNode, targetNode can be V or S node + newVoters_ - who voted (set) + blockId_ - blockId which is used to do this report + storageKey_ - only for storage nodes ( that's a report that a node has no key) + */ + function reportIfNew(VoteAction voteAction_, + NodeInfo storage reporterNode, + NodeInfo storage targetNode, + address[] memory newVoters_, + uint128 blockId_, + uint128 storageKey_ ) private { console.log('doReport'); // check that we encounter this report X this block only for the first time - uint128[] memory knownBlocks = targetNode.counters.reportedInBlocks; - for (uint i = 0; i < knownBlocks.length; i++) { - if (blockId_ == knownBlocks[i]) { + uint128[] memory reportedInBlocks_ = targetNode.counters.reportedInBlocks; + uint ribLen_ = reportedInBlocks_.length; + for (uint i = 0; i < ribLen_; i++) { + if (blockId_ == reportedInBlocks_[i]) { revert('block is not new'); } } + + if (targetNode.nodeType == NodeType.SNode) { + require(storageKey_ != 0, 'storage key is required'); + uint128[] memory reportedKeys_ = targetNode.counters.reportedKeys; + uint rkLen_ = reportedKeys_.length; + for (uint i = 0; i < rkLen_; i++) { + if (storageKey_ == reportedKeys_[i]) { + revert('storage key is not new'); + } + } + targetNode.counters.reportedKeys.push(storageKey_); + } + + targetNode.counters.reportCounter++; targetNode.counters.reportedInBlocks.push(blockId_); // calculate new voters; they will collectively split payments on slash - address [] memory knownVoters = targetNode.counters.reportedBy; + address[] memory reportedBy_ = targetNode.counters.reportedBy; + uint rbLen_ = reportedBy_.length; for (uint n = 0; n < newVoters_.length; n++) { - for (uint k = 0; k < knownVoters.length; k++) { - if (newVoters_[n] == knownVoters[k] && newVoters_[n] != address(0)) { + for (uint k = 0; k < rbLen_; k++) { + if (newVoters_[n] == reportedBy_[k] && newVoters_[n] != address(0)) { newVoters_[n] = address(0); break; } @@ -529,11 +613,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } - emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, VoteAction.Report); // todo do we need this ? + emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, voteAction_); // todo do we need this ? emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); } - function doSlash(NodeInfo storage reporterNode, NodeInfo storage targetNode) private { + function slash(NodeInfo storage reporterNode, NodeInfo storage targetNode) private { console.log('doSlash'); // targetNode gets slashed by SLASH_PERCENT, this deducts delta_ tokens uint256 coll_; @@ -544,6 +628,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address[] memory reportedBy_ = targetNode.counters.reportedBy; uint256 reporterBonus_; reporterBonus_ = delta_ / (reportedBy_.length + 1); + require(reporterBonus_ >= 0, 'negative bonus'); for (uint i = 0; i < reportedBy_.length; i++) { NodeInfo storage ni = nodeMap[reportedBy_[i]]; if (ni.ownerWallet == address(0)) { @@ -551,7 +636,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } ni.nodeTokens += reporterBonus_; delta_ -= reporterBonus_; + require(delta_ >= 0, 'positive delta'); } + require(delta_ >= 0, 'negative delta'); // current reporter will get a slice of the bonus (so he gets 2xbonus) reporterNode.nodeTokens += delta_; // reporter gets slashed profils @@ -563,12 +650,12 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll_); } - function doBan(NodeInfo storage targetNode) private { + function ban(NodeInfo storage targetNode) private { uint256 coll_; uint256 delta_; (coll_, delta_) = reduceCollateral(targetNode, BAN_PERCENT); totalStaked -= delta_; - totalUnstaked += delta_; + totalFees += delta_; _unstakeNode(targetNode); targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); From ae545e9287f5d9648415b139871f385641327217 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 6 Dec 2023 01:00:35 +0700 Subject: [PATCH 69/84] add: storage node reporting (2) --- smart-contracts/contracts/Validator.sol | 122 +++++--- smart-contracts/src/DeployerUtil.ts | 6 +- .../test/ValidatorContract.test.ts | 268 ++++++++---------- smart-contracts/test/ValidatorHelper.ts | 83 ++++-- 4 files changed, 264 insertions(+), 215 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 82af871..8034dfc 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -89,17 +89,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { attestersCountPerBlock would grow as more nodes join the network; up to attestersTarget */ - uint8 public valPerBlock; + uint16 public valPerBlock; // maximum amount of validator signatures per block // we will grow or shrink valPerBlock up to this number - uint8 public valPerBlockTarget; + uint16 public valPerBlockTarget; // how many networkRandom objects are required to compute a random value - uint8 public nodeRandomMinCount; + uint16 public nodeRandomMinCount; // how many nodes should see the emitter of that networkRandom ; so that we could count on this network random - uint8 public nodeRandomPingCount; + uint16 public nodeRandomPingCount; // ----------------------------- CONTRACT STATE -------------------------------------------------- @@ -113,6 +113,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // node colleciton address[] public vnodes; + uint16 public vnodesActive; address[] public snodes; address[] public dnodes; mapping(address => NodeInfo) public nodeMap; @@ -130,9 +131,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { event NodeStatusChanged(address indexed nodeWallet, NodeStatus nodeStatus, uint256 nodeTokens); event NodeReported(address nodeWallet, address reporterWallet, address[] voters, VoteAction voteAction); - event AttestersRequiredUpdated(uint32 value); - event NodeRandomMinCountUpdated(uint32 value); - event NodeRandomPingCountUpdated(uint32 value); + event BlockParamsUpdated(uint16 valPerBlock, uint16 valPerBlockTarget); + event RandomParamsUpdated(uint16 nodeRandomMinCount, uint16 nodeRandomPingCount); + // ----------------------------- TYPES -------------------------------------------------- @@ -147,14 +148,28 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } struct NodeCounters { - uint16 reportCounter; // how many times this node was reported + // S, V nodes ----- + + // how many times this node was reported + // cleaned on SLASH + uint16 reportCounter; + // how many times this node was slashed uint16 slashCounter; // block numbers where this node was reported (cleaned on BAN) + // we prevent new reports that match any existing block in this list + // cleaned on BAN, unstake uint128[] reportedInBlocks; - // addresses who did the reports (they will receive slash rewards) (cleaned on SLASH) + + // addresses who did the reports, they will receive SLASH rewards + // cleaned on SLASH, BAN, unstake address[] reportedBy; - uint128[] reportedKeys; // keys missing (for storage nodes only) + + // S nodes ------- + + // keys missing (for storage nodes only) + // we prevent new reports that match any existing key in this list + uint128[] reportedKeys; } enum NodeStatus { @@ -196,9 +211,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function initialize( uint16 protocolVersion_, address pushToken_, - uint8 valPerBlockTarget_, - uint8 nodeRandomMinCount_, - uint8 nodeRandomPingCount_ + uint16 valPerBlockTarget_, + uint16 nodeRandomMinCount_, + uint16 nodeRandomPingCount_ ) initializer public { // init libraries __UUPSUpgradeable_init(); @@ -237,20 +252,18 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { storageContract = addr_; } - function updateAttestersCountPerBlock(uint8 val_) public onlyOwner { - _updateAttestersCountPerBlock(val_); - } - - function updateNodeRandomMinCount(uint8 val_) public onlyOwner { - require(val_ >= 0 && val_ < vnodes.length); - nodeRandomMinCount = val_; - emit NodeRandomMinCountUpdated(val_); + function updateBlockParams(uint16 valPerBlockTarget_) public onlyOwner { + require(valPerBlockTarget_ <= vnodes.length, 'incorrect valPerBlockTarget_'); + valPerBlockTarget = valPerBlockTarget_; + emit BlockParamsUpdated(valPerBlock, valPerBlockTarget_); } - function updateNodeRandomPingCount(uint8 val_) public onlyOwner { - require(val_ >= 0 && val_ < vnodes.length); - nodeRandomPingCount = val_; - emit NodeRandomPingCountUpdated(val_); + function updateRandomParams(uint16 nodeRandomMinCount_, uint16 nodeRandomPingCount_) public onlyOwner { + require(nodeRandomMinCount_ >= 0 && nodeRandomMinCount_ < vnodes.length); + require(nodeRandomPingCount_ >= 0 && nodeRandomPingCount_ < vnodes.length); + nodeRandomMinCount = nodeRandomMinCount_; + nodeRandomPingCount = nodeRandomPingCount_; + emit RandomParamsUpdated(nodeRandomMinCount_, nodeRandomPingCount_); } // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- @@ -263,7 +276,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { */ function registerNodeAndStake(uint256 nodeTokens_, NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { - + console.log('--register', nodeWallet_); // pre-actions if (nodeType_ == NodeType.VNode) { require(nodeTokens_ >= minStakeV, "Insufficient collateral for VNODE"); @@ -319,23 +332,32 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // from 1 up to attestersTarget // or down to 1 function recalcualteAttestersCountPerBlock() private { - uint activeValidators_ = 0; + uint16 activeValidators_ = 0; for (uint i = 0; i < vnodes.length; i++) { address nodeAddr_ = vnodes[i]; NodeInfo storage nodeInfo_ = nodeMap[nodeAddr_]; - if (nodeInfo_.nodeType == NodeType.VNode && isActiveValidator(nodeInfo_.status)) { + if (isActiveValidator(nodeInfo_.status)) { activeValidators_++; } } - uint newValue = activeValidators_; - if (valPerBlock > valPerBlockTarget) { - newValue = valPerBlockTarget; + vnodesActive = activeValidators_; + console.log('activeValidators_', activeValidators_); + uint16 valPerBlock_ = activeValidators_; + uint16 valPerBlockTarget_ = valPerBlockTarget; + if (valPerBlock_ > valPerBlockTarget_) { + valPerBlock_ = valPerBlockTarget_; + console.log('limit by target', valPerBlockTarget_); + } + require(valPerBlock <= valPerBlockTarget_); + if(valPerBlock_ != valPerBlock) { + console.log('recalcualteAttestersCountPerBlock', valPerBlock_, valPerBlockTarget_); + valPerBlock = valPerBlock_; + emit BlockParamsUpdated(valPerBlock_, valPerBlockTarget_); } - _updateAttestersCountPerBlock(uint8(newValue)); } function isActiveValidator(NodeStatus status) private pure returns (bool) { - return status == NodeStatus.Unstaked || status == NodeStatus.BannedAndUnstaked; + return !(status == NodeStatus.Unstaked || status == NodeStatus.BannedAndUnstaked); } /* @@ -343,6 +365,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { ACCESS: Any node owner can call this */ function unstakeNode(address nodeWallet_) public { + console.log('--unstake', nodeWallet_); NodeInfo storage node = nodeMap[nodeWallet_]; require(node.nodeWallet != address(0), "node does not exists"); require(node.ownerWallet == msg.sender || owner() == msg.sender, "only owner can unstake a node"); @@ -430,18 +453,33 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } - // ----------------------------- IMPL -------------------------------------------------- + function getVNodesLength() public view returns (uint) { + return vnodes.length; + } + function getVNodes() public view returns (address[] memory) { + return vnodes; + } - function _updateAttestersCountPerBlock(uint8 val_) private { - require(val_ >= 0 && val_ < vnodes.length); - if (val_ == valPerBlock) { - return; - } - valPerBlock = val_; - emit AttestersRequiredUpdated(val_); + function getSNodesLength() public view returns (uint) { + return snodes.length; + } + + function getSNodes() public view returns (address[] memory) { + return snodes; + } + + function getDNodesLength() public view returns (uint) { + return dnodes.length; } + function getDNodes() public view returns (address[] memory) { + return dnodes; + } + + // ----------------------------- IMPL -------------------------------------------------- + + // note: reading storage value multiple times which is sub-optimal, but the code looks much simpler function _reportVNode(VoteAction voteAction_, NodeInfo storage reporterNode, address[] memory uniqVoters_, NodeInfo storage targetNode, uint128 blockId_ @@ -527,10 +565,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { targetNode_.nodeTokens = 0; totalStaked -= delta; if (targetNode_.nodeType == NodeType.VNode) { - recalcualteAttestersCountPerBlock(); delete targetNode_.counters.reportedInBlocks; delete targetNode_.counters.reportedBy; findAndRemove(vnodes, targetNode_.nodeWallet); + recalcualteAttestersCountPerBlock(); // only after vnodes got shrinked } else if (targetNode_.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); diff --git a/smart-contracts/src/DeployerUtil.ts b/smart-contracts/src/DeployerUtil.ts index d3bfe7d..4373dae 100644 --- a/smart-contracts/src/DeployerUtil.ts +++ b/smart-contracts/src/DeployerUtil.ts @@ -18,8 +18,12 @@ export namespace DeployerUtil { export async function deployValidatorContract(hre: HardhatRuntimeEnvironment, pushCt:string): Promise { log('deploying ValidatorV1'); const validatorV1Factory = await hre.ethers.getContractFactory("ValidatorV1"); + const protocolVersion = 1; + const valPerBlockTarget = 5; + const nodeRandomMinCount = 1; + const nodeRandomPingCount = 1; const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushCt, 1, 1, 1], + [protocolVersion, pushCt, valPerBlockTarget, nodeRandomMinCount, nodeRandomPingCount], {kind: "uups"}); await validatorV1Proxy.deployed(); log(`deployed proxy: ${validatorV1Proxy.address}`); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index ee7c123..eeb4f51 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -8,8 +8,8 @@ import {ethers} from "hardhat"; import hre from "hardhat"; import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -import {TestHelper as t} from "./uitlz/TestHelper"; -import {NodeStatus, ValidatorHelper} from "./ValidatorHelper"; +import {TestHelper as th} from "./uitlz/TestHelper"; +import {NodeStatus, EthSig2, VoteData} from "./ValidatorHelper"; import {BigNumber, Contract} from "ethers"; import {BitUtil} from "./uitlz/bitUtil"; import {DeployerUtil, NodeType} from "../src/DeployerUtil"; @@ -61,9 +61,10 @@ async function deployStorageContract(valCt: ValidatorV1): Promise { // VARIABLES FOR TESTS let valCt: ValidatorV1; let pushCt: PushToken; -let storeCt: StorageV2; +let storeCt: StorageV1; let owner: SignerWithAddress; -let signers: SignerWithAddress[]; +let vnodes: SignerWithAddress[]; +let snodes: SignerWithAddress[]; let acc1: SignerWithAddress; let acc2: SignerWithAddress; let vnode1: SignerWithAddress; @@ -74,7 +75,7 @@ let snode2: SignerWithAddress; class DeployInfo { pushCt: PushToken; valCt: ValidatorV1; - storeCt: StorageV2; + storeCt: StorageV1; signers: SignerWithAddress[]; } @@ -92,7 +93,7 @@ async function initBlockchain(): Promise { const storeCt = await DeployerUtil.deployStorageContract(hre, valCt.address); await valCt.setStorageContract(storeCt.address); - for (let s of [owner_, signers[1], signers[2]]) { + for (let s of signers) { await pushCt.mint(s.address, ethers.utils.parseEther("100")); await pushCt .connect(s) @@ -107,15 +108,18 @@ async function beforeEachInit() { valCt = di.valCt; storeCt = di.storeCt; owner = di.signers[0]; - signers = di.signers; - acc1 = signers[1]; - acc2 = signers[2]; - vnode1 = signers[3]; - vnode2 = signers[4]; + vnodes = di.signers.slice(3, 11); + vnode1 = vnodes[0]; + vnode2 = vnodes[1]; - snode1 = signers[5]; - snode2 = signers[6]; + snodes = di.signers.slice(11, 16); + snode1 = snodes[0]; + snode2 = snodes[1]; + + let accs = di.signers.slice(16, 21); + acc1 = accs[0]; + acc2 = accs[1]; } @@ -205,147 +209,11 @@ describe("Validator - register nodes tests / vrn", function () { expect(nodeInfo.status).to.be.equal(0); } expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); - { - let t2 = await valCt.getNodes(); - log(t2); - } + assert.equal((await valCt.getVNodesLength()).toNumber(), 2); }) }); -describe("Validator - node reports on other node / vnro", function () { - - beforeEach(beforeEachInit); - - it("report-tc1", async function () { - let message = "0xAA"; - let node1Signature = await ValidatorHelper.sign(vnode1, message); - let signatures = [node1Signature]; - log(`voteData=${message}, signatures=${signatures}`); - // simulate a read only method - just to get method output - let result1 = await valCt.callStatic.reportNode(message, signatures); - log(`result=${result1}`); - expect(result1).to.be.equal(0); - }) - - - it("report-tc2 / register 2 nodes / report / report / slash / report / report / ban", async function () { - // register node1, node2 - { - let t1 = valCt.registerNodeAndStake(100, 0, - "http://snode1:3000", vnode1.address); - await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); - let nodeInfo = await valCt.getNodeInfo(vnode1.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushCt.balanceOf(valCt.address)).to.be.equal(100); - { - let t1 = valCt.registerNodeAndStake(200, 0, - "http://snode2:3000", vnode2.address); - await expect(t1).to.emit(valCt, "NodeAdded") - .withArgs(owner.address, vnode2.address, 0, 200, "http://snode2:3000"); - let nodeInfo = await valCt.getNodeInfo(vnode1.address); - expect(nodeInfo.status).to.be.equal(0); - } - expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); - { - let reportThatNode2IsBad = ValidatorHelper.encodeVoteDataToHex(0, vnode2.address); - let node1Signature = await ValidatorHelper.sign(vnode1, reportThatNode2IsBad); - let signers = [vnode1.address]; - let signatures = [node1Signature]; - log(`voteData=${reportThatNode2IsBad}, signers=${signers}, signatures=${signatures}`); - - let contractAsNode1 = valCt.connect(vnode1); - { - // node1 reports on node2 (1st report) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valCt.getNodeInfo(vnode2.address); - expect(nodeInfo.counters.reportCounter).to.be.equal(1); - - let bn: BigNumber = BigNumber.from(1); - expect(bn instanceof BigNumber).to.be.true; - - await t.expectEventFirst(tx, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 200 - }); - } - { - // node1 reports on node2 (2nd report - slash occurs - NodeStatusChanged event ) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valCt.getNodeInfo(vnode2.address); - log(nodeInfo); - expect(nodeInfo.status).to.be.equal(2); // slashed - expect(nodeInfo.nodeTokens).to.be.equal(198); // -1% - expect(nodeInfo.counters.reportCounter).to.be.equal(0); - expect(nodeInfo.counters.slashCounter).to.be.equal(1); - - await t.expectEvent(tx, 0, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 200 - }); - - await t.expectEvent(tx, 1, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Slashed, - nodeTokens: 198 - }); - } - { - // node1 reports on node2 (3rd - NodeStatusChanged event) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - - let nodeInfo = await valCt.getNodeInfo(vnode2.address); - expect(nodeInfo.counters.reportCounter).to.be.equal(1); - log(nodeInfo); - - await t.expectEventFirst(tx, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 198 - }); - } - { - // node1 reports on node2 (4th - 2nd slash occurs - NodeStatusChanged event - // and then ban occurs - NodeStatusChanged event) - let tx = await contractAsNode1.reportNode(reportThatNode2IsBad, [node1Signature]); - await t.confirmTransaction(tx); - let nodeInfo = await valCt.getNodeInfo(vnode2.address); - log('4th report'); - log(nodeInfo); - expect(nodeInfo.status).to.be.equal(3); // banned - expect(nodeInfo.nodeTokens).to.be.equal(0); // because we unstaked automatically - expect(nodeInfo.counters.reportCounter).to.be.equal(0); - expect(nodeInfo.counters.slashCounter).to.be.equal(2); - log('events ', (await tx.wait(1)).events); - await t.expectEvent(tx, 0, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Reported, - nodeTokens: 198 - }); - await t.expectEvent(tx, 1, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.Slashed, - nodeTokens: 196 - }); - await t.expectEvent(tx, 2, { - nodeWallet: vnode2.address, - nodeStatus: NodeStatus.BannedAndUnstaked, - nodeTokens: 0 - }); - } - } - }) -}) - describe("Storage", function () { beforeEach(beforeEachInit); @@ -394,14 +262,14 @@ describe("Storage", function () { // total funds locked = sum of both nodes stakes, // all nodes are visible in all contracts expect(await pushCt.balanceOf(valCt.address)).to.be.equal(300); - assert.deepEqual(await valCt.getNodes(), [snode1.address, snode2.address]) + assert.deepEqual(await valCt.getSNodes(), [snode1.address, snode2.address]) assert.deepEqual(await storeCt.getNodeAddresses(), [snode1.address, snode2.address]) { // remove node1 const t1 = await valCt.connect(acc1).unstakeNode(snode1.address); - await t.confirmTransaction(t1); + await th.confirmTransaction(t1); const t2 = await valCt.connect(acc1).unstakeNode(snode1.address); // try unstake 2nd time expect(t2).to.be.reverted; const t3 = valCt.connect(acc2).unstakeNode(snode1.address); // try unstake: not a node owner @@ -410,7 +278,7 @@ describe("Storage", function () { { // remove node2 const t1 = await valCt.connect(acc2).unstakeNode(snode2.address); - await t.confirmTransaction(t1); + await th.confirmTransaction(t1); const t2 = valCt.connect(acc2).unstakeNode(snode2.address); // try unstake 2nd time expect(t2).to.be.reverted; const t3 = valCt.connect(acc1).unstakeNode(snode2.address); // try unstake: not a node owner @@ -437,7 +305,7 @@ describe("Storage", function () { .connect(owner) .registerNodeAndStake(100, 0, "http://snode1:3000", vnode1.address); - await t.confirmTransaction(tx); + await th.confirmTransaction(tx); let ownerBalanceAfter = await pushCt.balanceOf(owner.address); let valContractBalanceAfter = await pushCt.balanceOf(valCt.address); @@ -473,7 +341,7 @@ describe("Storage", function () { let tx = await valCt .connect(owner) .unstakeNode(vnode1.address); - await t.confirmTransaction(tx); + await th.confirmTransaction(tx); let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); @@ -494,3 +362,93 @@ describe("Storage", function () { }); }); + + +describe("Validator - node reports on other node / vnro", function () { + + beforeEach(beforeEachInit); + + it("check-smart-contract-compatipable-signatures-cscs", async function () { + let vd = new VoteData('1111', '0x' + "AA".repeat(20), 1); + const packed = VoteData.write(vd); + console.log('vote data packed: ', packed); + + const sig1 = await EthSig2.signOffline(vnode1, packed); + console.log('signer is', vnode1.address); + console.log('signature: ', sig1); + const valid = await EthSig2.checkOffline(packed, sig1, vnode1.address); + console.log('signature is valid: ', valid); + expect(valid).to.be.true; + }); + + it("val-reg-1", async function () { + assert.equal(await valCt.valPerBlock(), 0); + assert.equal(await valCt.valPerBlockTarget(), 5); + { + let t1 = await valCt.registerNodeAndStake(100, 0, + "http://snode1:3000", vnode1.address); + await expect(t1).to.emit(valCt, "NodeAdded") + .withArgs(owner.address, vnode1.address, 0, 100, "http://snode1:3000"); + await expect(t1).to.emit(valCt, "BlockParamsUpdated") + .withArgs(1, 5); + assert.equal(await valCt.valPerBlock(), 1); + let nodeInfo = await valCt.getNodeInfo(vnode1.address); + assert.equal(nodeInfo.status, 0); + } + + }); + + it("stor-reg-6", async function () { + let nodeType = NodeType.SNode; + let nodeTokens = 100; + // register nodes + assert.equal(await valCt.valPerBlock(), 0); + assert.equal(await valCt.valPerBlockTarget(), 5); + for(let i=0;i<6;i++) { + let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, + `http://snode${i}:3000`, vnodes[i].address); + await th.confirmTransaction(t1); + } + assert.equal((await valCt.getSNodesLength()).toNumber(), 6); + assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); + + // unstake nodes + for(let i=0;i<6;i++) { + let t1 = await valCt.unstakeNode(vnodes[i].address); + await th.confirmTransaction(t1); + } + assert.equal((await valCt.getSNodesLength()).toNumber(), 0); + assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 0); + }); + + + it("val-reg-6", async function () { + let nodeType = NodeType.VNode; + let nodeTokens = 100; + // register nodes + assert.equal(await valCt.valPerBlock(), 0); + assert.equal(await valCt.valPerBlockTarget(), 5); + for(let i=0;i<6;i++) { + let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, + `http://snode${i}:3000`, vnodes[i].address); + await th.confirmTransaction(t1); + } + assert.equal((await valCt.getVNodesLength()).toNumber(), 6); + assert.equal(await valCt.valPerBlock(), 5); // peaks at 5, even for 6 nodes + assert.equal(await valCt.valPerBlockTarget(), 5); + assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); + // report each other + // todo + + // unstake nodes + for(let i=0;i<6;i++) { + let t1 = await valCt.unstakeNode(vnodes[i].address); + await th.confirmTransaction(t1); + } + assert.equal((await valCt.getVNodesLength()).toNumber(), 0); + assert.equal(await valCt.valPerBlock(), 0); + assert.equal(await valCt.valPerBlockTarget(), 5); + assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 0); + }); + +}); diff --git a/smart-contracts/test/ValidatorHelper.ts b/smart-contracts/test/ValidatorHelper.ts index 1abe9bf..d575252 100644 --- a/smart-contracts/test/ValidatorHelper.ts +++ b/smart-contracts/test/ValidatorHelper.ts @@ -1,29 +1,78 @@ import {ethers} from "hardhat"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; +import {verifyMessage} from "ethers/lib/utils"; +import {BytesLike, DataOptions, Hexable} from "@ethersproject/bytes/src.ts"; -export class ValidatorHelper { - static utils = ethers.utils; +export class EthSig2 { + static utils = ethers.utils; - static getMessageHashAsInContract(message: string) { - let utils = ethers.utils; - return utils.keccak256(utils.arrayify(message)); - } + static getMessageHashAsInContract(message: string): string { + return ethers.utils.keccak256(ethers.utils.arrayify(message)); + } + + static toBytes(value: BytesLike | Hexable | number): Uint8Array { + return ethers.utils.arrayify(value); + } + + // simple sign with a private key + static async sign(wallet: SignerWithAddress, message: string): Promise { + return await wallet.signMessage(this.toBytes(message)); + } - static async sign(wallet: SignerWithAddress, message: string): Promise { - const hash = ValidatorHelper.getMessageHashAsInContract(message); - return await wallet.signMessage(ethers.utils.arrayify(hash)); + // simple check signature's public key (via address) + public static async check(message: string, sig: string, targetWallet: string): Promise { + const verificationAddress = verifyMessage(this.toBytes(message), sig); + console.log('verification address:', verificationAddress); + if (targetWallet !== verificationAddress) { + return false; } + return true; + } - static encodeVoteDataToHex(voteAction: number, targetWallet: string): string { - let abi = ethers.utils.defaultAbiCoder; - return abi.encode(["uint8", "address"], [voteAction, targetWallet]); + // https://ethereum.org/es/developers/tutorials/eip-1271-smart-contract-signatures/ + static async signOffline(wallet: SignerWithAddress, message: string): Promise { + const hash = this.getMessageHashAsInContract(message); + return await wallet.signMessage(this.toBytes(hash)); + } + + public static async checkOffline(message: string, sig: string, targetWallet: string): Promise { + const hash = this.getMessageHashAsInContract(message); + const verificationAddress = verifyMessage(ethers.utils.arrayify(hash), sig); + console.log('verification address:', verificationAddress); + if (targetWallet !== verificationAddress) { + return false; } + return true; + } + } export enum NodeStatus { - OK, // this node operates just fine (DEFAULT VALUE) - Reported, // he have a few malicious reports - Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) - BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) - Unstaked + OK, // this node operates just fine (DEFAULT VALUE) + Reported, // he have a few malicious reports + Slashed, // we already slashed this node at least once (normally we will take -2% of collateral tokens) + BannedAndUnstaked, // we banned the node and unstaked it's tokens (normally we will take -10% of collateral tokens) + Unstaked +} + +export class VoteData { + // the block where vote should be placed + blockId: string; + // the node wallet, we do a complaint about + targetNode: string; + // the vote action, right now it is 1 + voteAction: number; + + + constructor(blockId: string, targetNode: string, voteAction: number) { + this.blockId = blockId; + this.targetNode = targetNode; + this.voteAction = voteAction; + } + + public static write(vt: VoteData): string { + let abi = ethers.utils.defaultAbiCoder; + return abi.encode(["uint128", "address", "uint8"], + [vt.blockId, vt.targetNode, 1]); + } } \ No newline at end of file From 79de18020ad2edb6409fa910c7a87662356ffa1d Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 11 Dec 2023 01:22:21 +0700 Subject: [PATCH 70/84] add: storage node reporting (3) --- smart-contracts/contracts/Validator.sol | 70 +++++---- smart-contracts/src/DeployerUtil.ts | 15 +- .../test/ValidatorContract.test.ts | 136 ++++++++++-------- smart-contracts/test/ValidatorHelper.ts | 14 +- 4 files changed, 136 insertions(+), 99 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 8034dfc..2e410ea 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -56,9 +56,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { we accept a VoteData sign by this amout of nodes: REPORT_THRESHOLD we perform a slash after this amount of reports: REPORTS_BEFORE_SLASH */ - uint32 public REPORT_THRESHOLD_PER_BLOCK; // i.e. 66 = 66% = 2/3 - uint32 public REPORTS_BEFORE_SLASH_V; - uint32 public REPORTS_BEFORE_SLASH_S; + uint16 public REPORT_THRESHOLD_PER_BLOCK; // i.e. 66 = 66% = 2/3 + uint16 public REPORTS_BEFORE_SLASH_V; + uint16 public REPORTS_BEFORE_SLASH_S; /* slash = reduces node collateral for SLASH_PERCENT % @@ -66,11 +66,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { after SLASH_BEFORE_BAN iterations, the node would get a ban ban = reduces node collateral for BAN_PERCENT, node address is banned forever */ - uint32 public SLASH_PERCENT; - uint32 public SLASHES_BEFORE_BAN_V; - uint32 public SLASHES_BEFORE_BAN_S; + uint16 public SLASH_PERCENT; + uint16 public SLASHES_BEFORE_BAN_V; + uint16 public SLASHES_BEFORE_BAN_S; - uint32 public BAN_PERCENT; + uint16 public BAN_PERCENT; /* validator validation params (effectively constant only for V backend) these parameters control how nodejs processes communicate @@ -213,7 +213,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address pushToken_, uint16 valPerBlockTarget_, uint16 nodeRandomMinCount_, - uint16 nodeRandomPingCount_ + uint16 nodeRandomPingCount_, + uint16 REPORTS_BEFORE_SLASH_V_, + uint16 REPORTS_BEFORE_SLASH_S_, + uint16 SLASHES_BEFORE_BAN_V_, + uint16 SLASHES_BEFORE_BAN_S_, + uint16 SLASH_PERCENT_, + uint16 BAN_PERCENT_ ) initializer public { // init libraries __UUPSUpgradeable_init(); @@ -232,12 +238,12 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { minStakeV = 100; minStakeS = 100; minStakeD = 100; - REPORTS_BEFORE_SLASH_V = 10; - REPORTS_BEFORE_SLASH_S = 50; // todo should be 10 for V and 50 for S nodes - SLASH_PERCENT = 1; - SLASHES_BEFORE_BAN_V = 2; - SLASHES_BEFORE_BAN_S = 2; - BAN_PERCENT = 10; + REPORTS_BEFORE_SLASH_V = REPORTS_BEFORE_SLASH_V_; + REPORTS_BEFORE_SLASH_S = REPORTS_BEFORE_SLASH_S_; + SLASH_PERCENT = SLASH_PERCENT_; // todo FIX + SLASHES_BEFORE_BAN_V = SLASHES_BEFORE_BAN_V_; + SLASHES_BEFORE_BAN_S = SLASHES_BEFORE_BAN_S_; + BAN_PERCENT = BAN_PERCENT_; REPORT_THRESHOLD_PER_BLOCK = 66; @@ -426,17 +432,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { if (targetNodeType_ == NodeType.VNode) { // unpack and verify - uint8 voteAction_; + uint8 cmd_; uint128 blockId_; address targetNodeAddr_; - (voteAction_, blockId_, targetNodeAddr_) = abi.decode(voteBlob_, (uint8, uint128, address)); + (cmd_, blockId_, targetNodeAddr_) = abi.decode(voteBlob_, (uint8, uint128, address)); - require(voteAction_ == uint8(VoteAction.ReportV), 'report action only supported'); + require(cmd_ == uint8(VoteAction.ReportV), 'report action only supported'); NodeInfo storage targetNode_ = nodeMap[targetNodeAddr_]; require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); require(targetNode_.nodeType == NodeType.VNode, "report only for VNodes"); - _reportVNode(VoteAction(voteAction_), reporterNode_, uniqVoters_, targetNode_, blockId_); + _reportVNode(VoteAction(cmd_), reporterNode_, uniqVoters_, targetNode_, blockId_); } else if (targetNodeType_ == NodeType.SNode) { uint8 voteAction_; uint128 blockId_; @@ -631,6 +637,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { targetNode.counters.reportCounter++; targetNode.counters.reportedInBlocks.push(blockId_); + console.log('targetNode wallet', targetNode.nodeWallet); + console.log('targetNode added blockId', blockId_); // calculate new voters; they will collectively split payments on slash address[] memory reportedBy_ = targetNode.counters.reportedBy; @@ -665,20 +673,22 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // every pre-exising-signed-reporter will get a slice of the bonus address[] memory reportedBy_ = targetNode.counters.reportedBy; uint256 reporterBonus_; - reporterBonus_ = delta_ / (reportedBy_.length + 1); - require(reporterBonus_ >= 0, 'negative bonus'); - for (uint i = 0; i < reportedBy_.length; i++) { - NodeInfo storage ni = nodeMap[reportedBy_[i]]; - if (ni.ownerWallet == address(0)) { - continue; + if (delta_ > 0 && reportedBy_.length > 0) { + reporterBonus_ = delta_ / reportedBy_.length; + console.log('reporter bonus=', reporterBonus_); + require(reporterBonus_ >= 0, 'negative bonus'); + for (uint i = 0; i < reportedBy_.length; i++) { + NodeInfo storage ni = nodeMap[reportedBy_[i]]; + if (ni.ownerWallet == address(0)) { + continue; + } + ni.nodeTokens += reporterBonus_; + delta_ -= reporterBonus_; + require(delta_ >= 0, 'positive delta'); } - ni.nodeTokens += reporterBonus_; - delta_ -= reporterBonus_; - require(delta_ >= 0, 'positive delta'); } - require(delta_ >= 0, 'negative delta'); - // current reporter will get a slice of the bonus (so he gets 2xbonus) - reporterNode.nodeTokens += delta_; // reporter gets slashed profils + // reporter will get the remaing points (less that reporterBonus) + reporterNode.nodeTokens += delta_; delete targetNode.counters.reportedBy; diff --git a/smart-contracts/src/DeployerUtil.ts b/smart-contracts/src/DeployerUtil.ts index 4373dae..adb2e80 100644 --- a/smart-contracts/src/DeployerUtil.ts +++ b/smart-contracts/src/DeployerUtil.ts @@ -15,15 +15,24 @@ export namespace DeployerUtil { return pushContract; } - export async function deployValidatorContract(hre: HardhatRuntimeEnvironment, pushCt:string): Promise { + export async function deployValidatorContract(hre: HardhatRuntimeEnvironment, pushCt: string): Promise { log('deploying ValidatorV1'); const validatorV1Factory = await hre.ethers.getContractFactory("ValidatorV1"); const protocolVersion = 1; const valPerBlockTarget = 5; const nodeRandomMinCount = 1; const nodeRandomPingCount = 1; + const REPORTS_BEFORE_SLASH_V = 2; // 10 for prod + const REPORTS_BEFORE_SLASH_S = 2; // 50 for prod + const SLASHES_BEFORE_BAN_V = 2; + const SLASHES_BEFORE_BAN_S = 2; + const SLASH_PERCENT = 10; + const BAN_PERCENT = 10; + const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [protocolVersion, pushCt, valPerBlockTarget, nodeRandomMinCount, nodeRandomPingCount], + [protocolVersion, pushCt, valPerBlockTarget, nodeRandomMinCount, nodeRandomPingCount, + REPORTS_BEFORE_SLASH_V, REPORTS_BEFORE_SLASH_S, SLASHES_BEFORE_BAN_V, SLASHES_BEFORE_BAN_S, + SLASH_PERCENT, BAN_PERCENT], {kind: "uups"}); await validatorV1Proxy.deployed(); log(`deployed proxy: ${validatorV1Proxy.address}`); @@ -34,7 +43,7 @@ export namespace DeployerUtil { return validatorV1Proxy; } - export async function updateValidatorContract(hre:HardhatRuntimeEnvironment, validatorProxyCt:string) { + export async function updateValidatorContract(hre: HardhatRuntimeEnvironment, validatorProxyCt: string) { const ethers = hre.ethers; const [owner] = await hre.ethers.getSigners(); log(`owner is ${owner.address}`); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index eeb4f51..ec7535b 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -3,59 +3,18 @@ import {loadFixture} from "@nomicfoundation/hardhat-network-helpers"; import "@nomicfoundation/hardhat-chai-matchers"; import "@nomiclabs/hardhat-ethers"; -import {expect, assert} from "chai"; -import {ethers} from "hardhat"; -import hre from "hardhat"; +import {assert, expect} from "chai"; +import hre, {ethers} from "hardhat"; import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as th} from "./uitlz/TestHelper"; -import {NodeStatus, EthSig2, VoteData} from "./ValidatorHelper"; -import {BigNumber, Contract} from "ethers"; +import {EthSig2, NodeStatus, VoteData} from "./ValidatorHelper"; import {BitUtil} from "./uitlz/bitUtil"; import {DeployerUtil, NodeType} from "../src/DeployerUtil"; +import {BigNumber} from "ethers"; let log = console.log; -/* -async function deployPushTokenFake(): Promise { - log('deploying PushToken'); - const ptFactory = await ethers.getContractFactory("PushToken"); - const pushContract = await ptFactory.deploy(); - log(`deployed impl: ${pushContract.address}`); - log('done'); - return pushContract; -} - -async function deployValidatorContract(pushCt: PushToken): Promise { - log('deploying ValidatorV1'); - const validatorV1Factory = await ethers.getContractFactory("ValidatorV1"); - const validatorV1Proxy = await upgrades.deployProxy(validatorV1Factory, - [1, pushCt.address, 1, 1, 1], - {kind: "uups"}); - await validatorV1Proxy.deployed(); - log(`deployed proxy: ${validatorV1Proxy.address}`); - - let validatorV1Impl = await upgrades.erc1967.getImplementationAddress(validatorV1Proxy.address); - log(`deployed impl: ${validatorV1Impl}`); - log('done'); - return validatorV1Proxy; -} - -async function deployStorageContract(valCt: ValidatorV1): Promise { - log('deploying StorageV1') - let protocolVersion = 1; - let rfTarget = 5; - const factory = await ethers.getContractFactory("StorageV1"); - const proxyCt = await upgrades.deployProxy(factory, - [protocolVersion, valCt.address, rfTarget], - {kind: "uups"}); - await proxyCt.deployed(); - log(`deployed proxy: ${proxyCt.address}`); - let implCt = await upgrades.erc1967.getImplementationAddress(proxyCt.address); - log(`deployed impl: ${implCt}`); - log('done'); - return proxyCt; -}*/ // VARIABLES FOR TESTS @@ -87,7 +46,7 @@ async function initBlockchain(): Promise { const [owner_] = signers; const pushCt = await DeployerUtil.deployPushTokenFake(hre); - +// todo SLASH_PERCENT 10 for tests, and 1 for PROD const valCt = await DeployerUtil.deployValidatorContract(hre, pushCt.address); const storeCt = await DeployerUtil.deployStorageContract(hre, valCt.address); @@ -368,9 +327,9 @@ describe("Validator - node reports on other node / vnro", function () { beforeEach(beforeEachInit); - it("check-smart-contract-compatipable-signatures-cscs", async function () { - let vd = new VoteData('1111', '0x' + "AA".repeat(20), 1); - const packed = VoteData.write(vd); + it("Check smart contract signatures - cscs", async function () { + let vd = new VoteData(1, '1111', '0x' + "AA".repeat(20)); + const packed = VoteData.encode(vd); console.log('vote data packed: ', packed); const sig1 = await EthSig2.signOffline(vnode1, packed); @@ -381,7 +340,7 @@ describe("Validator - node reports on other node / vnro", function () { expect(valid).to.be.true; }); - it("val-reg-1", async function () { + it("Register 1 validator node and check events - val-reg-1", async function () { assert.equal(await valCt.valPerBlock(), 0); assert.equal(await valCt.valPerBlockTarget(), 5); { @@ -398,13 +357,13 @@ describe("Validator - node reports on other node / vnro", function () { }); - it("stor-reg-6", async function () { + it("Register 6 storage nodes and unstake them - stor-reg-6", async function () { let nodeType = NodeType.SNode; let nodeTokens = 100; // register nodes assert.equal(await valCt.valPerBlock(), 0); assert.equal(await valCt.valPerBlockTarget(), 5); - for(let i=0;i<6;i++) { + for (let i = 0; i < 6; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, `http://snode${i}:3000`, vnodes[i].address); await th.confirmTransaction(t1); @@ -413,7 +372,7 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); // unstake nodes - for(let i=0;i<6;i++) { + for (let i = 0; i < 6; i++) { let t1 = await valCt.unstakeNode(vnodes[i].address); await th.confirmTransaction(t1); } @@ -422,13 +381,13 @@ describe("Validator - node reports on other node / vnro", function () { }); - it("val-reg-6", async function () { + it("Regster 6 validator nodes and unstake them - val-reg-unreg-6", async function () { let nodeType = NodeType.VNode; let nodeTokens = 100; // register nodes assert.equal(await valCt.valPerBlock(), 0); assert.equal(await valCt.valPerBlockTarget(), 5); - for(let i=0;i<6;i++) { + for (let i = 0; i < 6; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, `http://snode${i}:3000`, vnodes[i].address); await th.confirmTransaction(t1); @@ -437,11 +396,8 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal(await valCt.valPerBlock(), 5); // peaks at 5, even for 6 nodes assert.equal(await valCt.valPerBlockTarget(), 5); assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); - // report each other - // todo - // unstake nodes - for(let i=0;i<6;i++) { + for (let i = 0; i < 6; i++) { let t1 = await valCt.unstakeNode(vnodes[i].address); await th.confirmTransaction(t1); } @@ -451,4 +407,66 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 0); }); + it("Regster 3 validator nodes - 2 report on 1 - 3v-reports", async function () { + let nodeType = NodeType.VNode; + let nodeTokens = 100; + // register 3 nodes + assert.equal(await valCt.valPerBlock(), 0); + assert.equal(await valCt.valPerBlockTarget(), 5); + for (let i = 0; i < 3; i++) { + let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, + `http://snode${i}:3000`, vnodes[i].address); + await th.confirmTransaction(t1); + } + + { + // v0,v1 report on v2 ; v0 calls reportNode + const vote = VoteData.encode(new VoteData(1, '0x1111', vnodes[2].address)); + const sig0 = await EthSig2.signOffline(vnodes[0], vote); + const sig1 = await EthSig2.signOffline(vnodes[1], vote); + // 1st report + let tx1 = await valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + + const ni = await valCt.getNodeInfo(vnodes[2].address); + assert.deepEqual(ni.counters.reportedBy, [vnodes[0].address, vnodes[1].address]); + + await expect(tx1).to.emit(valCt, "NodeStatusChanged") + .withArgs(vnodes[2].address, NodeStatus.Reported, BigNumber.from(100)); // 1% slash occured + + console.log('vote', vote); + console.log('signature ', sig1); + console.log('voter wallet is', vnode1.address); + + //duplicate report + //same block id = reject + let tx2 = valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + await th.expectRejct(tx2); + } + + //2nd report (2 reports lead to slash; both n0,n1 get +5 tokens) + { + const vote = VoteData.encode(new VoteData(1, '0x2222', vnodes[2].address)); + const sig0 = await EthSig2.signOffline(vnodes[0], vote); + const sig1 = await EthSig2.signOffline(vnodes[1], vote); + let tx = await valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + // await th.printEvents(tx); + await expect(tx).to.emit(valCt, "NodeStatusChanged") + .withArgs(vnodes[2].address, NodeStatus.Slashed, BigNumber.from(90)); // 10% slash occured + + const ni2 = await valCt.getNodeInfo(vnodes[2].address); + assert.equal(ni2.nodeTokens.toNumber(), 90); + assert.equal(ni2.status, NodeStatus.Slashed); + assert.equal(ni2.counters.slashCounter, 1); + assert.equal(ni2.counters.reportCounter, 0); + assert.deepEqual(ni2.counters.reportedBy, []); + assert.deepEqual(ni2.counters.reportedKeys, []); + + const ni0 = await valCt.getNodeInfo(vnodes[0].address); + assert.equal(ni0.nodeTokens.toNumber(), 105); + + const ni1 = await valCt.getNodeInfo(vnodes[1].address); + assert.equal(ni1.nodeTokens.toNumber(), 105); + } + }); + }); diff --git a/smart-contracts/test/ValidatorHelper.ts b/smart-contracts/test/ValidatorHelper.ts index d575252..6c2f14d 100644 --- a/smart-contracts/test/ValidatorHelper.ts +++ b/smart-contracts/test/ValidatorHelper.ts @@ -56,23 +56,23 @@ export enum NodeStatus { } export class VoteData { + // the vote action, right now it is 1 + cmd: number; // the block where vote should be placed blockId: string; // the node wallet, we do a complaint about targetNode: string; - // the vote action, right now it is 1 - voteAction: number; - constructor(blockId: string, targetNode: string, voteAction: number) { + constructor(cmd: number, blockId: string, targetNode: string) { + this.cmd = cmd; this.blockId = blockId; this.targetNode = targetNode; - this.voteAction = voteAction; } - public static write(vt: VoteData): string { + public static encode(vt: VoteData): string { let abi = ethers.utils.defaultAbiCoder; - return abi.encode(["uint128", "address", "uint8"], - [vt.blockId, vt.targetNode, 1]); + return abi.encode(["uint8", "uint128", "address", ], + [1, vt.blockId, vt.targetNode]); } } \ No newline at end of file From fa29225ff0a874082f54cb01ee6b9a840c2167fe Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 11 Dec 2023 14:14:43 +0700 Subject: [PATCH 71/84] add: storage node reporting (4) --- smart-contracts/contracts/Validator.sol | 64 ++++---- .../test/ValidatorContract.test.ts | 147 +++++++++++++++--- smart-contracts/test/ValidatorHelper.ts | 29 +++- smart-contracts/test/uitlz/TestHelper.ts | 21 ++- .../services/messaging-dset/queueClient.ts | 3 +- 5 files changed, 207 insertions(+), 57 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 2e410ea..f537be7 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -144,6 +144,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 nodeTokens; string nodeApiBaseUrl; // rest api url for invocation NodeCounters counters; + // worst case status, at least 1 report or slash leads to status reported or slashed + // OK -> reported -> slashed -> banned NodeStatus status; } @@ -444,17 +446,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { _reportVNode(VoteAction(cmd_), reporterNode_, uniqVoters_, targetNode_, blockId_); } else if (targetNodeType_ == NodeType.SNode) { - uint8 voteAction_; + uint8 cmd_; uint128 blockId_; address targetNodeAddr_; uint128 skey_; - (voteAction_, blockId_, targetNodeAddr_, skey_) = abi.decode(voteBlob_, (uint8, uint128, address, uint128)); + (cmd_, blockId_, targetNodeAddr_, skey_) = abi.decode(voteBlob_, (uint8, uint128, address, uint128)); - require(voteAction_ == uint8(VoteAction.ReportS), 'report action only supported'); + require(cmd_ == uint8(VoteAction.ReportS), 'report action only supported'); NodeInfo storage targetNode_ = nodeMap[targetNodeAddr_]; require(targetNode_.nodeWallet != address(0), "target node wallet does not exists"); require(targetNode_.nodeType == NodeType.SNode, "report only for SNodes"); - _reportSNode(VoteAction(voteAction_), reporterNode_, uniqVoters_, targetNode_, blockId_, skey_); + _reportSNode(VoteAction(cmd_), reporterNode_, uniqVoters_, targetNode_, blockId_, skey_); } } @@ -491,22 +493,22 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { address[] memory uniqVoters_, NodeInfo storage targetNode, uint128 blockId_ ) private returns (uint8) { require(targetNode.nodeType == NodeType.VNode, "report only for VNodes"); - if (uniqVoters_.length < valPerBlock * REPORT_THRESHOLD_PER_BLOCK / 100) { revert('sig count is too low'); } + NodeStatus ns_ = targetNode.status; + if (ns_ == NodeStatus.Unstaked || ns_ == NodeStatus.BannedAndUnstaked) { + // this is a terminal state + return 0; + } reportIfNew(voteAction_, reporterNode, targetNode, uniqVoters_, blockId_, 0); - NodeStatus ns = targetNode.status; - if (ns == NodeStatus.OK || ns == NodeStatus.Slashed) { - if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_V) { - slash(reporterNode, targetNode); - } - if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_V) { - ban(targetNode); - } - } else if (ns == NodeStatus.BannedAndUnstaked) { - // do nothing; terminal state + + if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_V) { + slash(reporterNode, targetNode); + } + if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_V) { + ban(targetNode); } return 0; } @@ -514,21 +516,22 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { function _reportSNode(VoteAction voteAction_, NodeInfo storage reporterNode, address[] memory uniqVoters_, NodeInfo storage targetNode, uint128 blockId_, uint128 storageKey_) private returns (uint8) { require(targetNode.nodeType == NodeType.SNode, "report only for SNodes"); - if (uniqVoters_.length < valPerBlock * REPORT_THRESHOLD_PER_BLOCK / 100) { revert('sig count is too low'); } - reportIfNew(voteAction_, reporterNode, targetNode, uniqVoters_, blockId_, storageKey_); NodeStatus ns_ = targetNode.status; - if (ns_ == NodeStatus.OK || ns_ == NodeStatus.Slashed) { - if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_S) { - slash(reporterNode, targetNode); - } - if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_S) { - ban(targetNode); - } - } else if (ns_ == NodeStatus.BannedAndUnstaked) { - // do nothing; terminal state + if (ns_ == NodeStatus.Unstaked || ns_ == NodeStatus.BannedAndUnstaked) { + // this is a terminal state + return 0; + } + + reportIfNew(voteAction_, reporterNode, targetNode, uniqVoters_, blockId_, storageKey_); + + if (targetNode.counters.reportCounter >= REPORTS_BEFORE_SLASH_S) { + slash(reporterNode, targetNode); + } + if (targetNode.counters.slashCounter >= SLASHES_BEFORE_BAN_S) { + ban(targetNode); } return 0; } @@ -632,6 +635,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } targetNode.counters.reportedKeys.push(storageKey_); + console.log('targetNode added skey', storageKey_); } @@ -658,7 +662,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } - + if(targetNode.status == NodeStatus.OK) { + targetNode.status = NodeStatus.Reported; + } emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, voteAction_); // todo do we need this ? emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); } @@ -692,7 +698,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { delete targetNode.counters.reportedBy; - targetNode.status = NodeStatus.Slashed; + if(targetNode.status == NodeStatus.OK || targetNode.status == NodeStatus.Reported) { + targetNode.status = NodeStatus.Slashed; + } targetNode.counters.reportCounter = 0; targetNode.counters.slashCounter++; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Slashed, coll_); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index ec7535b..c62aec1 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -8,7 +8,7 @@ import hre, {ethers} from "hardhat"; import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; import {TestHelper as th} from "./uitlz/TestHelper"; -import {EthSig2, NodeStatus, VoteData} from "./ValidatorHelper"; +import {EthSig2, NodeStatus, VoteDataS, VoteDataV} from "./ValidatorHelper"; import {BitUtil} from "./uitlz/bitUtil"; import {DeployerUtil, NodeType} from "../src/DeployerUtil"; import {BigNumber} from "ethers"; @@ -16,7 +16,6 @@ import {BigNumber} from "ethers"; let log = console.log; - // VARIABLES FOR TESTS let valCt: ValidatorV1; let pushCt: PushToken; @@ -328,8 +327,8 @@ describe("Validator - node reports on other node / vnro", function () { beforeEach(beforeEachInit); it("Check smart contract signatures - cscs", async function () { - let vd = new VoteData(1, '1111', '0x' + "AA".repeat(20)); - const packed = VoteData.encode(vd); + let vd = new VoteDataV(1, '1111', '0x' + "AA".repeat(20)); + const packed = VoteDataV.encode(vd); console.log('vote data packed: ', packed); const sig1 = await EthSig2.signOffline(vnode1, packed); @@ -357,7 +356,7 @@ describe("Validator - node reports on other node / vnro", function () { }); - it("Register 6 storage nodes and unstake them - stor-reg-6", async function () { + it("Register 6 storage nodes and unstake them :: reg-6s", async function () { let nodeType = NodeType.SNode; let nodeTokens = 100; // register nodes @@ -381,7 +380,7 @@ describe("Validator - node reports on other node / vnro", function () { }); - it("Regster 6 validator nodes and unstake them - val-reg-unreg-6", async function () { + it("Regster 6 validator nodes and unstake them :: reg-6v-unreg", async function () { let nodeType = NodeType.VNode; let nodeTokens = 100; // register nodes @@ -407,9 +406,13 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 0); }); - it("Regster 3 validator nodes - 2 report on 1 - 3v-reports", async function () { + + it("Regster 3 validator nodes - 2 report on 1 :: v-reports-on-v", async function () { let nodeType = NodeType.VNode; let nodeTokens = 100; + const v0 = vnodes[0]; + const v1 = vnodes[1]; + const v2 = vnodes[2]; // register 3 nodes assert.equal(await valCt.valPerBlock(), 0); assert.equal(await valCt.valPerBlockTarget(), 5); @@ -421,17 +424,23 @@ describe("Validator - node reports on other node / vnro", function () { { // v0,v1 report on v2 ; v0 calls reportNode - const vote = VoteData.encode(new VoteData(1, '0x1111', vnodes[2].address)); - const sig0 = await EthSig2.signOffline(vnodes[0], vote); - const sig1 = await EthSig2.signOffline(vnodes[1], vote); + const vote = VoteDataV.encode(new VoteDataV(1, '0x1111', v2.address)); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); // 1st report - let tx1 = await valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + let tx1 = await valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); + + const ni = await valCt.getNodeInfo(v2.address); - const ni = await valCt.getNodeInfo(vnodes[2].address); - assert.deepEqual(ni.counters.reportedBy, [vnodes[0].address, vnodes[1].address]); + assert.equal(ni.nodeTokens.toNumber(), 100); + assert.equal(ni.status, NodeStatus.Reported); + assert.equal(ni.counters.slashCounter, 0); + assert.equal(ni.counters.reportCounter, 1); + assert.deepEqual(ni.counters.reportedBy, [v0.address, v1.address]); + assert.deepEqual(ni.counters.reportedKeys, []); await expect(tx1).to.emit(valCt, "NodeStatusChanged") - .withArgs(vnodes[2].address, NodeStatus.Reported, BigNumber.from(100)); // 1% slash occured + .withArgs(v2.address, NodeStatus.Reported, BigNumber.from(100)); // 1% slash occured console.log('vote', vote); console.log('signature ', sig1); @@ -439,21 +448,21 @@ describe("Validator - node reports on other node / vnro", function () { //duplicate report //same block id = reject - let tx2 = valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + let tx2 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); await th.expectRejct(tx2); } //2nd report (2 reports lead to slash; both n0,n1 get +5 tokens) { - const vote = VoteData.encode(new VoteData(1, '0x2222', vnodes[2].address)); - const sig0 = await EthSig2.signOffline(vnodes[0], vote); - const sig1 = await EthSig2.signOffline(vnodes[1], vote); - let tx = await valCt.connect(vnodes[0]).reportNode(NodeType.VNode, vote, [sig0, sig1]); + const vote = VoteDataV.encode(new VoteDataV(1, '0x2222', v2.address)); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + let tx = await valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); // await th.printEvents(tx); await expect(tx).to.emit(valCt, "NodeStatusChanged") - .withArgs(vnodes[2].address, NodeStatus.Slashed, BigNumber.from(90)); // 10% slash occured + .withArgs(v2.address, NodeStatus.Slashed, BigNumber.from(90)); // 10% slash occured - const ni2 = await valCt.getNodeInfo(vnodes[2].address); + const ni2 = await valCt.getNodeInfo(v2.address); assert.equal(ni2.nodeTokens.toNumber(), 90); assert.equal(ni2.status, NodeStatus.Slashed); assert.equal(ni2.counters.slashCounter, 1); @@ -461,12 +470,104 @@ describe("Validator - node reports on other node / vnro", function () { assert.deepEqual(ni2.counters.reportedBy, []); assert.deepEqual(ni2.counters.reportedKeys, []); - const ni0 = await valCt.getNodeInfo(vnodes[0].address); + const ni0 = await valCt.getNodeInfo(v0.address); assert.equal(ni0.nodeTokens.toNumber(), 105); - const ni1 = await valCt.getNodeInfo(vnodes[1].address); + const ni1 = await valCt.getNodeInfo(v1.address); assert.equal(ni1.nodeTokens.toNumber(), 105); } }); + + it("2v report on 1s - v-reports-on-s", async function () { + let nodeTokens = 100; + const v0 = vnodes[0]; + const v1 = vnodes[1]; + const s0 = snodes[0]; + + // register 3 validator nodes and 1 storage node + for (let i = 0; i < 3; i++) { + let t1 = await valCt.registerNodeAndStake(nodeTokens, NodeType.VNode, + `http://snode${i}:3000`, vnodes[i].address); + await th.confirmTransaction(t1); + } + { + let t1 = await valCt.registerNodeAndStake(nodeTokens, NodeType.SNode, + `http://snode${0}:3000`, snodes[0].address); + await th.confirmTransaction(t1); + const allShards = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31]; + const bitmask = await storeCt.getNodeShardsByAddr(s0.address); + assert.deepEqual(BitUtil.bitsToPositions(bitmask), allShards); + } + + // v0,v1 report on s0 ; v0 calls reportNode + { + const vote = VoteDataS.encode(new VoteDataS(2, '0x1111', s0.address, '0x9999')); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + // 1st report (works) + let tx1 = await valCt.connect(v0).reportNode(NodeType.SNode, vote, [sig0, sig1]); + + const ni = await valCt.getNodeInfo(s0.address); + assert.equal(ni.nodeTokens.toNumber(), 100); + assert.equal(ni.status, NodeStatus.Reported); + assert.equal(ni.counters.reportCounter, 1); + assert.equal(ni.counters.slashCounter, 0); + assert.deepEqual(ni.counters.reportedBy, [v0.address, v1.address]); + assert.deepEqual(ni.counters.reportedKeys, [BigNumber.from('0x9999')]); + + await expect(tx1).to.emit(valCt, "NodeStatusChanged") + .withArgs(s0.address, NodeStatus.Reported, BigNumber.from(100)); + + console.log('vote', vote); + console.log('signature ', sig1); + console.log('voter wallet is', vnode1.address); + + //duplicate report + + //same block id = reject + let tx2 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); + await th.expectRejct(tx2); + + //different block, same skey = reject + { + const vote = VoteDataS.encode(new VoteDataS(2, '0x2222', s0.address, '0x9999')); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + let tx3 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); + await th.expectRejct(tx3); + } + + //2nd report (2 reports lead to slash; both n0,n1 get +5 tokens) + { + const vote = VoteDataS.encode(new VoteDataS(2, '0x2222', s0.address, '0x7777')); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + let tx = await valCt.connect(v0).reportNode(NodeType.SNode, vote, [sig0, sig1]); + + await expect(tx).to.emit(valCt, "NodeStatusChanged") + .withArgs(s0.address, NodeStatus.Slashed, BigNumber.from(90)); // 10% slash occured + + const s0Info = await valCt.getNodeInfo(s0.address); + assert.equal(s0Info.nodeTokens.toNumber(), 90); + assert.equal(s0Info.status, NodeStatus.Slashed); + assert.equal(s0Info.counters.slashCounter, 1); + assert.equal(s0Info.counters.reportCounter, 0); + assert.deepEqual(s0Info.counters.reportedBy, []); + assert.deepEqual(s0Info.counters.reportedKeys, + [BigNumber.from('0x9999'), BigNumber.from('0x7777')]); + + const ni0 = await valCt.getNodeInfo(v0.address); + assert.equal(ni0.nodeTokens.toNumber(), 105); + + const ni1 = await valCt.getNodeInfo(v1.address); + assert.equal(ni1.nodeTokens.toNumber(), 105); + } + } + + }); + }); diff --git a/smart-contracts/test/ValidatorHelper.ts b/smart-contracts/test/ValidatorHelper.ts index 6c2f14d..4e51c9a 100644 --- a/smart-contracts/test/ValidatorHelper.ts +++ b/smart-contracts/test/ValidatorHelper.ts @@ -55,7 +55,7 @@ export enum NodeStatus { Unstaked } -export class VoteData { +export class VoteDataV { // the vote action, right now it is 1 cmd: number; // the block where vote should be placed @@ -70,9 +70,34 @@ export class VoteData { this.targetNode = targetNode; } - public static encode(vt: VoteData): string { + public static encode(vt: VoteDataV): string { let abi = ethers.utils.defaultAbiCoder; return abi.encode(["uint8", "uint128", "address", ], [1, vt.blockId, vt.targetNode]); } +} + +export class VoteDataS { + // the vote action, right now it is 1 + cmd: number; + // the block where vote should be placed + blockId: string; + // the node wallet, we do a complaint about + targetNode: string; + // storage key for k-v for storage node + skey:string; + + + constructor(cmd: number, blockId: string, targetNode: string, skey:string) { + this.cmd = cmd; + this.blockId = blockId; + this.targetNode = targetNode; + this.skey = skey; + } + + public static encode(vt: VoteDataS): string { + let abi = ethers.utils.defaultAbiCoder; + return abi.encode(["uint8", "uint128", "address", "uint128"], + [2, vt.blockId, vt.targetNode, vt.skey]); + } } \ No newline at end of file diff --git a/smart-contracts/test/uitlz/TestHelper.ts b/smart-contracts/test/uitlz/TestHelper.ts index 01f025d..7fbc818 100644 --- a/smart-contracts/test/uitlz/TestHelper.ts +++ b/smart-contracts/test/uitlz/TestHelper.ts @@ -27,8 +27,12 @@ export class TestHelper { // expectedVal = expectedVal.toString(); // } if (checkValues/*val != expectedVal*/) { - assert.deepEqual(val, expectedVal, - `assert failed: invalid field ${key} with value ${val}, expected ${expectedVal}`); + console.log('comparing', val, expectedVal); + if(val!=expectedVal) { + throw Error(`invalid field ${key} with value ${val}, expected ${expectedVal}`); + } + // assert.deepEqual(val, expectedVal, + // `assert failed: invalid field ${key} with value ${val}, expected ${expectedVal}`); return false; /*if (throwEx) { console.log(`${val.constructor.name} ${expectedVal.constructor.name}`) @@ -66,10 +70,19 @@ export class TestHelper { return TestHelper.expectEventEx(tx, "NodeStatusChanged", index, sample); } + static async expectRejct(tx: ContractTransaction | Promise) { + await expect(tx).to.be.rejected; + } + static async expectEventFirst(tx: ContractTransaction, sample: any) { return TestHelper.expectEventEx(tx, "NodeStatusChanged", 0, sample); } + static async printEvents(tx: ContractTransaction) { + const receipt = await tx.wait(); + console.log(receipt.events); + } + static async expectEventEx(tx: ContractTransaction, eventName: string, index: number, sample: any) { await TestHelper.confirmTransaction(tx); const receipt = await tx.wait(); @@ -77,7 +90,9 @@ export class TestHelper { for (let i = 0; i < fileteredEvents.length; i++) { console.log(`event[${i}] -> ${fileteredEvents[i].args}`); } - TestHelper.hasAllFields(fileteredEvents[index].args, sample, true, true); + const obj = fileteredEvents[index].args; + console.log(`trying to check object: ${JSON.stringify(obj)} vs sample: ${JSON.stringify(sample)}`); + TestHelper.hasAllFields(obj, sample, true, true); } } \ No newline at end of file diff --git a/snode/src/services/messaging-dset/queueClient.ts b/snode/src/services/messaging-dset/queueClient.ts index 93253cd..7443f52 100644 --- a/snode/src/services/messaging-dset/queueClient.ts +++ b/snode/src/services/messaging-dset/queueClient.ts @@ -70,7 +70,8 @@ export class QueueClient { try { appendSuccessful = await this.consumer.accept(item); } catch (e) { - this.log.error('error processing accept(): queue %s: ', this.queueName, e); + this.log.error('error processing accept(): queue %s: ', this.queueName); + this.log.error(e); } if (appendSuccessful) { endpointStats.newItems++ From 6fc7c84352f6a2414378abdd7aa42441cdcdb9d2 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 11 Dec 2023 18:43:43 +0700 Subject: [PATCH 72/84] add: redistributeStaked, unstakeFees --- smart-contracts/contracts/SigUtil.sol | 61 ++++++++ smart-contracts/contracts/Validator.sol | 131 +++++++++--------- smart-contracts/src/DeployerUtil.ts | 14 +- .../test/ValidatorContract.test.ts | 121 ++++++++++++++-- smart-contracts/test/uitlz/TestHelper.ts | 2 +- 5 files changed, 246 insertions(+), 83 deletions(-) create mode 100644 smart-contracts/contracts/SigUtil.sol diff --git a/smart-contracts/contracts/SigUtil.sol b/smart-contracts/contracts/SigUtil.sol new file mode 100644 index 0000000..5e26e2a --- /dev/null +++ b/smart-contracts/contracts/SigUtil.sol @@ -0,0 +1,61 @@ +//SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +// a lib that abstracts privKey signature and pubKey+signature checks +library SigUtil { + + function getMessageHash(bytes memory _message) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(_message)); + } + + function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { + /* + Signature is produced by signing a keccak256 hash with the following format: + "\x19Ethereum Signed Message\n" + len(msg) + msg + */ + return + keccak256( + abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) + ); + } + + function recoverSigner( + bytes32 _ethSignedMessageHash, + bytes memory _signature) internal pure returns (address) { + (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); + + return ecrecover(_ethSignedMessageHash, v, r, s); + } + + function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { + require(sig.length == 65, "invalid signature length"); + + assembly { + /* + First 32 bytes stores the length of the signature + + add(sig, 32) = pointer of sig + 32 + effectively, skips first 32 bytes of signature + + mload(p) loads next 32 bytes starting at the memory address p into memory + */ + + // first 32 bytes, after the length prefix + r := mload(add(sig, 32)) + // second 32 bytes + s := mload(add(sig, 64)) + // final byte (first byte of the next 32 bytes) + v := byte(0, mload(add(sig, 96))) + } + + // implicitly return (r, s, v) + } + + function recoverSignerEx(bytes memory _message, bytes memory _signature + ) external pure returns (address) { + bytes32 messageHash = getMessageHash(_message); + bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); + return recoverSigner(ethSignedMessageHash, _signature); + } + +} \ No newline at end of file diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index f537be7..e1aef63 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./Storage.sol"; +import "./SigUtil.sol"; import "hardhat/console.sol"; /* @@ -134,7 +135,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { event BlockParamsUpdated(uint16 valPerBlock, uint16 valPerBlockTarget); event RandomParamsUpdated(uint16 nodeRandomMinCount, uint16 nodeRandomPingCount); - // ----------------------------- TYPES -------------------------------------------------- struct NodeInfo { @@ -242,7 +242,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { minStakeD = 100; REPORTS_BEFORE_SLASH_V = REPORTS_BEFORE_SLASH_V_; REPORTS_BEFORE_SLASH_S = REPORTS_BEFORE_SLASH_S_; - SLASH_PERCENT = SLASH_PERCENT_; // todo FIX + SLASH_PERCENT = SLASH_PERCENT_; SLASHES_BEFORE_BAN_V = SLASHES_BEFORE_BAN_V_; SLASHES_BEFORE_BAN_S = SLASHES_BEFORE_BAN_S_; BAN_PERCENT = BAN_PERCENT_; @@ -274,6 +274,67 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { emit RandomParamsUpdated(nodeRandomMinCount_, nodeRandomPingCount_); } + +/* + an admin method to redistribute staked tokens manually between parties + no ERC20 transactions performed, we only set new token ownership + + redistributeStaked(0xAA, 0, 100) - staked tokens will move to the contract (unstaked) + redistributeStaked(0, 0xAA, 100) - unstaked tokens will move from the contract to some node as staked + redistributeStaked(0xAA,0xBB, 100) - staked tokens will move from 0xAA to 0xBB + */ + + function redistributeStaked(address from_, address to_, uint256 amount_) public onlyOwner returns (bool) { + require(amount_ > 0, 'amount should be positive'); + require(from_ != to_, 'cannot transfer between same addresses'); + if (to_ != address(0) && from_ == address(0)) { + // transfer contract tokens -> staked for a specific node + require(totalFees >= amount_, 'from node should have enough collateral'); + NodeInfo storage toNode_ = nodeMap[to_]; + require(toNode_.ownerWallet != address(0), 'missing to node'); + + totalFees -= amount_; + totalStaked += amount_; + toNode_.nodeTokens += amount_; + } else if (from_ != address(0) && to_ == address(0)) { + // transfer staked for a specific node -> contract tokens + NodeInfo storage fromNode_ = nodeMap[from_]; + require(fromNode_.ownerWallet != address(0), 'missing from node'); + require(fromNode_.nodeTokens >= amount_, 'from node should have enough collateral'); + + fromNode_.nodeTokens -= amount_; + totalStaked -= amount_; + totalFees += amount_; + } else { + // transfer staked for a specific node A -> specific node B + NodeInfo storage fromNode_ = nodeMap[from_]; + require(fromNode_.ownerWallet != address(0), 'missing from node'); + require(fromNode_.nodeTokens >= amount_, 'from node should have enough collateral'); + NodeInfo storage toNode_ = nodeMap[to_]; + require(fromNode_.ownerWallet != address(0), 'missing to node'); + + fromNode_.nodeTokens -= amount_; + toNode_.nodeTokens += amount_; + } + return true; + } + +/** + Unstakes IERC20 tokens from this contract (totalFees) + to any arbitrary address. + */ + + function unstakeFees(address to_, uint256 amount_) public onlyOwner returns (bool) { + require(to_ != address(0), 'invalid to address'); + require(amount_ > 0, 'invalid amount'); + require(amount_ <= totalFees && amount_ <= pushToken.balanceOf(address(this)), "insufficient balance"); + require(pushToken.transfer(to_, amount_), 'failed to transfer'); + totalFees -= amount_; + return true; + } + + + // ----------------------------- NODE PUBLIC FUNCTIONS -------------------------------------------------- /* @@ -357,7 +418,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { console.log('limit by target', valPerBlockTarget_); } require(valPerBlock <= valPerBlockTarget_); - if(valPerBlock_ != valPerBlock) { + if (valPerBlock_ != valPerBlock) { console.log('recalcualteAttestersCountPerBlock', valPerBlock_, valPerBlockTarget_); valPerBlock = valPerBlock_; emit BlockParamsUpdated(valPerBlock_, valPerBlockTarget_); @@ -600,7 +661,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return nodeMap[_nodeWallet]; } - /* A reporterNode reports on targetNode, targetNode can be V or S node newVoters_ - who voted (set) @@ -662,7 +722,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } - if(targetNode.status == NodeStatus.OK) { + if (targetNode.status == NodeStatus.OK) { targetNode.status = NodeStatus.Reported; } emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, voteAction_); // todo do we need this ? @@ -698,7 +758,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { delete targetNode.counters.reportedBy; - if(targetNode.status == NodeStatus.OK || targetNode.status == NodeStatus.Reported) { + if (targetNode.status == NodeStatus.OK || targetNode.status == NodeStatus.Reported) { targetNode.status = NodeStatus.Slashed; } targetNode.counters.reportCounter = 0; @@ -718,62 +778,3 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } - -// a lib that abstracts privKey signature and pubKey+signature checks -library SigUtil { - - function getMessageHash(bytes memory _message) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(_message)); - } - - function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { - /* - Signature is produced by signing a keccak256 hash with the following format: - "\x19Ethereum Signed Message\n" + len(msg) + msg - */ - return - keccak256( - abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) - ); - } - - function recoverSigner( - bytes32 _ethSignedMessageHash, - bytes memory _signature) internal pure returns (address) { - (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); - - return ecrecover(_ethSignedMessageHash, v, r, s); - } - - function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { - require(sig.length == 65, "invalid signature length"); - - assembly { - /* - First 32 bytes stores the length of the signature - - add(sig, 32) = pointer of sig + 32 - effectively, skips first 32 bytes of signature - - mload(p) loads next 32 bytes starting at the memory address p into memory - */ - - // first 32 bytes, after the length prefix - r := mload(add(sig, 32)) - // second 32 bytes - s := mload(add(sig, 64)) - // final byte (first byte of the next 32 bytes) - v := byte(0, mload(add(sig, 96))) - } - - // implicitly return (r, s, v) - } - - function recoverSignerEx(bytes memory _message, bytes memory _signature - ) internal pure returns (address) { - bytes32 messageHash = getMessageHash(_message); - bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); - return recoverSigner(ethSignedMessageHash, _signature); - } - -} \ No newline at end of file diff --git a/smart-contracts/src/DeployerUtil.ts b/smart-contracts/src/DeployerUtil.ts index adb2e80..1adeb10 100644 --- a/smart-contracts/src/DeployerUtil.ts +++ b/smart-contracts/src/DeployerUtil.ts @@ -16,8 +16,15 @@ export namespace DeployerUtil { } export async function deployValidatorContract(hre: HardhatRuntimeEnvironment, pushCt: string): Promise { + log('deploying SigUtil library'); + const suFactory = await hre.ethers.getContractFactory("SigUtil"); + const suLibrary = await suFactory.deploy(); + await suLibrary.deployed(); + log('deployed SigUtil at ', suLibrary.address) + log('deploying ValidatorV1'); - const validatorV1Factory = await hre.ethers.getContractFactory("ValidatorV1"); + const validatorV1Factory = await hre.ethers.getContractFactory("ValidatorV1", + {libraries: {SigUtil: suLibrary.address}}); const protocolVersion = 1; const valPerBlockTarget = 5; const nodeRandomMinCount = 1; @@ -33,7 +40,10 @@ export namespace DeployerUtil { [protocolVersion, pushCt, valPerBlockTarget, nodeRandomMinCount, nodeRandomPingCount, REPORTS_BEFORE_SLASH_V, REPORTS_BEFORE_SLASH_S, SLASHES_BEFORE_BAN_V, SLASHES_BEFORE_BAN_S, SLASH_PERCENT, BAN_PERCENT], - {kind: "uups"}); + { + kind: "uups", + unsafeAllowLinkedLibraries: true + }); await validatorV1Proxy.deployed(); log(`deployed proxy: ${validatorV1Proxy.address}`); diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index c62aec1..5ab6426 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -7,7 +7,7 @@ import {assert, expect} from "chai"; import hre, {ethers} from "hardhat"; import {PushToken, StorageV1, ValidatorV1} from "../typechain-types"; import {SignerWithAddress} from "@nomiclabs/hardhat-ethers/signers"; -import {TestHelper as th} from "./uitlz/TestHelper"; +import {TestHelper as TH} from "./uitlz/TestHelper"; import {EthSig2, NodeStatus, VoteDataS, VoteDataV} from "./ValidatorHelper"; import {BitUtil} from "./uitlz/bitUtil"; import {DeployerUtil, NodeType} from "../src/DeployerUtil"; @@ -227,7 +227,7 @@ describe("Storage", function () { { // remove node1 const t1 = await valCt.connect(acc1).unstakeNode(snode1.address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); const t2 = await valCt.connect(acc1).unstakeNode(snode1.address); // try unstake 2nd time expect(t2).to.be.reverted; const t3 = valCt.connect(acc2).unstakeNode(snode1.address); // try unstake: not a node owner @@ -236,7 +236,7 @@ describe("Storage", function () { { // remove node2 const t1 = await valCt.connect(acc2).unstakeNode(snode2.address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); const t2 = valCt.connect(acc2).unstakeNode(snode2.address); // try unstake 2nd time expect(t2).to.be.reverted; const t3 = valCt.connect(acc1).unstakeNode(snode2.address); // try unstake: not a node owner @@ -263,7 +263,7 @@ describe("Storage", function () { .connect(owner) .registerNodeAndStake(100, 0, "http://snode1:3000", vnode1.address); - await th.confirmTransaction(tx); + await TH.confirmTransaction(tx); let ownerBalanceAfter = await pushCt.balanceOf(owner.address); let valContractBalanceAfter = await pushCt.balanceOf(valCt.address); @@ -299,7 +299,7 @@ describe("Storage", function () { let tx = await valCt .connect(owner) .unstakeNode(vnode1.address); - await th.confirmTransaction(tx); + await TH.confirmTransaction(tx); let nodeInfo = await valCt.getNodeInfo(vnode1.address); expect(nodeInfo.status).to.be.equal(NodeStatus.Unstaked); @@ -365,7 +365,7 @@ describe("Validator - node reports on other node / vnro", function () { for (let i = 0; i < 6; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, `http://snode${i}:3000`, vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } assert.equal((await valCt.getSNodesLength()).toNumber(), 6); assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); @@ -373,7 +373,7 @@ describe("Validator - node reports on other node / vnro", function () { // unstake nodes for (let i = 0; i < 6; i++) { let t1 = await valCt.unstakeNode(vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } assert.equal((await valCt.getSNodesLength()).toNumber(), 0); assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 0); @@ -389,7 +389,7 @@ describe("Validator - node reports on other node / vnro", function () { for (let i = 0; i < 6; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, `http://snode${i}:3000`, vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } assert.equal((await valCt.getVNodesLength()).toNumber(), 6); assert.equal(await valCt.valPerBlock(), 5); // peaks at 5, even for 6 nodes @@ -398,7 +398,7 @@ describe("Validator - node reports on other node / vnro", function () { // unstake nodes for (let i = 0; i < 6; i++) { let t1 = await valCt.unstakeNode(vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } assert.equal((await valCt.getVNodesLength()).toNumber(), 0); assert.equal(await valCt.valPerBlock(), 0); @@ -419,7 +419,7 @@ describe("Validator - node reports on other node / vnro", function () { for (let i = 0; i < 3; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, `http://snode${i}:3000`, vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } { @@ -449,7 +449,7 @@ describe("Validator - node reports on other node / vnro", function () { //duplicate report //same block id = reject let tx2 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); - await th.expectRejct(tx2); + await TH.expectReject(tx2); } //2nd report (2 reports lead to slash; both n0,n1 get +5 tokens) @@ -489,12 +489,12 @@ describe("Validator - node reports on other node / vnro", function () { for (let i = 0; i < 3; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, NodeType.VNode, `http://snode${i}:3000`, vnodes[i].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); } { let t1 = await valCt.registerNodeAndStake(nodeTokens, NodeType.SNode, `http://snode${0}:3000`, snodes[0].address); - await th.confirmTransaction(t1); + await TH.confirmTransaction(t1); const allShards = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, @@ -530,7 +530,7 @@ describe("Validator - node reports on other node / vnro", function () { //same block id = reject let tx2 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); - await th.expectRejct(tx2); + await TH.expectReject(tx2); //different block, same skey = reject { @@ -538,7 +538,7 @@ describe("Validator - node reports on other node / vnro", function () { const sig0 = await EthSig2.signOffline(v0, vote); const sig1 = await EthSig2.signOffline(v1, vote); let tx3 = valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); - await th.expectRejct(tx3); + await TH.expectReject(tx3); } //2nd report (2 reports lead to slash; both n0,n1 get +5 tokens) @@ -571,3 +571,94 @@ describe("Validator - node reports on other node / vnro", function () { }); }); + + +describe("Validator - staked tokens management :: sttmgmnt", function () { + + beforeEach(beforeEachInit); + + it("test redistributeStaked", async function () { + const v0 = vnodes[0]; + const ZERO = '0x'+'00'.repeat(20); + let t1 = await valCt.registerNodeAndStake(100, NodeType.VNode, `http://vnode${0}:3000`, v0.address); + await TH.confirmTransaction(t1); + + const v1 = vnodes[1]; + let t2 = await valCt.registerNodeAndStake(100, NodeType.VNode, `http://vnode${0}:3000`, v1.address); + await TH.confirmTransaction(t2); + + // v0 -> v1 -------------- + assert.equal((await valCt.getNodeInfo(v0.address)).nodeTokens.toNumber(), 100); + assert.equal((await valCt.getNodeInfo(v1.address)).nodeTokens.toNumber(), 100); + assert.equal((await valCt.totalStaked()).toNumber(), 200); + assert.equal((await valCt.totalFees()).toNumber(), 0); + + await valCt.redistributeStaked(v0.address, v1.address, 50); + + assert.equal((await valCt.getNodeInfo(v0.address)).nodeTokens.toNumber(), 50); + assert.equal((await valCt.getNodeInfo(v1.address)).nodeTokens.toNumber(), 150); + assert.equal((await valCt.totalStaked()).toNumber(), 200); + assert.equal((await valCt.totalFees()).toNumber(), 0); + + // transfer fails if not enough node tokens ------------ + // another node + let t3 = valCt.redistributeStaked(v0.address, v1.address, 51); + await TH.expectReject(t3); + // to contract + let t4 = valCt.redistributeStaked(v0.address, ZERO, 51); + await TH.expectReject(t4); + + // v0 -> contract ------------ + assert.equal((await valCt.totalStaked()).toNumber(), 200); + assert.equal((await valCt.totalFees()).toNumber(), 0); + + await valCt.redistributeStaked(v0.address, ZERO, 50); + + assert.equal((await valCt.getNodeInfo(v0.address)).nodeTokens.toNumber(), 0); + assert.equal((await valCt.totalFees()).toNumber(), 50); + assert.equal((await valCt.totalStaked()).toNumber(), 150); + + // contract -> v1 ------------- + assert.equal((await valCt.totalFees()).toNumber(), 50); + assert.equal((await valCt.totalStaked()).toNumber(), 150); + + await valCt.redistributeStaked(ZERO, v1.address, 20); + + assert.equal((await valCt.getNodeInfo(v1.address)).nodeTokens.toNumber(), 170); + assert.equal((await valCt.totalFees()).toNumber(), 30); + assert.equal((await valCt.totalStaked()).toNumber(), 170); + }); + + it("test unstakeFees", async function () { + const v0 = vnodes[0]; + const ZERO = '0x'+'00'.repeat(20); + const DECIMALS = BigNumber.from('1000000000000000000'); + let t1 = await valCt.registerNodeAndStake(100, NodeType.VNode, `http://vnode${0}:3000`, v0.address); + await TH.confirmTransaction(t1); + + // v0 -> contract + await valCt.redistributeStaked(v0.address, ZERO, 40); + + // contract fees -> custom address + const accBalanceBefore = await pushCt.balanceOf(acc1.address); + console.log(accBalanceBefore); + assert.equal((await valCt.totalFees()).toNumber(), 40); + assert.equal((await valCt.totalStaked()).toNumber(), 60); + + await valCt.unstakeFees(acc1.address, 30); + + const accBalanceAfter = await pushCt.balanceOf(acc1.address); + console.log(accBalanceAfter); + assert.equal(accBalanceAfter.sub(accBalanceBefore).toNumber(), 30); + assert.equal((await valCt.totalFees()).toNumber(), 10); + assert.equal((await valCt.totalStaked()).toNumber(), 60); + + // no tokens = reject + let t2 = valCt.unstakeFees(acc1.address, 20); + await TH.expectReject(t2); + + // empty address = reject + let t3 = valCt.unstakeFees(ZERO, 20); + await TH.expectReject(t3); + }); +}); diff --git a/smart-contracts/test/uitlz/TestHelper.ts b/smart-contracts/test/uitlz/TestHelper.ts index 7fbc818..23e07b9 100644 --- a/smart-contracts/test/uitlz/TestHelper.ts +++ b/smart-contracts/test/uitlz/TestHelper.ts @@ -70,7 +70,7 @@ export class TestHelper { return TestHelper.expectEventEx(tx, "NodeStatusChanged", index, sample); } - static async expectRejct(tx: ContractTransaction | Promise) { + static async expectReject(tx: ContractTransaction | Promise) { await expect(tx).to.be.rejected; } From f843970cefa1c392086558feff329dd12556e46f Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 13 Dec 2023 15:08:00 +0700 Subject: [PATCH 73/84] add: comments --- smart-contracts/contracts/Validator.sol | 53 ++++++++++--------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index e1aef63..8f02a08 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -6,7 +6,6 @@ import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./Storage.sol"; import "./SigUtil.sol"; -import "hardhat/console.sol"; /* Validator smart contract @@ -54,8 +53,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* validator slashing params (effectively constant) report = bad behaviour, - we accept a VoteData sign by this amout of nodes: REPORT_THRESHOLD - we perform a slash after this amount of reports: REPORTS_BEFORE_SLASH + we accept a VoteData signed by this amout of nodes: REPORT_THRESHOLD_PER_BLOCK + we perform a slash after this amount of reports: REPORTS_BEFORE_SLASH_V|S + + A slash reward is distributed among all the nodes which submitted the reports. */ uint16 public REPORT_THRESHOLD_PER_BLOCK; // i.e. 66 = 66% = 2/3 uint16 public REPORTS_BEFORE_SLASH_V; @@ -64,8 +65,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* slash = reduces node collateral for SLASH_PERCENT % - after SLASH_BEFORE_BAN iterations, the node would get a ban + after SLASH_BEFORE_BAN_V|S iterations, the node would get a ban ban = reduces node collateral for BAN_PERCENT, node address is banned forever + + A ban reward is distributed to this contract. */ uint16 public SLASH_PERCENT; uint16 public SLASHES_BEFORE_BAN_V; @@ -123,8 +126,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint public totalStaked; // push tokens owned by this contract; - // comes from penalties from BAN only; - // while SLASH benefits the voters uint public totalFees; // ----------------------------- EVENTS -------------------------------------------------- @@ -138,14 +139,22 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- TYPES -------------------------------------------------- struct NodeInfo { + // the owner of the node; + // the one who provides PUSH tokens for the node staking + // also this address is used for unstake address ownerWallet; - address nodeWallet; // eth wallet + // node eth wallet, which is used mostly for private key signatures for node communication + address nodeWallet; + // node type; currently we support only 3 types (V,S,D) NodeType nodeType; + // 'staked' PUSH tokens for this node (18 digits) uint256 nodeTokens; - string nodeApiBaseUrl; // rest api url for invocation + // rest api url for invocation + string nodeApiBaseUrl; + // counters for report, slash, ban NodeCounters counters; // worst case status, at least 1 report or slash leads to status reported or slashed - // OK -> reported -> slashed -> banned + // lifecycle: OK -> reported -> slashed -> banned|unstaked NodeStatus status; } @@ -183,9 +192,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } enum VoteAction { - None, - ReportV, - ReportS + None, // 0 + ReportV, // 1 + ReportS // 2 } enum NodeType { @@ -252,6 +261,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { valPerBlock = 0; } + // DO NOT EDIT THIS FUNCTION; THIS MAY LEAD TO THE LOSS OF THE CONTRACT !!! function _authorizeUpgrade(address) internal override onlyOwner {} // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- @@ -345,7 +355,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { */ function registerNodeAndStake(uint256 nodeTokens_, NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { - console.log('--register', nodeWallet_); // pre-actions if (nodeType_ == NodeType.VNode) { require(nodeTokens_ >= minStakeV, "Insufficient collateral for VNODE"); @@ -370,7 +379,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(allowed >= nodeTokens_, "_nodeTokens cannot be transferred, check allowance"); } // new mapping - console.log('node owner is ', msg.sender); NodeInfo memory n; n.ownerWallet = msg.sender; n.nodeWallet = nodeWallet_; @@ -393,7 +401,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { StorageV1 s = StorageV1(storageContract); s.addNode(nodeWallet_); } - // MIN_NODES_FOR_REPORT = (uint32)(1 + (nodes.length / 2)); emit NodeAdded(msg.sender, nodeWallet_, nodeType_, nodeTokens_, nodeApiBaseUrl_); } @@ -410,16 +417,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } vnodesActive = activeValidators_; - console.log('activeValidators_', activeValidators_); uint16 valPerBlock_ = activeValidators_; uint16 valPerBlockTarget_ = valPerBlockTarget; if (valPerBlock_ > valPerBlockTarget_) { valPerBlock_ = valPerBlockTarget_; - console.log('limit by target', valPerBlockTarget_); } require(valPerBlock <= valPerBlockTarget_); if (valPerBlock_ != valPerBlock) { - console.log('recalcualteAttestersCountPerBlock', valPerBlock_, valPerBlockTarget_); valPerBlock = valPerBlock_; emit BlockParamsUpdated(valPerBlock_, valPerBlockTarget_); } @@ -434,7 +438,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { ACCESS: Any node owner can call this */ function unstakeNode(address nodeWallet_) public { - console.log('--unstake', nodeWallet_); NodeInfo storage node = nodeMap[nodeWallet_]; require(node.nodeWallet != address(0), "node does not exists"); require(node.ownerWallet == msg.sender || owner() == msg.sender, "only owner can unstake a node"); @@ -453,21 +456,17 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { */ // ACCESS: Any node can call this function reportNode(NodeType targetNodeType_, bytes memory voteBlob_, bytes[] memory signatures_) public { - console.log('reportNode()', voteBlob_.length); NodeInfo storage reporterNode_ = nodeMap[msg.sender]; if (reporterNode_.nodeWallet == address(0)) { revert('invalid reporter'); } - console.log('got signatures', signatures_.length); uint uniqVotersSize_ = 0; address[] memory uniqVoters_ = new address[](signatures_.length); for (uint i = 0; i < signatures_.length; i++) { address voterWallet = SigUtil.recoverSignerEx(voteBlob_, signatures_[i]); - console.log('voter wallet is', voterWallet); NodeInfo storage voterNode = nodeMap[voterWallet]; if (voterNode.nodeWallet == address(0)) { - console.log('invalid voter wallet'); continue; } // this is not very efficient, but there is no in-memory set support @@ -483,7 +482,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } uniqVoters_[uniqVotersSize_++] = voterWallet; } - console.log('sigcount=', uniqVotersSize_); // compactify if (uniqVotersSize_ < signatures_.length) { address[] memory tmp = new address[](uniqVotersSize_); @@ -674,8 +672,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint128 blockId_, uint128 storageKey_ ) private { - console.log('doReport'); - // check that we encounter this report X this block only for the first time uint128[] memory reportedInBlocks_ = targetNode.counters.reportedInBlocks; uint ribLen_ = reportedInBlocks_.length; @@ -695,14 +691,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } } targetNode.counters.reportedKeys.push(storageKey_); - console.log('targetNode added skey', storageKey_); } targetNode.counters.reportCounter++; targetNode.counters.reportedInBlocks.push(blockId_); - console.log('targetNode wallet', targetNode.nodeWallet); - console.log('targetNode added blockId', blockId_); // calculate new voters; they will collectively split payments on slash address[] memory reportedBy_ = targetNode.counters.reportedBy; @@ -730,7 +723,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function slash(NodeInfo storage reporterNode, NodeInfo storage targetNode) private { - console.log('doSlash'); // targetNode gets slashed by SLASH_PERCENT, this deducts delta_ tokens uint256 coll_; uint256 delta_; @@ -741,7 +733,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 reporterBonus_; if (delta_ > 0 && reportedBy_.length > 0) { reporterBonus_ = delta_ / reportedBy_.length; - console.log('reporter bonus=', reporterBonus_); require(reporterBonus_ >= 0, 'negative bonus'); for (uint i = 0; i < reportedBy_.length; i++) { NodeInfo storage ni = nodeMap[reportedBy_[i]]; From adc24188aa3c738cf61951637bda4e3af46832ef Mon Sep 17 00:00:00 2001 From: Igx22 Date: Wed, 13 Dec 2023 23:26:22 +0700 Subject: [PATCH 74/84] add: fixed ban logic --- smart-contracts/contracts/Validator.sol | 35 ++++++++++++------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 8f02a08..78bb744 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -627,26 +627,27 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* Returns unstaked amount */ - function _unstakeNode(NodeInfo storage targetNode_) private returns (uint256) { - uint256 delta = targetNode_.nodeTokens; - require(pushToken.transfer(targetNode_.ownerWallet, delta), "failed to trasfer funds back to owner"); - targetNode_.nodeTokens = 0; - totalStaked -= delta; - if (targetNode_.nodeType == NodeType.VNode) { - delete targetNode_.counters.reportedInBlocks; - delete targetNode_.counters.reportedBy; - findAndRemove(vnodes, targetNode_.nodeWallet); + function _unstakeNode(NodeInfo storage targetNode) private returns (uint256) { + uint256 delta_ = targetNode.nodeTokens; + require(pushToken.transfer(targetNode.ownerWallet, delta_), "failed to trasfer funds back to owner"); + targetNode.nodeTokens = 0; + totalStaked -= delta_; + totalFees += delta_; + if (targetNode.nodeType == NodeType.VNode) { + delete targetNode.counters.reportedInBlocks; + delete targetNode.counters.reportedBy; + findAndRemove(vnodes, targetNode.nodeWallet); recalcualteAttestersCountPerBlock(); // only after vnodes got shrinked - } else if (targetNode_.nodeType == NodeType.SNode) { + } else if (targetNode.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); - s.removeNode(targetNode_.nodeWallet); - delete targetNode_.counters.reportedInBlocks; - delete targetNode_.counters.reportedBy; - delete targetNode_.counters.reportedKeys; - findAndRemove(snodes, targetNode_.nodeWallet); + s.removeNode(targetNode.nodeWallet); + delete targetNode.counters.reportedInBlocks; + delete targetNode.counters.reportedBy; + delete targetNode.counters.reportedKeys; + findAndRemove(snodes, targetNode.nodeWallet); } - return delta; + return delta_; } function decodeVoteMessage(bytes memory data) private pure returns (VoteMessage memory) { @@ -761,8 +762,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 coll_; uint256 delta_; (coll_, delta_) = reduceCollateral(targetNode, BAN_PERCENT); - totalStaked -= delta_; - totalFees += delta_; _unstakeNode(targetNode); targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); From 2f8a157a07fcb3c7dbb78dfb31529f20e5a5066c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 19 Dec 2023 17:38:06 +0700 Subject: [PATCH 75/84] add: deleted unused method --- smart-contracts/contracts/Validator.sol | 6 ------ 1 file changed, 6 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 78bb744..a1431f3 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -650,12 +650,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { return delta_; } - function decodeVoteMessage(bytes memory data) private pure returns (VoteMessage memory) { - VoteMessage memory result; - (result.blockId, result.targetNode, result.voteAction) = abi.decode(data, (uint128, address, uint8)); - return result; - } - function getNodeInfo(address _nodeWallet) public view returns (NodeInfo memory) { return nodeMap[_nodeWallet]; } From 13a633cf4ca81a357321d0c42dd27f9dfde44dd5 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 25 Dec 2023 16:21:39 +0700 Subject: [PATCH 76/84] add: Validator.sol: getActiveVNodes() --- smart-contracts/contracts/Validator.sol | 31 +++++++++++- .../test/ValidatorContract.test.ts | 50 +++++++++++++++++-- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index a1431f3..4ae959d 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -183,6 +183,11 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint128[] reportedKeys; } + struct ActiveValidator { + address nodeWallet; + string nodeApiBaseUrl; + } + enum NodeStatus { OK, // this node operates just fine (DEFAULT VALUE) Reported, // he have a few malicious reports @@ -520,6 +525,29 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } + // returns only active validators, for SDK to select the right url to call + function getActiveVNodes() public view returns (ActiveValidator[] memory) { + uint activeValidators_ = 0; + for (uint i = 0; i < vnodes.length; i++) { + address nodeAddr_ = vnodes[i]; + NodeInfo storage nodeInfo = nodeMap[nodeAddr_]; + if (isActiveValidator(nodeInfo.status)) { + activeValidators_++; + } + } + ActiveValidator[] memory result = new ActiveValidator[](activeValidators_); + uint j = 0; + for (uint i = 0; i < vnodes.length; i++) { + address nodeAddr_ = vnodes[i]; + NodeInfo storage nodeInfo = nodeMap[nodeAddr_]; + if (!isActiveValidator(nodeInfo.status)) { + continue; + } + result[j++] = ActiveValidator(nodeInfo.nodeWallet, nodeInfo.nodeApiBaseUrl); + } + return result; + } + function getVNodesLength() public view returns (uint) { return vnodes.length; } @@ -714,7 +742,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { targetNode.status = NodeStatus.Reported; } emit NodeReported(targetNode.nodeWallet, reporterNode.nodeWallet, newVoters_, voteAction_); // todo do we need this ? - emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.Reported, targetNode.nodeTokens); + emit NodeStatusChanged(targetNode.nodeWallet, targetNode.status, targetNode.nodeTokens); } function slash(NodeInfo storage reporterNode, NodeInfo storage targetNode) private { @@ -757,6 +785,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 delta_; (coll_, delta_) = reduceCollateral(targetNode, BAN_PERCENT); _unstakeNode(targetNode); + targetNode.counters.slashCounter = 0; targetNode.status = NodeStatus.BannedAndUnstaked; emit NodeStatusChanged(targetNode.nodeWallet, NodeStatus.BannedAndUnstaked, 0); } diff --git a/smart-contracts/test/ValidatorContract.test.ts b/smart-contracts/test/ValidatorContract.test.ts index 5ab6426..84e7ef6 100644 --- a/smart-contracts/test/ValidatorContract.test.ts +++ b/smart-contracts/test/ValidatorContract.test.ts @@ -388,13 +388,14 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal(await valCt.valPerBlockTarget(), 5); for (let i = 0; i < 6; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, - `http://snode${i}:3000`, vnodes[i].address); + `http://vnode${i}:3000`, vnodes[i].address); await TH.confirmTransaction(t1); } assert.equal((await valCt.getVNodesLength()).toNumber(), 6); assert.equal(await valCt.valPerBlock(), 5); // peaks at 5, even for 6 nodes assert.equal(await valCt.valPerBlockTarget(), 5); assert.equal((await pushCt.balanceOf(valCt.address)).toNumber(), 6 * nodeTokens); + // unstake nodes for (let i = 0; i < 6; i++) { let t1 = await valCt.unstakeNode(vnodes[i].address); @@ -418,9 +419,17 @@ describe("Validator - node reports on other node / vnro", function () { assert.equal(await valCt.valPerBlockTarget(), 5); for (let i = 0; i < 3; i++) { let t1 = await valCt.registerNodeAndStake(nodeTokens, nodeType, - `http://snode${i}:3000`, vnodes[i].address); + `http://vnode${i}:3000`, vnodes[i].address); await TH.confirmTransaction(t1); } + // check that we have 3 active vnodes + const activeVNodesBeforeBan = await valCt.getActiveVNodes(); + assert.equal(3, activeVNodesBeforeBan.length); + assert.deepEqual([ + [vnodes[0].address, "http://vnode0:3000"], + [vnodes[1].address, "http://vnode1:3000"], + [vnodes[2].address, "http://vnode2:3000"] + ], activeVNodesBeforeBan); { // v0,v1 report on v2 ; v0 calls reportNode @@ -440,7 +449,7 @@ describe("Validator - node reports on other node / vnro", function () { assert.deepEqual(ni.counters.reportedKeys, []); await expect(tx1).to.emit(valCt, "NodeStatusChanged") - .withArgs(v2.address, NodeStatus.Reported, BigNumber.from(100)); // 1% slash occured + .withArgs(v2.address, NodeStatus.Reported, BigNumber.from(100)); console.log('vote', vote); console.log('signature ', sig1); @@ -476,6 +485,39 @@ describe("Validator - node reports on other node / vnro", function () { const ni1 = await valCt.getNodeInfo(v1.address); assert.equal(ni1.nodeTokens.toNumber(), 105); } + + console.log('3rd report') + { + const vote = VoteDataV.encode(new VoteDataV(1, '0x3333', v2.address)); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + let tx = await valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); + await expect(tx).to.emit(valCt, "NodeReported"); + await expect(tx).to.emit(valCt, "NodeStatusChanged") + .withArgs(v2.address, NodeStatus.Slashed, BigNumber.from(90)); + } + console.log('4th report (2nd slash -> ban)'); + { + const vote = VoteDataV.encode(new VoteDataV(1, '0x4444', v2.address)); + const sig0 = await EthSig2.signOffline(v0, vote); + const sig1 = await EthSig2.signOffline(v1, vote); + let tx = await valCt.connect(v0).reportNode(NodeType.VNode, vote, [sig0, sig1]); + const ni2 = await valCt.getNodeInfo(v2.address); + assert.equal(ni2.nodeTokens.toNumber(), 0); + assert.equal(ni2.status, NodeStatus.BannedAndUnstaked); + assert.equal(ni2.counters.slashCounter, 0); + assert.equal(ni2.counters.reportCounter, 0); + assert.deepEqual(ni2.counters.reportedBy, []); + assert.deepEqual(ni2.counters.reportedKeys, []); + } + + console.log('check that we have 2 active vnodes'); + const activeVNodesPostBan = await valCt.getActiveVNodes(); + assert.equal(2, activeVNodesPostBan.length); + assert.deepEqual([ + [vnodes[0].address, "http://vnode0:3000"], + [vnodes[1].address, "http://vnode1:3000"], + ], activeVNodesPostBan); }); @@ -508,7 +550,7 @@ describe("Validator - node reports on other node / vnro", function () { const vote = VoteDataS.encode(new VoteDataS(2, '0x1111', s0.address, '0x9999')); const sig0 = await EthSig2.signOffline(v0, vote); const sig1 = await EthSig2.signOffline(v1, vote); - // 1st report (works) + // 1st report let tx1 = await valCt.connect(v0).reportNode(NodeType.SNode, vote, [sig0, sig1]); const ni = await valCt.getNodeInfo(s0.address); From b879056fd74ced59817b1acd9e78e7b0dce6072c Mon Sep 17 00:00:00 2001 From: Igx22 Date: Sun, 31 Dec 2023 00:41:13 +0700 Subject: [PATCH 77/84] add: synced with new contract code --- smart-contracts/contracts/Storage.sol | 2 +- smart-contracts/contracts/Validator.sol | 26 +-- smart-contracts/package.json | 2 +- smart-contracts/tasks/deployTasks.ts | 1 + smart-contracts/tasks/registerTasks.ts | 109 ++++++----- .../validatorContractState.ts | 184 ++++++++++++------ 6 files changed, 199 insertions(+), 125 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index f2e783e..cf96ebd 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -114,7 +114,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { ) initializer public { // init libraries __UUPSUpgradeable_init(); - __Ownable_init(); + __Ownable_init_unchained(); unusedNodeId = 1; rf = 0; diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index 4ae959d..d0fb1f8 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -90,8 +90,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { 3 * 67 / 100 = 201 / 100 = 2 if we have at least 2 valid signatures out of 3 - that's a good block - attestersCountPerBlock would grow as more nodes join the network; - up to attestersTarget + valPerBlock would grow as more nodes join the network; + up to valPerBlockTarget */ uint16 public valPerBlock; @@ -115,11 +115,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // storage contract manages storage node state address public storageContract; - // node colleciton + // vnode colleciton; banned/unstaked nodes are removed address[] public vnodes; - uint16 public vnodesActive; + // vnode colleciton; banned/unstaked nodes are removed address[] public snodes; + // vnode colleciton; banned/unstaked nodes are removed address[] public dnodes; + // node details mapping(address => NodeInfo) public nodeMap; // push tokens owned by this contract; which have an owner @@ -244,7 +246,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { protocolVersion = protocolVersion_; require(pushToken_ != address(0)); pushToken = IERC20(pushToken_); - require(valPerBlockTarget_ > 0, "invalid attesters amount"); + require(valPerBlockTarget_ > 0, "invalid valPerBlockTarget_ amount"); valPerBlockTarget = valPerBlockTarget_; require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); nodeRandomMinCount = nodeRandomMinCount_; @@ -399,7 +401,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // post actions if (nodeType_ == NodeType.VNode) { - recalcualteAttestersCountPerBlock(); + recalcualteValPerBlock(); } else if (nodeType_ == NodeType.SNode) { // try to register this node for shard mappings require(storageContract != address(0), 'no storage contract defined'); @@ -410,9 +412,9 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } // raise the number of required signatures per block - // from 1 up to attestersTarget + // from 1 up to valPerBlockTarget // or down to 1 - function recalcualteAttestersCountPerBlock() private { + function recalcualteValPerBlock() private { uint16 activeValidators_ = 0; for (uint i = 0; i < vnodes.length; i++) { address nodeAddr_ = vnodes[i]; @@ -421,8 +423,10 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { activeValidators_++; } } - vnodesActive = activeValidators_; - uint16 valPerBlock_ = activeValidators_; + uint16 valPerBlock_ = activeValidators_ - 1; + if(valPerBlock_ < 0) { + valPerBlock_ = 0; + } uint16 valPerBlockTarget_ = valPerBlockTarget; if (valPerBlock_ > valPerBlockTarget_) { valPerBlock_ = valPerBlockTarget_; @@ -665,7 +669,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { delete targetNode.counters.reportedInBlocks; delete targetNode.counters.reportedBy; findAndRemove(vnodes, targetNode.nodeWallet); - recalcualteAttestersCountPerBlock(); // only after vnodes got shrinked + recalcualteValPerBlock(); // only after vnodes got shrinked } else if (targetNode.nodeType == NodeType.SNode) { require(storageContract != address(0), 'no storage contract defined'); StorageV1 s = StorageV1(storageContract); diff --git a/smart-contracts/package.json b/smart-contracts/package.json index b397bae..f0282bc 100644 --- a/smart-contracts/package.json +++ b/smart-contracts/package.json @@ -9,7 +9,7 @@ "@nomiclabs/hardhat-etherscan": "^3.1.5", "@openzeppelin/contracts": "^4.8.3", "@openzeppelin/contracts-upgradeable": "^4.8.3", - "@openzeppelin/hardhat-upgrades": "^1.22.1", + "@openzeppelin/hardhat-upgrades": "^1.28.0", "dotenv": "^16.0.3" } } diff --git a/smart-contracts/tasks/deployTasks.ts b/smart-contracts/tasks/deployTasks.ts index 515c529..2ae81d2 100644 --- a/smart-contracts/tasks/deployTasks.ts +++ b/smart-contracts/tasks/deployTasks.ts @@ -48,6 +48,7 @@ task("v:deployStorageCt", "deploys validatorCt and registers it into validator c .setAction(async (taskArgs, hre) => { const ethers = hre.ethers; const [owner] = await hre.ethers.getSigners(); + log(`owner is ${owner.address}`); const pushCt = taskArgs.pushCt; const valCtAddr: string = taskArgs.validatorContract; log('deploying storage contract') diff --git a/smart-contracts/tasks/registerTasks.ts b/smart-contracts/tasks/registerTasks.ts index 1fd6abd..25d672a 100644 --- a/smart-contracts/tasks/registerTasks.ts +++ b/smart-contracts/tasks/registerTasks.ts @@ -6,47 +6,47 @@ import {NodeType} from "../src/DeployerUtil"; let info = console.log; task("v:registerValidator", "adds a new validator node") - .addParam("validatorProxyCt", "validatorCt proxy address") - .addParam("pushCt", "push token contract") - .addPositionalParam("nodeAddress", "") - .addPositionalParam("nodeUrl", "") - .addPositionalParam("nodeAmount", "") - .setAction(async (args, hre) => { - const validatorProxyCt = args.validatorProxyCt; - info(`validatorProxyCt is ${validatorProxyCt}`); - const pushCt = args.pushCt; - info(`pushCt is ${pushCt}`); - const [nodeOwner] = await hre.ethers.getSigners(); - info(`nodeOwner is ${nodeOwner.address}`); + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeUrl", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); - const nodeAddress = args.nodeAddress; - const nodeUrl = args.nodeUrl; - const nodeAmount = args.nodeAmount; - info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 0); - info(`success`); - }); + const nodeAddress = args.nodeAddress; + const nodeUrl = args.nodeUrl; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 0); + info(`success`); + }); task("v:registerDelivery", "adds a new delivery node") - .addParam("validatorProxyCt", "validatorCt proxy address") - .addParam("pushCt", "push token contract") - .addPositionalParam("nodeAddress", "") - .addPositionalParam("nodeAmount", "") - .setAction(async (args, hre) => { - const validatorProxyCt = args.validatorProxyCt; - info(`validatorProxyCt is ${validatorProxyCt}`); - const pushCt = args.pushCt; - info(`pushCt is ${pushCt}`); - const [nodeOwner] = await hre.ethers.getSigners(); - info(`nodeOwner is ${nodeOwner.address}`); + .addParam("validatorProxyCt", "validatorCt proxy address") + .addParam("pushCt", "push token contract") + .addPositionalParam("nodeAddress", "") + .addPositionalParam("nodeAmount", "") + .setAction(async (args, hre) => { + const validatorProxyCt = args.validatorProxyCt; + info(`validatorProxyCt is ${validatorProxyCt}`); + const pushCt = args.pushCt; + info(`pushCt is ${pushCt}`); + const [nodeOwner] = await hre.ethers.getSigners(); + info(`nodeOwner is ${nodeOwner.address}`); - const nodeAddress = args.nodeAddress; - const nodeUrl = ''; - const nodeAmount = args.nodeAmount; - info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); - await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 2); - info(`success`); - }); + const nodeAddress = args.nodeAddress; + const nodeUrl = ''; + const nodeAmount = args.nodeAmount; + info(`nodeAddress=${nodeAddress}, nodeUrl=${nodeUrl}, nodeAmount=${nodeAmount}`); + await RegisterUtil.registerNode(hre, pushCt, validatorProxyCt, nodeOwner, nodeAddress, nodeAmount, nodeUrl, 2); + info(`success`); + }); task("v:registerStorage", "adds a new storage node") .addParam("validatorProxyCt", "validatorCt proxy address") @@ -72,25 +72,28 @@ task("v:registerStorage", "adds a new storage node") task("push:balanceOf", "prints account balance @ PUSH token") - .addParam("pushCt", "push token contract") - .addPositionalParam("address") - .setAction(async (args, hre) => { - await printBalance(hre, args.pushCt, args.address); - }); - + .addParam("pushCt", "push token contract") + .addPositionalParam("address") + .setAction(async (args, hre) => { + await printBalance(hre, args.pushCt, args.address); + }); task("v:listNodes", "shows validator nodes registered") - .addParam("validatorProxyCt", "validatorCt proxy address") - .setAction(async (args, hre) => { - const validator = await hre.ethers.getContractAt("ValidatorV1", args.validatorProxyCt); - info(`showing validator nodes registered in ${args.validatorProxyCt}`); - info(await validator.getNodes()); - }); + .addParam("validatorProxyCt", "validatorCt proxy address") + .setAction(async (args, hre) => { + const validator = await hre.ethers.getContractAt("ValidatorV1", args.validatorProxyCt); + info(`showing validator nodes registered in ${args.validatorProxyCt}`); + info(await validator.getVNodes()); + info(`showing storage nodes registered in ${args.validatorProxyCt}`); + info(await validator.getSNodes()); + info(`showing delivery nodes registered in ${args.validatorProxyCt}`); + info(await validator.getDNodes()); + }); -async function printBalance(hre: HardhatRuntimeEnvironment, pushCt:string, balanceAddr:string) { - const push = await hre.ethers.getContractAt("IERC20", pushCt); - info(`checking balance of ${balanceAddr} in IERC20 ${pushCt}`); - info(await push.balanceOf(balanceAddr)); +async function printBalance(hre: HardhatRuntimeEnvironment, pushCt: string, balanceAddr: string) { + const push = await hre.ethers.getContractAt("IERC20", pushCt); + info(`checking balance of ${balanceAddr} in IERC20 ${pushCt}`); + info(await push.balanceOf(balanceAddr)); } \ No newline at end of file diff --git a/snode/src/services/messaging-common/validatorContractState.ts b/snode/src/services/messaging-common/validatorContractState.ts index 2791d48..0a8f7e5 100644 --- a/snode/src/services/messaging-common/validatorContractState.ts +++ b/snode/src/services/messaging-common/validatorContractState.ts @@ -28,20 +28,20 @@ export class ValidatorContractState { this.contractFactory = new ContractClientFactory() this.contractCli = await this.contractFactory.buildRWClient(this.log) await this.contractCli.connect() - this.log.info('loaded %o ', this.contractCli.nodeMap) + // this.log.info('loaded %o ', this.contractCli.nodeMap) this.wallet = this.contractFactory.nodeWallet this.nodeId = this.wallet.address if (!this.wallet) throw new Error('wallet is not loaded') - if (this.contractCli.nodeMap == null) throw new Error('Nodes are not initialized') + if (this.contractCli.vnodes == null) throw new Error('Nodes are not initialized') } public isActiveValidator(nodeId: string): boolean { - const vi = this.contractCli.nodeMap.get(nodeId) + const vi = this.contractCli.vnodes.get(nodeId) return vi != null } public getAllNodesMap(): Map { - return this.contractCli.nodeMap + return this.contractCli.vnodes } public getActiveValidatorsExceptSelf(): NodeInfo[] { @@ -141,10 +141,20 @@ class ContractClientFactory { } interface ValidatorContract { - attestersRequired(): Promise + valPerBlock(): Promise + + valPerBlockTarget(): Promise + nodeRandomMinCount(): Promise + nodeRandomPingCount(): Promise - getNodes(): Promise + + getVNodes(): Promise + + getSNodes(): Promise + + getDNodes(): Promise + getNodeInfo(address: string): Promise } @@ -162,14 +172,25 @@ interface NodeInfo2 { type TypedValidatorContract = ValidatorContract & Contract // all Validator contract interactions are wrapped into this class +// todo update with new events export class ValidatorCtClient { contract: TypedValidatorContract private log: Logger - // contract state - nodeMap: Map = new Map() - public attestersRequired: number + // read on start, todo update on event + vnodes: Map = new Map() + // read on start, todo update on event + snodes: Map = new Map() + // read on start, todo update on event + dnodes: Map = new Map() + + // read on start, updated on change + public valPerBlock: number + // read on start, updated on change + private valPerBlockTarget: number + // read on start, updated on change public nodeRandomMinCount: number + // read on start, updated on change public nodeRandomPingCount: number constructor(contract: ethers.Contract, log: Logger) { @@ -177,61 +198,77 @@ export class ValidatorCtClient { this.log = log } - private async loadConstants() { - { - this.attestersRequired = await this.contract.attestersRequired() - this.log.info(`attestersRequired=${this.attestersRequired}`) - if (this.attestersRequired == null) { - throw new Error('attestersRequired is undefined') - } - this.contract.on('AttestersRequiredUpdated', (value: number) => { - this.attestersRequired = value - this.log.info(`attestersRequired=${this.attestersRequired}`) - }) + private async loadConstantsAndSubscribeToUpdates() { + this.valPerBlock = await this.contract.valPerBlock() + this.valPerBlockTarget = await this.contract.valPerBlockTarget() + this.log.info(`valPerBlock=${this.valPerBlock}`) + if (this.valPerBlock == null) { + throw new Error('valPerBlock is undefined') } - - { - this.nodeRandomMinCount = await this.contract.nodeRandomMinCount() - this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) - if (this.nodeRandomMinCount == null) { - throw new Error('nodeRandomMinCount is undefined') - } - this.contract.on('NodeRandomMinCountUpdated', (value: number) => { - this.nodeRandomMinCount = value - this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) - }) + this.contract.on('BlockParamsUpdated', (valPerBlock: number, valPerBlockTarget: number) => { + this.valPerBlock = valPerBlock + this.valPerBlockTarget = valPerBlockTarget + this.log.info(`attestersRequired=${this.valPerBlock}`) + }) + + this.nodeRandomMinCount = await this.contract.nodeRandomMinCount() + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) + if (this.nodeRandomMinCount == null) { + throw new Error('nodeRandomMinCount is undefined') } - { - this.nodeRandomPingCount = await this.contract.nodeRandomPingCount() - this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`) - if (this.nodeRandomPingCount == null) { - throw new Error('nodeRandomPingCount is undefined') + this.nodeRandomPingCount = await this.contract.nodeRandomPingCount() + this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`) + + this.contract.on( + 'RandomParamsUpdated', + (nodeRandomMinCount: number, nodeRandomPingCount: number) => { + this.nodeRandomMinCount = nodeRandomMinCount + this.nodeRandomPingCount = nodeRandomPingCount + this.log.info(`nodeRandomMinCount=${this.nodeRandomMinCount}`) } - this.contract.on('NodeRandomPingCountUpdated', (value: number) => { - this.nodeRandomPingCount = value - this.log.info(`nodeRandomPingCount=${this.nodeRandomPingCount}`) - }) - } + ) } - async connect() { - await this.loadConstants() - const result = this.loadNodesFromEnv() - if (result != null) { - // we have a debug variable set; no need to do blockchain - this.nodeMap = result - return + private async loadVSDNodesAndSubscribeToUpdates() { + const vNodes = await this.contract.getVNodes() + for (const nodeAddr of vNodes) { + const niFromCt = await this.contract.getNodeInfo(nodeAddr) + const ni = new NodeInfo( + niFromCt.nodeWallet, + niFromCt.nodeApiBaseUrl, + niFromCt.nodeType, + niFromCt.status + ) + this.vnodes.set(niFromCt.nodeWallet, ni) + } + this.log.info('validator nodes loaded %o', this.vnodes) + + const sNodes = await this.contract.getSNodes() + for (const nodeAddr of sNodes) { + const niFromCt = await this.contract.getNodeInfo(nodeAddr) + const ni = new NodeInfo( + niFromCt.nodeWallet, + niFromCt.nodeApiBaseUrl, + niFromCt.nodeType, + niFromCt.status + ) + this.snodes.set(niFromCt.nodeWallet, ni) } - const nodeAddresses = await this.contract.getNodes() - for (const nodeAddress of nodeAddresses) { - const ctObj = await this.contract.getNodeInfo(nodeAddress) - this.nodeMap.set( - ctObj.nodeWallet, - new NodeInfo(ctObj.nodeWallet, ctObj.nodeApiBaseUrl, ctObj.nodeType, NodeStatus.OK) + this.log.info('storage nodes loaded %o', this.snodes) + + const dNodes = await this.contract.getDNodes() + for (const nodeAddr of dNodes) { + const niFromCt = await this.contract.getNodeInfo(nodeAddr) + const ni = new NodeInfo( + niFromCt.nodeWallet, + niFromCt.nodeApiBaseUrl, + niFromCt.nodeType, + niFromCt.status ) + this.dnodes.set(niFromCt.nodeWallet, ni) } - this.log.info('contract nodes loaded %o', this.nodeMap) + this.log.info('delivery nodes loaded %o', this.dnodes) this.contract.on( 'NodeAdded', @@ -251,11 +288,15 @@ export class ValidatorCtClient { nodeTokens, nodeApiBaseUrl ) - this.nodeMap.set( + const nodeMapByType = this.getNodeMapByType(nodeType) + const ni = new NodeInfo(nodeWallet, nodeApiBaseUrl, nodeType, NodeStatus.OK) + nodeMapByType.set(nodeWallet, ni) + this.log.info( + 'NodeAdded: nodeType: %s , %s -> %s', + nodeType, nodeWallet, - new NodeInfo(nodeWallet, nodeApiBaseUrl, nodeType, NodeStatus.OK) + JSON.stringify(ni) ) - this.log.info('ValidatorMap: %o', this.nodeMap) } ) @@ -264,7 +305,8 @@ export class ValidatorCtClient { (nodeWallet: string, nodeStatus: number, nodeTokens: number) => { this.log.info('NodeStatusChanged', arguments) this.log.info('NodeStatusChanged', nodeWallet, nodeStatus, nodeTokens) - const ni = this.nodeMap.get(nodeWallet) + const ni = + this.vnodes.get(nodeWallet) ?? this.snodes.get(nodeWallet) ?? this.dnodes.get(nodeWallet) if (ni == null) { this.log.error(`unknown node ${nodeWallet}`) return @@ -274,6 +316,30 @@ export class ValidatorCtClient { ) } + private getNodeMapByType(nodeType: NodeType) { + const nodeMapByType: Map = null + if (nodeType == NodeType.VNode) { + return this.vnodes + } else if (nodeType == NodeType.SNode) { + return this.snodes + } else if (nodeType == NodeType.DNode) { + return this.dnodes + } else { + throw new Error('unsupported node type ' + nodeType) + } + } + + async connect() { + await this.loadConstantsAndSubscribeToUpdates() + const result = this.loadNodesFromEnv() + if (result != null) { + // we have a debug variable set; no need to do blockchain + this.vnodes = result + return + } + await this.loadVSDNodesAndSubscribeToUpdates() + } + private loadNodesFromEnv(): Map | null { const testValidatorsEnv = process.env.VALIDATOR_CONTRACT_TEST_VALIDATORS if (testValidatorsEnv) { From 2004f52a00ea84b5ac563526d567415fd3469adb Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 11 Jan 2024 20:24:18 +0700 Subject: [PATCH 78/84] fix: contract review (1) --- smart-contracts/contracts/Storage.sol | 1 + smart-contracts/contracts/Validator.sol | 51 +++++++++++++------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/smart-contracts/contracts/Storage.sol b/smart-contracts/contracts/Storage.sol index cf96ebd..7acab54 100644 --- a/smart-contracts/contracts/Storage.sol +++ b/smart-contracts/contracts/Storage.sol @@ -184,6 +184,7 @@ contract StorageV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function addNode(address nodeAddress_) public onlyV returns (uint8) { + require(nodeAddress_ != address(0), 'address is 0'); require(mapAddrToNodeId[nodeAddress_] == 0, 'address is already registered'); require(unusedNodeId > 0 && unusedNodeId < MAX_NODE_ID, 'nodeId > 0 && nodeId < max'); uint8 newNodeId; diff --git a/smart-contracts/contracts/Validator.sol b/smart-contracts/contracts/Validator.sol index d0fb1f8..ae4c392 100644 --- a/smart-contracts/contracts/Validator.sol +++ b/smart-contracts/contracts/Validator.sol @@ -244,13 +244,13 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { __Ownable_init_unchained(); // init state protocolVersion = protocolVersion_; - require(pushToken_ != address(0)); - pushToken = IERC20(pushToken_); + require(pushToken_ != address(0), "push token is empty"); require(valPerBlockTarget_ > 0, "invalid valPerBlockTarget_ amount"); - valPerBlockTarget = valPerBlockTarget_; require(nodeRandomMinCount_ > 0, "invalid nodeRandomMinCount amount"); - nodeRandomMinCount = nodeRandomMinCount_; require(nodeRandomPingCount_ > 0, "invalid nodeRandomFilterPingsRequired amount"); + pushToken = IERC20(pushToken_); + valPerBlockTarget = valPerBlockTarget_; + nodeRandomMinCount = nodeRandomMinCount_; nodeRandomPingCount = nodeRandomPingCount_; minStakeV = 100; @@ -274,6 +274,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // ----------------------------- ADMIN FUNCTIONS -------------------------------------------------- function setStorageContract(address addr_) public onlyOwner { + require(addr_ != address(0), 'empty addr'); storageContract = addr_; } @@ -284,8 +285,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } function updateRandomParams(uint16 nodeRandomMinCount_, uint16 nodeRandomPingCount_) public onlyOwner { - require(nodeRandomMinCount_ >= 0 && nodeRandomMinCount_ < vnodes.length); - require(nodeRandomPingCount_ >= 0 && nodeRandomPingCount_ < vnodes.length); + require(nodeRandomMinCount_ < vnodes.length, "bad nodeRandomMinCount"); + require(nodeRandomPingCount_ < vnodes.length, "bad nodeRandomPingCount_"); nodeRandomMinCount = nodeRandomMinCount_; nodeRandomPingCount = nodeRandomPingCount_; emit RandomParamsUpdated(nodeRandomMinCount_, nodeRandomPingCount_); @@ -328,7 +329,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(fromNode_.ownerWallet != address(0), 'missing from node'); require(fromNode_.nodeTokens >= amount_, 'from node should have enough collateral'); NodeInfo storage toNode_ = nodeMap[to_]; - require(fromNode_.ownerWallet != address(0), 'missing to node'); + require(toNode_.ownerWallet != address(0), 'missing to node'); fromNode_.nodeTokens -= amount_; toNode_.nodeTokens += amount_; @@ -356,12 +357,19 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { /* Registers a new V, S, D node - Locks PUSH tokens ($_token) with $_collateral amount. - A node will run from a _nodeWallet - ACCESS: Any node can call this + Locks PUSH tokens (nodeTokens_) with $_collateral amount. + A node will run from a nodeWallet_ + ACCESS: Anyone can call this (dApp frontend functiton) */ function registerNodeAndStake(uint256 nodeTokens_, NodeType nodeType_, string memory nodeApiBaseUrl_, address nodeWallet_) public { + if (nodeWallet_ == address(0)) { + revert("empty node address"); + } + NodeInfo storage old = nodeMap[nodeWallet_]; + if (old.ownerWallet != address(0)) { + revert("a node with pubKey is already defined"); + } // pre-actions if (nodeType_ == NodeType.VNode) { require(nodeTokens_ >= minStakeV, "Insufficient collateral for VNODE"); @@ -375,10 +383,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } else { revert("unsupported nodeType "); } - NodeInfo storage old = nodeMap[nodeWallet_]; - if (old.ownerWallet != address(0)) { - revert("a node with pubKey is already defined"); - } + // check that collateral is allowed to spend if (nodeTokens_ > 0) { @@ -416,17 +421,15 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // or down to 1 function recalcualteValPerBlock() private { uint16 activeValidators_ = 0; - for (uint i = 0; i < vnodes.length; i++) { + uint len = vnodes.length; + for (uint i = 0; i < len; i++) { address nodeAddr_ = vnodes[i]; NodeInfo storage nodeInfo_ = nodeMap[nodeAddr_]; if (isActiveValidator(nodeInfo_.status)) { activeValidators_++; } } - uint16 valPerBlock_ = activeValidators_ - 1; - if(valPerBlock_ < 0) { - valPerBlock_ = 0; - } + uint16 valPerBlock_ = activeValidators_; uint16 valPerBlockTarget_ = valPerBlockTarget; if (valPerBlock_ > valPerBlockTarget_) { valPerBlock_ = valPerBlockTarget_; @@ -532,7 +535,8 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { // returns only active validators, for SDK to select the right url to call function getActiveVNodes() public view returns (ActiveValidator[] memory) { uint activeValidators_ = 0; - for (uint i = 0; i < vnodes.length; i++) { + uint len_ = vnodes.length; + for (uint i = 0; i < len_; i++) { address nodeAddr_ = vnodes[i]; NodeInfo storage nodeInfo = nodeMap[nodeAddr_]; if (isActiveValidator(nodeInfo.status)) { @@ -541,7 +545,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } ActiveValidator[] memory result = new ActiveValidator[](activeValidators_); uint j = 0; - for (uint i = 0; i < vnodes.length; i++) { + for (uint i = 0; i < len_; i++) { address nodeAddr_ = vnodes[i]; NodeInfo storage nodeInfo = nodeMap[nodeAddr_]; if (!isActiveValidator(nodeInfo.status)) { @@ -632,7 +636,7 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { */ function reduceCollateral(NodeInfo storage slashedNode, uint32 percentage_ ) private returns (uint256 newAmount_, uint256 delta_) { - require(percentage_ >= 0 && percentage_ <= 100, "percentage should be in [0, 100]"); + require(percentage_ <= 100, "percentage should be in [0, 100]"); // reduce only nodeTokens; we do not transfer any tokens; it will affect only 'unstake' uint256 currentAmount_ = slashedNode.nodeTokens; newAmount_ = (currentAmount_ * (100 - percentage_)) / 100; @@ -664,7 +668,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { require(pushToken.transfer(targetNode.ownerWallet, delta_), "failed to trasfer funds back to owner"); targetNode.nodeTokens = 0; totalStaked -= delta_; - totalFees += delta_; if (targetNode.nodeType == NodeType.VNode) { delete targetNode.counters.reportedInBlocks; delete targetNode.counters.reportedBy; @@ -760,7 +763,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { uint256 reporterBonus_; if (delta_ > 0 && reportedBy_.length > 0) { reporterBonus_ = delta_ / reportedBy_.length; - require(reporterBonus_ >= 0, 'negative bonus'); for (uint i = 0; i < reportedBy_.length; i++) { NodeInfo storage ni = nodeMap[reportedBy_[i]]; if (ni.ownerWallet == address(0)) { @@ -768,7 +770,6 @@ contract ValidatorV1 is Ownable2StepUpgradeable, UUPSUpgradeable { } ni.nodeTokens += reporterBonus_; delta_ -= reporterBonus_; - require(delta_ >= 0, 'positive delta'); } } // reporter will get the remaing points (less that reporterBonus) From ee654d8695fa7e199b08853eb61e88a8e42395b2 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 8 Jul 2024 04:38:49 +0700 Subject: [PATCH 79/84] fix: ns/all api; docker scripts --- snode/Dockerfile | 23 +++---- snode/docker-compose-s01.yml | 87 +++++++++++++++++++++++++++ snode/docker-compose-s02.yml | 87 +++++++++++++++++++++++++++ snode/src/api/routes/storageRoutes.ts | 14 +++++ snode/src/helpers/dbHelper.ts | 75 ++++++++++++++++++++++- 5 files changed, 269 insertions(+), 17 deletions(-) create mode 100644 snode/docker-compose-s01.yml create mode 100644 snode/docker-compose-s02.yml diff --git a/snode/Dockerfile b/snode/Dockerfile index ba47d84..7c4b46f 100644 --- a/snode/Dockerfile +++ b/snode/Dockerfile @@ -1,16 +1,7 @@ -FROM node:latest -WORKDIR /usr/src/app -RUN mkdir dstorage-common -COPY ./dstorage-common ./dstorage-common -WORKDIR ./dstorage-common -RUN npm install -RUN npm run build -WORKDIR ../ -RUN mkdir snode -COPY snode/package*.json snode/.env ./snode/ -WORKDIR ./snode -RUN npm install -COPY ./snode . -RUN npm link ../dstorage-common -EXPOSE 4001 -CMD ["npm", "start"] \ No newline at end of file +FROM node:20 +WORKDIR /app +COPY . . +RUN yarn install +EXPOSE 3001 +EXPOSE 3002 +CMD ["yarn", "start"] \ No newline at end of file diff --git a/snode/docker-compose-s01.yml b/snode/docker-compose-s01.yml new file mode 100644 index 0000000..63e8183 --- /dev/null +++ b/snode/docker-compose-s01.yml @@ -0,0 +1,87 @@ +version: '3' +services: + redis-s01: + image: 'redis:latest' + container_name: redis-s01 + restart: always + networks: + - push-shared-network + volumes: + - ./external/redis-s01:/data + + mysql-s01: + image: mysql:5.7.13 + container_name: mysql-s01 + platform: linux/amd64 + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + MYSQL_ROOT_PASSWORD: 'pass' + MYSQL_DATABASE: snode1 + MYSQL_USER: 2roor + MYSQL_PASSWORD: s1mpl3 + # Change this to your local path + volumes: + - ./external/mysql-s01:/var/lib/mysql/ + networks: + - push-shared-network + + phpmyadmin-s01: + image: phpmyadmin/phpmyadmin + container_name: phpmyadmin-s01 + depends_on: + - mysql-s01 + environment: + PMA_HOST: mysql-s01 + PMA_PORT: 3306 + PMA_ARBITRARY: 1 + UPLOAD_LIMIT: 300M + ports: + - 8283:80 + restart: always + networks: + - push-shared-network + + ipfs-s01: + container_name: ipfs-s01 + image: ipfs/go-ipfs:latest + volumes: + - ./external/ipfs-s01:/data + networks: + - push-shared-network + + app-s01: + build: . + container_name: app-s01 + depends_on: + - mysql-s01 + - postgres-s01 + - redis-s01 + - ipfs-s01 + ports: + - 3001:3001 + environment: + - CONFIG_DIR=/app/config + - LOG_DIR=/app/config/log + volumes: + - /root/config/s01:/app/config + networks: + - push-shared-network + + postgres-s01: + container_name: postgres-s01 + image: postgres:15.1 + restart: always + environment: + - POSTGRES_DB=snode1 + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + networks: + - push-shared-network + volumes: + - ./external/postgresql-s01:/var/lib/postgresql/data +# - db:/var/lib/postgresql/data + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/snode/docker-compose-s02.yml b/snode/docker-compose-s02.yml new file mode 100644 index 0000000..5e4e647 --- /dev/null +++ b/snode/docker-compose-s02.yml @@ -0,0 +1,87 @@ +version: '3' +services: + redis-s02: + image: 'redis:latest' + container_name: redis-s02 + restart: always + networks: + - push-shared-network + volumes: + - ./external/redis-s02:/data + + mysql-s02: + image: mysql:5.7.13 + container_name: mysql-s02 + platform: linux/amd64 + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + MYSQL_ROOT_PASSWORD: 'pass' + MYSQL_DATABASE: snode2 + MYSQL_USER: 2roor + MYSQL_PASSWORD: s1mpl3 + # Change this to your local path + volumes: + - ./external/mysql-s02:/var/lib/mysql/ + networks: + - push-shared-network + + phpmyadmin-s02: + image: phpmyadmin/phpmyadmin + container_name: phpmyadmin-s02 + depends_on: + - mysql-s02 + environment: + PMA_HOST: mysql-s02 + PMA_PORT: 3306 + PMA_ARBITRARY: 1 + UPLOAD_LIMIT: 300M + ports: + - 8284:80 + restart: always + networks: + - push-shared-network + + ipfs-s02: + container_name: ipfs-s02 + image: ipfs/go-ipfs:latest + volumes: + - ./external/ipfs-s02:/data + networks: + - push-shared-network + + app-s02: + build: . + container_name: app-s02 + depends_on: + - mysql-s02 + - postgres-s02 + - redis-s02 + - ipfs-s02 + ports: + - 3002:3002 + environment: + - CONFIG_DIR=/app/config + - LOG_DIR=/app/config/log + volumes: + - /root/config/s02:/app/config + networks: + - push-shared-network + + postgres-s02: + container_name: postgres-s02 + image: postgres:15.1 + restart: always + environment: + - POSTGRES_DB=snode2 + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + networks: + - push-shared-network + volumes: + - ./external/postgresql-s02:/var/lib/postgresql/data +# - db:/var/lib/postgresql/data + +networks: + push-shared-network: + external: true \ No newline at end of file diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index 61e0b93..6b67025 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -183,4 +183,18 @@ export function storageRoutes(app: Router) { } } ); + + // prints all namespaces + route.post( + '/ns/all/', /* */ + async (req: Request, res: Response, next: NextFunction) => { + logRequest(req); + const allNsIndex = await DbHelper.listAllNsIndex(); + try { + return res.status(200).json(allNsIndex); + } catch (e) { + return next(e); + } + } + ); }; diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 826fd22..fa49a09 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -53,7 +53,65 @@ export default class DbHelper { table_name VARCHAR(64) NOT NULL, PRIMARY KEY (namespace, namespace_shard_id, ts_start, ts_end) ); - `) + `); + await PgUtil.update(` + + +-- allows itself to be called on every call +-- recreates a view, no more than once per day, which contains +-- a consistent ordered list of all namespaces (wallets) in the system +CREATE OR REPLACE FUNCTION update_storage_all_namespace_view() +RETURNS VOID AS $$ +DECLARE + table_rec RECORD; + combined_query TEXT := ''; + last_update_var DATE; +BEGIN + CREATE TABLE IF NOT EXISTS view_update_log ( + view_name TEXT PRIMARY KEY, + last_update DATE NOT NULL + ); + + INSERT INTO view_update_log (view_name, last_update) + VALUES ('storage_all_namespace_view', '2000-01-01') + ON CONFLICT (view_name) DO NOTHING; + + -- Retrieve the last update date from the log + SELECT last_update INTO last_update_var + FROM view_update_log + WHERE view_name = 'storage_all_namespace_view'; + + -- Check if the view has already been updated today + IF last_update_var = CURRENT_DATE THEN + RETURN; + END IF; + + -- Construct the combined query + FOR table_rec IN + SELECT tablename + FROM pg_tables + WHERE schemaname = 'public' + AND tablename LIKE 'storage_ns_%_d_%' + LOOP + IF combined_query <> '' THEN + combined_query := combined_query || ' UNION '; + END IF; + combined_query := combined_query || 'SELECT namespace_id FROM ' || table_rec.tablename; + END LOOP; + + -- Create or replace the view + EXECUTE 'CREATE OR REPLACE VIEW storage_all_namespace_view AS + SELECT DISTINCT namespace_id + FROM (' || combined_query || ') AS combined_query + ORDER BY namespace_id ASC'; + + -- Update the last update date in the log + UPDATE view_update_log + SET last_update = CURRENT_DATE + WHERE view_name = 'storage_all_namespace_view'; + +END $$ LANGUAGE plpgsql; + `) } // maps key -> 8bit space (0..255) @@ -299,6 +357,21 @@ export default class DbHelper { payload: rowObj.payload }; } + + static async listAllNsIndex() { + const updateViewIfNeeded = `select update_storage_all_namespace_view();`; + log.debug(updateViewIfNeeded); + await pgPool.any(updateViewIfNeeded); + const selectAll = `select namespace_id from storage_all_namespace_view;`; + log.debug(selectAll); + return pgPool.manyOrNone(selectAll).then(data => { + log.debug(data); + return Promise.resolve(data == null ? [] : data.map(item => item.namespace_id)); + }).catch(err => { + log.debug(err); + return Promise.reject(err); + }); + } } export class StorageRecord { From 36524e8be39ff2980b1f50d566cfd4dabd380047 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 8 Jul 2024 04:39:43 +0700 Subject: [PATCH 80/84] fix: sepolia --- smart-contracts/hardhat.config.ts | 10 +++------- smart-contracts/tasks/registerTasks.ts | 2 ++ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/smart-contracts/hardhat.config.ts b/smart-contracts/hardhat.config.ts index c1e10fc..fc13cc6 100644 --- a/smart-contracts/hardhat.config.ts +++ b/smart-contracts/hardhat.config.ts @@ -26,14 +26,10 @@ const config: HardhatUserConfig = { hardhat: { gas: 30000000 }, - polygon_mumbai: { - url: "https://rpc-mumbai.maticvigil.com", - accounts: [process.env.PRIVATE_KEY_POLYGON_TESTNET_MUMBAI] + sepolia : { + url: process.env.SEPOLIA_TEST_RPC_URL, + accounts: [process.env.SEPOLIA_TEST_PRIVATE_KEY] }, - goerli: { - url: `https://eth-goerli.alchemyapi.io/v2/${process.env.ALCHEMY_API_KEY}`, - accounts: [process.env.PRIVATE_KEY || ""] - } }, etherscan: { diff --git a/smart-contracts/tasks/registerTasks.ts b/smart-contracts/tasks/registerTasks.ts index 25d672a..d24bc39 100644 --- a/smart-contracts/tasks/registerTasks.ts +++ b/smart-contracts/tasks/registerTasks.ts @@ -89,6 +89,8 @@ task("v:listNodes", "shows validator nodes registered") info(await validator.getSNodes()); info(`showing delivery nodes registered in ${args.validatorProxyCt}`); info(await validator.getDNodes()); + info(`registered storage contract is`); + info(await validator.storageContract()) }); From 0e7619392cc5db15b3ebdc574125f3ec8c30b9d5 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 8 Jul 2024 22:28:52 +0700 Subject: [PATCH 81/84] fix: added cors, fixed error logs --- snode/package.json | 8 ++++---- snode/src/loaders/express.ts | 6 ++++++ snode/src/services/messaging-dset/queueServer.ts | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/snode/package.json b/snode/package.json index f621fdd..212907b 100755 --- a/snode/package.json +++ b/snode/package.json @@ -47,7 +47,7 @@ "chai": "^4.3.6", "chai-http": "^4.3.0", "chalk": "^4.1.2", - "cors": "^2.8.4", + "cors": "^2.8.5", "crypto-js": "4.0.0", "dotenv": "^8.2.0", "eccrypto": "^1.1.3", @@ -122,10 +122,10 @@ "nodemon": "^2.0.1", "prettier": "^1.17.0", "ts-jest": "^24.0.0", - "tsconfig-paths": "^4.0.0", - "typescript": "^4.5.4", "ts-node": "^10.4.0", + "ts-node-dev": "1.0.0-pre.44", + "tsconfig-paths": "^4.0.0", "tslint": "^5.11.0", - "ts-node-dev": "1.0.0-pre.44" + "typescript": "^4.5.4" } } diff --git a/snode/src/loaders/express.ts b/snode/src/loaders/express.ts index f9b642c..8a7b429 100755 --- a/snode/src/loaders/express.ts +++ b/snode/src/loaders/express.ts @@ -13,6 +13,11 @@ export default ({ app }: { app: express.Application }) => { res.status(200).end(); }); + // The magic package that prevents frontend developers going nuts + // Alternate description: + // Enable Cross Origin Resource Sharing to all origins by default + app.use(cors()); + app.use('/api', routes()); // Load Static Files @@ -46,4 +51,5 @@ export default ({ app }: { app: express.Application }) => { } }); }); + }; diff --git a/snode/src/services/messaging-dset/queueServer.ts b/snode/src/services/messaging-dset/queueServer.ts index a0c9214..3a5616b 100644 --- a/snode/src/services/messaging-dset/queueServer.ts +++ b/snode/src/services/messaging-dset/queueServer.ts @@ -84,7 +84,7 @@ export class QueueServer implements Consumer { const object = JSON.stringify(cmd) const objectHash = ObjectHasher.hashToSha256(cmd) const res = await MySqlUtil.insert( - `INSERT INTO dset_queue_${this.queueName}(object) + `INSERT INTO dset_queue_${this.queueName}(object, object_hash) VALUES (?,?)`, object, objectHash From fc0a47b815ff8426d99f0db21fbea5d1be1b30d5 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Mon, 8 Jul 2024 23:33:24 +0700 Subject: [PATCH 82/84] fix: added last_usage --- snode/src/helpers/dbHelper.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index fa49a09..7fd73a7 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -55,7 +55,6 @@ export default class DbHelper { ); `); await PgUtil.update(` - -- allows itself to be called on every call -- recreates a view, no more than once per day, which contains @@ -96,21 +95,22 @@ BEGIN IF combined_query <> '' THEN combined_query := combined_query || ' UNION '; END IF; - combined_query := combined_query || 'SELECT namespace_id FROM ' || table_rec.tablename; + combined_query := combined_query || 'SELECT namespace_id, max(ts) as last_ts FROM ' || table_rec.tablename || ' group by namespace_id'; END LOOP; -- Create or replace the view EXECUTE 'CREATE OR REPLACE VIEW storage_all_namespace_view AS - SELECT DISTINCT namespace_id + SELECT namespace_id, max(last_ts) as last_usage FROM (' || combined_query || ') AS combined_query - ORDER BY namespace_id ASC'; + GROUP BY namespace_id + ORDER BY last_usage desc'; -- Update the last update date in the log UPDATE view_update_log SET last_update = CURRENT_DATE WHERE view_name = 'storage_all_namespace_view'; -END $$ LANGUAGE plpgsql; +END $$ LANGUAGE plpgsql; `) } @@ -362,11 +362,16 @@ END $$ LANGUAGE plpgsql; const updateViewIfNeeded = `select update_storage_all_namespace_view();`; log.debug(updateViewIfNeeded); await pgPool.any(updateViewIfNeeded); - const selectAll = `select namespace_id from storage_all_namespace_view;`; + const selectAll = `select namespace_id, last_usage from storage_all_namespace_view;`; log.debug(selectAll); return pgPool.manyOrNone(selectAll).then(data => { log.debug(data); - return Promise.resolve(data == null ? [] : data.map(item => item.namespace_id)); + return Promise.resolve(data == null ? [] : data.map(function (item) { + return { + 'nsId': item.namespace_id, + 'last_usage' : item.last_usage + }; + })); }).catch(err => { log.debug(err); return Promise.reject(err); From 451e7d6edaa6158a70326a09927d557a4e968067 Mon Sep 17 00:00:00 2001 From: Igx22 Date: Tue, 9 Jul 2024 22:18:09 +0700 Subject: [PATCH 83/84] fix: PAGE_SIZE,CLIENT_READ_SCHEDULE env params --- snode/src/api/routes/storageRoutes.ts | 8 +++++--- snode/src/helpers/dbHelper.ts | 3 +-- snode/src/services/messaging/queueManager.ts | 3 ++- snode/src/utilz/envLoader.ts | 8 ++++++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index 6b67025..9d9a8b5 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -13,6 +13,9 @@ import StorageNode from "../../services/messaging/storageNode"; import {Coll} from "../../utilz/coll"; import {MessageBlockUtil} from "../../services/messaging-common/messageBlock"; import {StorageContractState} from "../../services/messaging-common/storageContractState"; +import {EnvLoader} from "../../utilz/envLoader"; + +const PAGE_SIZE = Number.parseInt(EnvLoader.getPropertyOrDefault("PAGE_SIZE", "30")); const route = Router(); const dbh = new DbHelper(); @@ -160,7 +163,7 @@ export function storageRoutes(app: Router) { const valContractState = Container.get(ValidatorContractState); const storageContractState = Container.get(StorageContractState); const nodeId = valContractState.nodeId; // todo read this from db - log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} nodeId=${nodeId}`); + log.debug(`nsName=${nsName} nsIndex=${nsIndex} dt=${dt} nodeId=${nodeId} PAGE_SIZE=${PAGE_SIZE}`); let shardId = MessageBlockUtil.calculateAffectedShard(nsIndex, storageContractState.shardCount); const date = DateTime.fromISO(dt, {zone: 'utc'}); if (!date.isValid) { @@ -173,8 +176,7 @@ export function storageRoutes(app: Router) { log.error('storage table not found'); return res.status(401).json('storage table not found'); } - - const storageValue = await DbHelper.listInbox(nsName, shardId, nsIndex, storageTable, firstTs); + const storageValue = await DbHelper.listInbox(nsName, shardId, nsIndex, storageTable, firstTs, PAGE_SIZE); log.debug(`found value: ${storageValue}`) try { return res.status(200).json(storageValue); diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 7fd73a7..162fa5e 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -276,8 +276,7 @@ END $$ LANGUAGE plpgsql; } static async listInbox(namespace: string, namespaceShardId: number, nsIndex:string, - storageTable: string, firstTsExcluded: string): Promise { - const pageSize = 5; + storageTable: string, firstTsExcluded: string, pageSize:number): Promise { const pageLookAhead = 3; const pageSizeForSameTimestamp = pageSize * 20; const isFirstQuery = StrUtil.isEmpty(firstTsExcluded); diff --git a/snode/src/services/messaging/queueManager.ts b/snode/src/services/messaging/queueManager.ts index 4150e58..58c8586 100644 --- a/snode/src/services/messaging/queueManager.ts +++ b/snode/src/services/messaging/queueManager.ts @@ -7,6 +7,7 @@ import {QueueServer} from '../messaging-dset/queueServer' import {QueueClient} from '../messaging-dset/queueClient' import StorageNode from "./storageNode"; import {QueueClientHelper} from "../messaging-common/queueClientHelper"; +import {EnvLoader} from "../../utilz/envLoader"; @Service() @@ -20,7 +21,7 @@ export class QueueManager { // PING: schedule - private readonly CLIENT_READ_SCHEDULE = '*/30 * * * * *' + private readonly CLIENT_READ_SCHEDULE = EnvLoader.getPropertyOrDefault('CLIENT_READ_SCHEDULE', '*/30 * * * * *'); public static QUEUE_MBLOCK = 'mblock' mblockQueue: QueueServer diff --git a/snode/src/utilz/envLoader.ts b/snode/src/utilz/envLoader.ts index 17d3112..eafdd9b 100644 --- a/snode/src/utilz/envLoader.ts +++ b/snode/src/utilz/envLoader.ts @@ -23,4 +23,12 @@ export class EnvLoader { const val = process.env[propName] return val != null && val.toLowerCase() === 'true' } + + public static getPropertyOrDefault(propName: string, def:string): string { + const val = process.env[propName] + if (StrUtil.isEmpty(val)) { + return def; + } + return val + } } From ec4016d021fffebf356620562a09e45357660b4b Mon Sep 17 00:00:00 2001 From: Igx22 Date: Thu, 11 Jul 2024 18:02:18 +0700 Subject: [PATCH 84/84] fix: NODE 16,logs fixed, proper pg escaping, proper env loading --- dstorage-common/src/util/envLoader.ts | 21 ----- snode/Dockerfile | 2 +- snode/src/api/routes/storageRoutes.ts | 4 +- snode/src/appInit.ts | 5 +- snode/src/config/index.ts | 12 --- snode/src/helpers/dbHelper.ts | 27 ++++-- snode/src/loaders/logger.ts | 87 ++----------------- snode/src/services/messaging/BlockStorage.ts | 2 +- snode/src/utilz/envLoader.ts | 11 ++- snode/src/utilz/pgUtil.ts | 3 + snode/src/utilz/winstonUtil.ts | 89 +++++++++----------- 11 files changed, 90 insertions(+), 173 deletions(-) delete mode 100644 dstorage-common/src/util/envLoader.ts diff --git a/dstorage-common/src/util/envLoader.ts b/dstorage-common/src/util/envLoader.ts deleted file mode 100644 index 0857314..0000000 --- a/dstorage-common/src/util/envLoader.ts +++ /dev/null @@ -1,21 +0,0 @@ -import dotenv from 'dotenv'; -import StrUtil from "./strUtil"; - -export default class EnvLoader { - - public static loadEnvOrFail() { - const envFound = dotenv.config(); - if (envFound.error) { - // This error should crash whole process - throw new Error("⚠️ Couldn't find .env file ⚠️"); - } - } - - public static getPropertyOrFail(propName:string):string { - let val = process.env[propName]; - if(StrUtil.isEmpty(val)) { - throw new Error(`process.env.${propName} is empty`); - } - return val; - } -} \ No newline at end of file diff --git a/snode/Dockerfile b/snode/Dockerfile index 7c4b46f..4fc57d9 100644 --- a/snode/Dockerfile +++ b/snode/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20 +FROM node:16.20.2 WORKDIR /app COPY . . RUN yarn install diff --git a/snode/src/api/routes/storageRoutes.ts b/snode/src/api/routes/storageRoutes.ts index 9d9a8b5..5d31dae 100755 --- a/snode/src/api/routes/storageRoutes.ts +++ b/snode/src/api/routes/storageRoutes.ts @@ -26,7 +26,6 @@ function logRequest(req: Request) { } // todo ValidatorContractState -// todo remove logic from router export function storageRoutes(app: Router) { app.use(bodyParser.json()); @@ -85,6 +84,8 @@ export function storageRoutes(app: Router) { } ); + + // todo move to StorageNode // todo not tested with new sharing (we don't use it anymore) route.post( @@ -200,3 +201,4 @@ export function storageRoutes(app: Router) { } ); }; +// todo remove logic from router diff --git a/snode/src/appInit.ts b/snode/src/appInit.ts index 55131bb..09a5a34 100755 --- a/snode/src/appInit.ts +++ b/snode/src/appInit.ts @@ -1,3 +1,6 @@ +import {EnvLoader} from "./utilz/envLoader"; +EnvLoader.loadEnvOrFail(); + import 'reflect-metadata'; // We need this in order to use @Decorators import express from 'express'; import chalk from 'chalk'; @@ -6,12 +9,12 @@ import StorageNode from "./services/messaging/storageNode"; import {ValidatorContractState} from "./services/messaging-common/validatorContractState"; import {MySqlUtil} from "./utilz/mySqlUtil"; + async function startServer(logLevel = null) { if (logLevel) { const changeLogLevel = (await require('./config/index')).changeLogLevel; changeLogLevel(logLevel); } - // Continue Loading normally const config = (await require('./config/index')).default; logLevel = logLevel || config.logs.level; diff --git a/snode/src/config/index.ts b/snode/src/config/index.ts index e298276..8e249af 100755 --- a/snode/src/config/index.ts +++ b/snode/src/config/index.ts @@ -1,19 +1,7 @@ -import dotenv from 'dotenv'; // import {logLevel} from '../app' // Set the NODE_ENV to 'development' by default process.env.NODE_ENV = process.env.NODE_ENV || 'development'; -// loads all .env variables into process.env.* variables -// Optional support for CONFIG_DIR variable -console.log(`config dir is ${process.env.CONFIG_DIR}`); -let options = {}; -if(process.env.CONFIG_DIR) { - options = {path: `${process.env.CONFIG_DIR}/.env`}; -} -const envFound = dotenv.config(options); -if (envFound.error) { - throw new Error("⚠️ Couldn't find .env file ⚠️") -} export const changeLogLevel = (level: string) => { if (level) { diff --git a/snode/src/helpers/dbHelper.ts b/snode/src/helpers/dbHelper.ts index 162fa5e..4621112 100755 --- a/snode/src/helpers/dbHelper.ts +++ b/snode/src/helpers/dbHelper.ts @@ -23,8 +23,12 @@ var mysqlPool = mysql.createPool({ }) MySqlUtil.init(mysqlPool); - +// postgres +// todo fix variable substitution, see #putValueInTable() // todo move everything into PgUtil including connection management +// todo use PgUtil +// todo use placeholders (?) + let logger = WinstonUtil.newLog('pg'); let options = { query: function (e) { @@ -38,8 +42,6 @@ const pg: pgPromise.IMain<{}, IClient> = pgPromise(options); export const pgPool = pg(`postgres://${EnvLoader.getPropertyOrFail('PG_USER')}:${EnvLoader.getPropertyOrFail('PG_PASS')}@${EnvLoader.getPropertyOrFail('PG_HOST')}:5432/${EnvLoader.getPropertyOrFail('PG_NAME')}`); PgUtil.init(pgPool); -// todo use PgUtil -// todo use placeholders (?) export default class DbHelper { public static async createStorageTablesIfNeeded() { @@ -261,12 +263,19 @@ END $$ LANGUAGE plpgsql; storageTable: string, ts: string, skey: string, body: string) { log.debug(`putValueInTable() namespace=${ns}, namespaceShardId=${shardId} ,storageTable=${storageTable}, skey=${skey}, jsonValue=${body}`); - const sql = `INSERT INTO ${storageTable} - (namespace, namespace_shard_id, namespace_id, ts, skey, dataschema, payload) - values ('${ns}', '${shardId}', '${nsIndex}', to_timestamp(${ts}),'${skey}', 'v1', '${body}') - ON CONFLICT (namespace,namespace_shard_id,namespace_id,skey) DO UPDATE SET payload = '${body}'` - log.debug(sql); - return pgPool.none(sql).then(data => { + const sql = `INSERT INTO ${storageTable} (namespace, namespace_shard_id, namespace_id, ts, skey, dataschema, payload) + values (\${ns}, \${shardId}, \${nsIndex}, to_timestamp(\${ts}), \${skey}, 'v1', \${body}) + ON CONFLICT (namespace, namespace_shard_id, namespace_id, skey) DO UPDATE SET payload = \${body}`; + const params = { + ns, + shardId, + nsIndex, + ts, + skey, + body + } + console.log(sql, params); + return pgPool.none(sql, params).then(data => { log.debug(data); return Promise.resolve(); }).catch(err => { diff --git a/snode/src/loaders/logger.ts b/snode/src/loaders/logger.ts index 4bf4fda..752b321 100755 --- a/snode/src/loaders/logger.ts +++ b/snode/src/loaders/logger.ts @@ -1,23 +1,7 @@ -import Transport from 'winston-transport'; import winston from 'winston'; - import config from '../config'; -const moment = require('moment'); // time library - -class DynamicLoggerTransport extends Transport { - private dynamicLogging: object = null; - private formatLogInfo: Function = null; - - constructor(opts, formatLogInfo) { - super(opts); - this.formatLogInfo = formatLogInfo; - } - - public setDynamicLoggerObject(object) { - this.dynamicLogging = object; - } +import {WinstonUtil} from "../utilz/winstonUtil"; -} const customLevels = { levels: { @@ -41,73 +25,20 @@ const customLevels = { } }; -var options = { - file: { - level: 'verbose', - filename: `${__dirname}/../../logs/app.log`, - handleExceptions: true, - json: true, - maxsize: 5242880, // 5MB - maxFiles: 5, - colorize: true - } -}; - -const parser = (param: any): string => { - if (!param) { - return ''; - } - if (typeof param === 'string') { - return param; - } - - return Object.keys(param).length ? JSON.stringify(param, undefined, 2) : ''; -}; - -const formatLogInfo = info => { - const { timestamp, level, message, meta } = info; - - const ts = moment(timestamp) - .local() - .format('HH:MM:ss'); - const metaMsg = meta ? `: ${parser(meta)}` : ''; - - return `${ts} ${level} ${parser(message)} ${metaMsg}`; -}; - -const formatter = winston.format.combine( - winston.format.errors({ stack: true }), - winston.format.splat(), - winston.format.printf(info => { - return formatLogInfo(info); - }), - winston.format.colorize({ - all: true - }) -); - let transports = []; - transports.push( - // Console should always be at 0 and dynamic log should always be at 2 - // remember and not change it as it's manually baked in hijackLogger - new winston.transports.Console({ - format: formatter - }), - new winston.transports.File(options.file) + // Console should always be at 0 and dynamic log should always be at 2 + // remember and not change it as it's manually baked in hijackLogger + WinstonUtil.consoleTransport, + WinstonUtil.debugFileTransport, + WinstonUtil.errorFileTransport, ); - +// WE SIMPLY REDIRECT ALL TO winstonUtil formatter x winstonUtil transports +// this instance is being used across the whole codebase const LoggerInstance = winston.createLogger({ level: config.logs.level, levels: customLevels.levels, - format: winston.format.combine( - winston.format.timestamp({ - format: 'YYYY-MM-DD HH:mm:ss', - }), - winston.format.errors({ stack: true }), - winston.format.splat(), - winston.format.json() - ), + format: WinstonUtil.createFormat2WhichRendersClassName(), transports }); diff --git a/snode/src/services/messaging/BlockStorage.ts b/snode/src/services/messaging/BlockStorage.ts index 5df72bf..4a36685 100644 --- a/snode/src/services/messaging/BlockStorage.ts +++ b/snode/src/services/messaging/BlockStorage.ts @@ -78,7 +78,7 @@ export class BlockStorage { null, calculatedHash); if (hashFromDb != null) { this.log.info('received block with hash %s, ' + - 'already exists in the storage at index %d, ignoring', + 'already exists in the storage at index %s, ignoring', calculatedHash, hashFromDb); return false; } diff --git a/snode/src/utilz/envLoader.ts b/snode/src/utilz/envLoader.ts index eafdd9b..939fa82 100644 --- a/snode/src/utilz/envLoader.ts +++ b/snode/src/utilz/envLoader.ts @@ -2,10 +2,17 @@ import dotenv from 'dotenv' import StrUtil from './strUtil' export class EnvLoader { + public static loadEnvOrFail() { - const envFound = dotenv.config() + // loads all .env variables into process.env.* variables + // Optional support for CONFIG_DIR variable + console.log(`config dir is ${process.env.CONFIG_DIR}`); + let options = {}; + if (process.env.CONFIG_DIR) { + options = {path: `${process.env.CONFIG_DIR}/.env`}; + } + const envFound = dotenv.config(options); if (envFound.error) { - // This error should crash whole process throw new Error("⚠️ Couldn't find .env file ⚠️") } } diff --git a/snode/src/utilz/pgUtil.ts b/snode/src/utilz/pgUtil.ts index 03ea7f2..eeab171 100644 --- a/snode/src/utilz/pgUtil.ts +++ b/snode/src/utilz/pgUtil.ts @@ -6,7 +6,10 @@ import StrUtil from "./strUtil"; import pg from "pg-promise/typescript/pg-subset"; import {IDatabase} from "pg-promise"; +// PG PROMISE https://github.com/vitaly-t/pg-promise +// NOTE: here are how named params are working in pg-async +// https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#named-parameters export class PgUtil { private static log: Logger = WinstonUtil.newLog('pg') static logSql = false diff --git a/snode/src/utilz/winstonUtil.ts b/snode/src/utilz/winstonUtil.ts index 5fcbeba..3850205 100644 --- a/snode/src/utilz/winstonUtil.ts +++ b/snode/src/utilz/winstonUtil.ts @@ -1,7 +1,6 @@ import {Format, TransformableInfo} from 'logform' import {DateTime} from 'ts-luxon' import winston from 'winston' -import {consoleTransport, jsonLogTransport} from '../loaders/logger' import StrUtil from './strUtil' import {EnvLoader} from './envLoader' @@ -52,10 +51,43 @@ format2 with class name: I 230811 174624 [MyClass] Got alias List (SendMessage) */ + + export class WinstonUtil { private static readonly CLASS_NAME_LENGTH = 23 + private static readonly LOG_DIR = EnvLoader.getPropertyOrFail('LOG_DIR'); + private static readonly LOG_LEVEL = EnvLoader.getPropertyOrFail('LOG_LEVEL'); + private static loggerMap: Map = new Map(); + + // all console writes drop here + public static consoleTransport = new winston.transports.Console({ + format: WinstonUtil.createFormat2WhichRendersClassName() + }); + + // add debug writes drop here + + public static debugFileTransport = new winston.transports.File({ + level: 'debug', + filename: `${WinstonUtil.LOG_DIR}/debug.log`, + handleExceptions: true, + maxsize: 5242880, + maxFiles: 5, + colorize: false, + tailable: true, + format: WinstonUtil.createFormat2WhichRendersClassName() + }) - static loggerMap: Map = new Map() + // all exceptions drop here + public static errorFileTransport = new winston.transports.File({ + level: 'error', + filename: `${WinstonUtil.LOG_DIR}/error.log`, + handleExceptions: true, + maxsize: 5242880, + maxFiles: 5, + colorize: false, + tailable: true, + format: WinstonUtil.createFormat2WhichRendersClassName() + }) /* { "message": "Checking Node Version", "level": "info", "timestamp": "230809 180338", className?: "myClass"} @@ -103,30 +135,6 @@ export class WinstonUtil { ) } - public static debugFileTransport = new winston.transports.File({ - level: 'debug', - filename: `${EnvLoader.getPropertyOrFail('LOG_DIR')}/debug.log`, - handleExceptions: true, - json: false, - maxsize: 5242880, - maxFiles: 5, - colorize: false, - tailable: true, - format: WinstonUtil.createFormat2WhichRendersClassName() - }) - - public static errorFileTransport = new winston.transports.File({ - level: 'error', - filename: `${EnvLoader.getPropertyOrFail('LOG_DIR')}/error.log`, - handleExceptions: true, - json: false, - maxsize: 5242880, - maxFiles: 5, - colorize: false, - tailable: true, - format: WinstonUtil.createFormat2WhichRendersClassName() - }) - public static newLog(classNameOrClass: string | { name: string }): winston.Logger { let loggerName = null if (typeof classNameOrClass === 'string') { @@ -140,28 +148,15 @@ export class WinstonUtil { if (loggerObj != null) { return loggerObj } - const logLevel = EnvLoader.getPropertyOrFail('LOG_LEVEL'); - const transports = []; - if (consoleTransport != null) { - transports.push(consoleTransport); - } else { - const console = new winston.transports.Console({ - format: WinstonUtil.createFormat2WhichRendersClassName() - }); - transports.push(console); - } - if (jsonLogTransport != null) { - transports.push(jsonLogTransport); - } - /*transports.push([ - this.debugFileTransport, // formats a class name from the log object - this.errorFileTransport // formats a class name from the log object - ]);*/ loggerObj = winston.createLogger({ - level: logLevel, - format: this.createFormat1WhichSetsClassName(loggerName), // puts a class name into the log object + formats in loaders/logger format - transports: transports - }) + level: WinstonUtil.LOG_LEVEL, + format: this.createFormat1WhichSetsClassName(loggerName), //winston.format.json(), + transports: [ + WinstonUtil.consoleTransport, + WinstonUtil.debugFileTransport, + WinstonUtil.errorFileTransport + ] + }); WinstonUtil.loggerMap.set(loggerName, loggerObj) return loggerObj }