From 0c7a8168428489614e3541bb923fa33c00fc6624 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 4 Apr 2022 10:24:45 -0700 Subject: [PATCH 01/32] fix(rate-limits): Adding artifical delay to anon requests --- package.json | 6 +++--- src/middleware/route-ratelimit.js | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 28991b6..c36395f 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,9 @@ "lint": "standard --env mocha --fix", "test-v4": "export NETWORK=mainnet && nyc --reporter=text mocha --exit --timeout 60000 test/v4/", "test-v5": "export NETWORK=mainnet && nyc --reporter=text mocha --exit --timeout 60000 test/v5/", - "test:integration": "mocha test/v4/integration", - "test:integration:slpdb": "mocha --timeout 25000 -g '#validate2Single' test/v4/integration/slp*.js", - "test:integration:nft": "mocha --timeout 25000 -g '#nft' test/v4/integration/nft.js", + "test:integration": "mocha test/v5/integration", + "test:integration:slpdb": "mocha --timeout 25000 -g '#validate2Single' test/v5/integration/slp*.js", + "test:integration:nft": "mocha --timeout 25000 -g '#nft' test/v5/integration/nft.js", "coverage": "nyc report --reporter=text-lcov | coveralls", "coverage:report": "export NETWORK=mainnet && nyc --reporter=html mocha --timeout 25000 test/v4/", "docs": "./node_modules/.bin/apidoc -i src/routes/v5 -o docs", diff --git a/src/middleware/route-ratelimit.js b/src/middleware/route-ratelimit.js index ee2f20c..8415917 100644 --- a/src/middleware/route-ratelimit.js +++ b/src/middleware/route-ratelimit.js @@ -213,6 +213,10 @@ class RateLimits { next() } + sleep (ms) { + return new Promise(resolve => setTimeout(resolve, ms)) + } + // A wrapper for Redis-based rate limiter. // Will return false if the user has not exceeded the rate limit. Otherwise // it will return the 'res' object with an error status and message, which @@ -267,6 +271,11 @@ class RateLimits { res.locals.pointsToConsume = pointsToConsume // Feedback for tests. + // Add artificial delay to slow down freeloaders. + if (pointsToConsume === ANON_LIMITS) { + await this.sleep(500) + } + // Signal that the user has not exceeded their rate limits. return false } catch (err) { From 9958821371f5a81c979140ef29d8029bd0ffe2b9 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 4 Apr 2022 10:51:28 -0700 Subject: [PATCH 02/32] fix(rate-limits): Adding delay to 422 response for anons too --- src/middleware/route-ratelimit.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/middleware/route-ratelimit.js b/src/middleware/route-ratelimit.js index 8415917..e9ddecf 100644 --- a/src/middleware/route-ratelimit.js +++ b/src/middleware/route-ratelimit.js @@ -33,6 +33,10 @@ const { RateLimiterRedis } = require('rate-limiter-flexible') const wlogger = require('../util/winston-logging') const config = require('../../config') +// The amount of delay in milliseconds to add to anonymous requests, in order +// to slow down freeloaders that are hitting the system too hard. +const ANON_DELAY = 1000 + let _this // Global pointer to instance of class, when 'this' context is lost. // Setup Redis to track rate limits for each user. @@ -273,7 +277,7 @@ class RateLimits { // Add artificial delay to slow down freeloaders. if (pointsToConsume === ANON_LIMITS) { - await this.sleep(500) + await this.sleep(ANON_DELAY) } // Signal that the user has not exceeded their rate limits. @@ -299,6 +303,11 @@ class RateLimits { } wlogger.info(logData) + // Add artificial delay to slow down freeloaders. + if (pointsToConsume === ANON_LIMITS) { + await this.sleep(ANON_DELAY) + } + // Rate limited was triggered res.status(429) // https://github.com/Bitcoin-com/rest.bitcoin.com/issues/330 return res.json({ From d3cf02122cf49db04ff24f72555f75d5ff791c10 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Fri, 8 Apr 2022 07:28:12 -0700 Subject: [PATCH 03/32] fix(rate-limits): Further slowing down anon freeloaders --- src/middleware/route-ratelimit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/route-ratelimit.js b/src/middleware/route-ratelimit.js index e9ddecf..0a834a6 100644 --- a/src/middleware/route-ratelimit.js +++ b/src/middleware/route-ratelimit.js @@ -35,7 +35,7 @@ const config = require('../../config') // The amount of delay in milliseconds to add to anonymous requests, in order // to slow down freeloaders that are hitting the system too hard. -const ANON_DELAY = 1000 +const ANON_DELAY = 3000 let _this // Global pointer to instance of class, when 'this' context is lost. From 56c52ab6edc744f689668fb4e1c8a9cbd80dcdbc Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Fri, 8 Apr 2022 07:35:46 -0700 Subject: [PATCH 04/32] Fixing unit tests --- test/v5/rate-limit-unit.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/v5/rate-limit-unit.js b/test/v5/rate-limit-unit.js index 2b3dd6d..4adbc6a 100644 --- a/test/v5/rate-limit-unit.js +++ b/test/v5/rate-limit-unit.js @@ -204,6 +204,9 @@ describe('#rate-routelimit', () => { describe('#trackRateLimits', () => { it('should apply anonymous rate limits if no JWT token is provided', async () => { + // Mock sleep function + sandbox.stub(uut, 'sleep').resolves() + req.ip = '127.0.0.1' const result = await uut.trackRateLimits(req, res) @@ -278,6 +281,9 @@ describe('#rate-routelimit', () => { }) it('should apply rate limits to anonymous users', async () => { + // Mock sleep function + sandbox.stub(uut, 'sleep').resolves() + req.ip = '123.456.7.8' // console.log('next.callCount: ', next.callCount) @@ -302,6 +308,9 @@ describe('#rate-routelimit', () => { }) it('should return 429 error when anonymous users exceed rate limit', async () => { + // Mock sleep function + sandbox.stub(uut, 'sleep').resolves() + req.ip = '123.456.7.8' // force req.locals.jwtToken to be empty. From a33661ddcf2a3238c2d28fac920660fdaddc463c Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 11 Apr 2022 17:01:50 -0700 Subject: [PATCH 05/32] fix(rate limits): Decreasing ANON rate limits from 20 to 10 RPM --- config/index.js | 2 +- test/v5/rate-limit-unit.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/index.js b/config/index.js index f026abc..9012c90 100644 --- a/config/index.js +++ b/config/index.js @@ -12,7 +12,7 @@ const config = { // Rate Limits anonRateLimit: process.env.ANON_RATE_LIMIT ? Number(process.env.ANON_RATE_LIMIT) - : 500, + : 1000, whitelistRateLimit: process.env.WHITELIST_RATE_LIMIT ? Number(process.env.WHITELIST_RATE_LIMIT) : 10, diff --git a/test/v5/rate-limit-unit.js b/test/v5/rate-limit-unit.js index 4adbc6a..ab9a0e6 100644 --- a/test/v5/rate-limit-unit.js +++ b/test/v5/rate-limit-unit.js @@ -326,7 +326,7 @@ describe('#rate-routelimit', () => { assert.property(val, 'error') assert.include( val.error, - 'Too many requests. Your limits are currently 20 requests per minute.' + 'Too many requests. Your limits are currently 10 requests per minute.' ) assert.equal(res.locals.rateLimitTriggered, true, 'Rate limits triggered') From dbc4e3e7310e0c1c21b6e9743afa1ac84e37bd07 Mon Sep 17 00:00:00 2001 From: Daniel Gonzalez Date: Fri, 15 Apr 2022 18:25:12 -0400 Subject: [PATCH 06/32] feat(endpoint): Added getTokenData() method to bch-api --- package-lock.json | 4 +- src/routes/v5/psf-slp-indexer.js | 171 +++++++++++++ test/v5/mocks/psf-slp-indexer-mocks.js | 43 +++- test/v5/psf-slp-indexer.js | 336 +++++++++++++++++++++++++ 4 files changed, 551 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 376097e..78c9689 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bch-api", - "version": "1.16.0", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bch-api", - "version": "1.16.0", + "version": "2.0.0", "license": "MIT", "dependencies": { "@psf/bch-js": "^4.20.7", diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 491a55f..a5067da 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -35,6 +35,7 @@ class PsfSlpIndexer { this.router.post('/address', this.getAddress) this.router.post('/txid', this.getTxid) this.router.post('/token', this.getTokenStats) + this.router.post('/token/data', this.getTokenData) _this = this } @@ -224,6 +225,176 @@ class PsfSlpIndexer { } } + async getTokenData (req, res, next) { + try { + // Verify env var is set for interacting with the indexer. + _this.checkEnvVar() + const tokenData = {} + + const tokenId = req.body.tokenId + if (!tokenId || tokenId === '') { + res.status(400) + return res.json({ + success: false, + error: 'tokenId can not be empty' + }) + } + + // get token stats + const withTxHistory = false + const response = await _this.axios.post( + `${_this.psfSlpIndexerApi}slp/token/`, + { tokenId, withTxHistory } + ) + // console.log('response', response.data) + + const tokenStats = response.data.tokenData + + tokenData.genesisData = tokenStats + // try to get immutable data + try { + const immutableData = await _this.getCIDData(tokenStats.documentUri) + tokenData.immutableData = immutableData + } catch (error) { + tokenData.immutableData = '' + } + + // try to get mutable data + try { + const mutableData = await _this.getMutableData(tokenStats.documentHash) + tokenData.mutableData = mutableData + } catch (error) { + tokenData.mutableData = '' + } + res.status(200) + return res.json(tokenData) + } catch (err) { + return _this.errorHandler(err, res) + } + } + + // Retrieves the mutable data associated with a token document hash. + async getMutableData (documentHash) { + try { + if (!documentHash || typeof documentHash !== 'string') { + throw new Error( + 'documentHash string required when calling mutableData().' + ) + } + + // Gets the OP_RETURN data and decodes it + const mutableData = await _this.decodeOpReturn(documentHash) + const jsonData = JSON.parse(mutableData) + + const mspAddress = jsonData.mspAddress + + // Gets the mspAddress transactions + const transactions = await _this.bchjs.Electrumx.transactions(mspAddress) + + const mspTxs = transactions.transactions + // console.log(`mspTxs: ${JSON.stringify(mspTxs, null, 2)}`) + + let data = false + // Maps each transaction of the mspAddress + // if finds an OP_RETURN decode is and closes the loop + // Start with the newest TXID entry and scan the history to find the first + // entry with an IPFS CID. + for (let i = mspTxs.length - 1; i > -1; i--) { + const tx = mspTxs[i] + const txid = tx.tx_hash + console.log(`Retrieving and decoding txid ${txid}`) + + data = await _this.decodeOpReturn(txid) + // console.log('data: ', data) + + // Try parse the OP_RETURN data to a JSON object. + if (data) { + try { + // console.log('Mutable Data : ', data) + + // Convert the OP_RETURN data to a JSON object. + const obj = JSON.parse(data) + console.log(`obj: ${JSON.stringify(obj, null, 2)}`) + + // Keep searching if this TX does not have a cid value. + if (!obj.cid) continue + + // TODO: Ensure data was generated by the MSP address and not an + // update from a different address. + + break + } catch (error) { + continue + } + } + } + if (!data) { + console.log('Mutable Data Not found ') + } + + // Get the CID: + const obj = JSON.parse(data) + const cid = obj.cid + if (!cid) { + throw new Error('CID could not be found in OP_RETURN data') + } + + const result = await _this.getCIDData(cid) + // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`) + + return result + } catch (err) { + console.log('Error in getMutableData().') + throw err + } + } + + // Decodes the OP_RETURN of a transaction if this exists + async decodeOpReturn (txid) { + try { + if (!txid || typeof txid !== 'string') { + throw new Error('txid must be a string.') + } + // get transaction data + const txData = await _this.bchjs.Electrumx.txData(txid) + let data = false + // Maps the vout of the transaction in search of an OP_RETURN + for (let i = 0; i < txData.details.vout.length; i++) { + const vout = txData.details.vout[i] + + const script = _this.bchjs.Script.toASM( + Buffer.from(vout.scriptPubKey.hex, 'hex') + ).split(' ') + + if (script[0] === 'OP_RETURN') { + data = Buffer.from(script[1], 'hex').toString('ascii') + break + } + } + return data + } catch (error) { + console.log('Error in decodeOpReturn().') + throw error + } + } + + async getCIDData (cid) { + try { + if (!cid || typeof cid !== 'string') { + throw new Error('cid must be a string.') + } + const dataUrl = `https://${cid}.ipfs.dweb.link/data.json` + + const response = await _this.axios.get(dataUrl) + // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`) + + return response.data + } catch (error) { + console.log('Error in getCIDData().') + throw error + } + } + // Check the the environment variable is set correctly. checkEnvVar () { _this.psfSlpIndexerApi = process.env.SLP_INDEXER_API diff --git a/test/v5/mocks/psf-slp-indexer-mocks.js b/test/v5/mocks/psf-slp-indexer-mocks.js index 76c830b..b5cd757 100644 --- a/test/v5/mocks/psf-slp-indexer-mocks.js +++ b/test/v5/mocks/psf-slp-indexer-mocks.js @@ -114,6 +114,30 @@ const balance = { ] } } +const transactions = { + success: true, + transactions: [ + { + height: 734439, + tx_hash: '0bd2a8a72108659cd39a59bde89c45fff7d51c334531f036b1e102ab4b62f33f' + }, + { + height: 734441, + tx_hash: '4f2837b7fff325c0442b550863de3470e016df234561d9151cbb6949fe43ac17' + }, + { + height: 735564, + tx_hash: '1bfa83355839c0ef0f974463415fa983466e0286d7bcdfdd825f244e357ad1e5' + }, + { + height: 735564, + tx_hash: '6eba09627175af4b50ac75fa8b3a15a9015df8a19b5b28a992f26044f4fd8891' + }, + { + height: 735564, + tx_hash: 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + }] +} const status = { status: { @@ -122,9 +146,26 @@ const status = { chainBlockHeight: 722679 } } +const immutableData = { + payloadCid: 'QmY3EaRaUcc5bNuqDfc7TaeNPThBGUefbqJeJVDjCqxqFZ', + about: 'This is a placeholder' +} +const mutableData = { + tokenIcon: 'https://gateway.ipfs.io/ipfs/bafybeiehitanirn5gmhqjg44xrmdtomn4n5lu5yjoepsvgpswk5mggaw6i/LP_logo-1.png', + about: 'Mutable data managed with npm package: https://www.npmjs.com/package/slp-mutable-data' +} + +const decodedOpReturn = JSON.stringify({ + mspAdddress: 'bitcoincash:qrg77j4jf2pl7azgvzrz2z567ls464gkuuhplt30dp', + cid: 'bafybeie6t5uyupddc7azms737xg4hxrj7i5t5ov3lb5g2qeehaujj6ak64' +}) module.exports = { tokenStats, txData, balance, - status + status, + transactions, + immutableData, + mutableData, + decodedOpReturn } diff --git a/test/v5/psf-slp-indexer.js b/test/v5/psf-slp-indexer.js index eca0d68..b2b2613 100644 --- a/test/v5/psf-slp-indexer.js +++ b/test/v5/psf-slp-indexer.js @@ -505,4 +505,340 @@ describe('#PsfSlpIndexer', () => { process.env.SLP_INDEXER_API = savedSlpIndexerUrl }) }) + describe('#getCIDData', () => { + it('should throw errors if cid is not provided', async () => { + try { + await uut.getCIDData() + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'cid must be a string.', + 'Error message expected' + ) + } + }) + it('should handle axios error', async () => { + try { + sandbox.stub(uut.axios, 'get').throws(new Error('test error')) + const cid = 'bafybeigp3bfmj6woms7pywb7s7r6npcdudvsabvzne2chyspxtdendrwmy' + await uut.getCIDData(cid) + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'test error', + 'Error message expected' + ) + } + }) + it('should return cid object data', async () => { + sandbox.stub(uut.axios, 'get').resolves({ data: mockData.immutableData }) + const cid = 'bafybeigp3bfmj6woms7pywb7s7r6npcdudvsabvzne2chyspxtdendrwmy' + const result = await uut.getCIDData(cid) + assert.isObject(result) + }) + }) + + describe('#decodeOpReturn', () => { + it('should throw errors if txid is not provided', async () => { + try { + await uut.decodeOpReturn() + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'txid must be a string.', + 'Error message expected' + ) + } + }) + it('should handle bchjs error', async () => { + try { + sandbox.stub(uut.bchjs.Electrumx, 'txData').throws(new Error('test error')) + const txid = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + await uut.decodeOpReturn(txid) + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'test error', + 'Error message expected' + ) + } + }) + it('should return data', async () => { + sandbox.stub(uut.bchjs.Electrumx, 'txData').resolves({ details: mockData.txData.txData }) + const txid = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + const result = await uut.decodeOpReturn(txid) + assert.isString(result) + }) + it('should return false if data is not found', async () => { + sandbox.stub(uut.bchjs.Electrumx, 'txData').resolves({ details: { vout: [] } }) + const txid = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + const result = await uut.decodeOpReturn(txid) + assert.isFalse(result) + }) + }) + describe('#getTokenData', async () => { + it('should throw 400 error if tokenId is missing', async () => { + const result = await uut.getTokenData(req, res) + // console.log(`result: ${util.inspect(result)}`) + + assert.hasAllKeys(result, ['error', 'success']) + assert.isFalse(result.success) + assert.include(result.error, 'tokenId can not be empty') + }) + + it('should throw 503 when network issues', async () => { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + + // Save the existing RPC URL. + const savedUrl2 = process.env.SLP_INDEXER_API + + // Manipulate the URL to cause a 500 network error. + process.env.SLP_INDEXER_API = 'http://fakeurl/api/' + + await uut.getTokenData(req, res) + // console.log(`result: ${util.inspect(result)}`) + + // Restore the saved URL. + process.env.SLP_INDEXER_API = savedUrl2 + + assert.isAbove( + res.statusCode, + 499, + 'HTTP status code 500 or greater expected.' + ) + // assert.include(result.error,"Network error: Could not communicate with full node","Error message expected") + }) + + it('returns proper error when downstream service stalls', async () => { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + + // Mock the timeout error. + sandbox.stub(uut.axios, 'post').throws({ code: 'ECONNABORTED' }) + + const result = await uut.getTokenData(req, res) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isAbove(res.statusCode, 499, 'HTTP status code 503 expected.') + assert.include( + result.error, + 'Could not communicate with full node', + 'Error message expected' + ) + }) + + it('returns proper error when downstream service is down', async () => { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + + // Mock the timeout error. + sandbox.stub(uut.axios, 'post').throws({ code: 'ECONNREFUSED' }) + + const result = await uut.getTokenData(req, res) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isAbove(res.statusCode, 499, 'HTTP status code 503 expected.') + assert.include( + result.error, + 'Could not communicate with full node', + 'Error message expected' + ) + }) + + it('should GET tokens data', async function () { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + // Mock the RPC call for unit tests. + if (process.env.TEST === 'unit') { + sandbox.stub(uut.axios, 'post').resolves({ data: mockData.tokenStats }) + sandbox.stub(uut, 'getCIDData').resolves(mockData.immutableData) + sandbox.stub(uut, 'getMutableData').resolves(mockData.mutableData) + } else { + return this.skip() + } + + const result = await uut.getTokenData(req, res) + assert.property(result, 'genesisData') + assert.property(result, 'immutableData') + assert.property(result, 'mutableData') + + assert.isObject(result.genesisData) + assert.isObject(result.immutableData) + assert.isObject(result.mutableData) + + const genesisData = result.genesisData + assert.property(genesisData, 'ticker') + assert.property(genesisData, 'name') + assert.property(genesisData, 'type') + assert.property(genesisData, 'tokenId') + assert.property(genesisData, 'documentUri') + assert.property(genesisData, 'documentHash') + assert.property(genesisData, 'decimals') + assert.property(genesisData, 'mintBatonIsActive') + assert.property(genesisData, 'tokensInCirculationBN') + assert.property(genesisData, 'tokensInCirculationStr') + assert.property(genesisData, 'blockCreated') + assert.property(genesisData, 'totalBurned') + assert.property(genesisData, 'totalMinted') + assert.property(genesisData, 'txs') + }) + it('should GET tokens data if immutableData data not found', async function () { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + // Mock the RPC call for unit tests. + if (process.env.TEST === 'unit') { + sandbox.stub(uut.axios, 'post').resolves({ data: mockData.tokenStats }) + sandbox.stub(uut, 'getCIDData').throws(new Error('test error')) + sandbox.stub(uut, 'getMutableData').resolves(mockData.mutableData) + } else { + return this.skip() + } + + const result = await uut.getTokenData(req, res) + assert.property(result, 'genesisData') + assert.property(result, 'immutableData') + assert.property(result, 'mutableData') + + assert.isObject(result.genesisData) + assert.isObject(result.mutableData) + assert.equal(result.immutableData, '') + + const genesisData = result.genesisData + assert.property(genesisData, 'ticker') + assert.property(genesisData, 'name') + assert.property(genesisData, 'type') + assert.property(genesisData, 'tokenId') + assert.property(genesisData, 'documentUri') + assert.property(genesisData, 'documentHash') + assert.property(genesisData, 'decimals') + assert.property(genesisData, 'mintBatonIsActive') + assert.property(genesisData, 'tokensInCirculationBN') + assert.property(genesisData, 'tokensInCirculationStr') + assert.property(genesisData, 'blockCreated') + assert.property(genesisData, 'totalBurned') + assert.property(genesisData, 'totalMinted') + assert.property(genesisData, 'txs') + }) + it('should GET tokens data if mutable data not found', async function () { + req.body.tokenId = + 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' + // Mock the RPC call for unit tests. + if (process.env.TEST === 'unit') { + sandbox.stub(uut.axios, 'post').resolves({ data: mockData.tokenStats }) + sandbox.stub(uut, 'getCIDData').resolves(mockData.immutableData) + sandbox.stub(uut, 'getMutableData').throws(new Error('test error')) + } else { + return this.skip() + } + + const result = await uut.getTokenData(req, res) + assert.property(result, 'genesisData') + assert.property(result, 'immutableData') + assert.property(result, 'mutableData') + + assert.isObject(result.genesisData) + assert.isObject(result.immutableData) + assert.equal(result.mutableData, '') + + const genesisData = result.genesisData + assert.property(genesisData, 'ticker') + assert.property(genesisData, 'name') + assert.property(genesisData, 'type') + assert.property(genesisData, 'tokenId') + assert.property(genesisData, 'documentUri') + assert.property(genesisData, 'documentHash') + assert.property(genesisData, 'decimals') + assert.property(genesisData, 'mintBatonIsActive') + assert.property(genesisData, 'tokensInCirculationBN') + assert.property(genesisData, 'tokensInCirculationStr') + assert.property(genesisData, 'blockCreated') + assert.property(genesisData, 'totalBurned') + assert.property(genesisData, 'totalMinted') + assert.property(genesisData, 'txs') + }) + }) + describe('#getMutableData', () => { + it('should throw errors if documentHash is not provided', async () => { + try { + await uut.getMutableData() + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'documentHash string required when calling mutableData().', + 'Error message expected' + ) + } + }) + it('should throw errors if cid is not provided in OP Return', async () => { + try { + sandbox.stub(uut, 'decodeOpReturn').resolves('{}') + sandbox.stub(uut.bchjs.Electrumx, 'transactions').resolves(mockData.transactions) + sandbox.stub(uut, 'getCIDData').resolves(mockData.mutableData) + + const documentHash = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + await uut.getMutableData(documentHash) + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'CID could not be found in OP_RETURN data', + 'Error message expected' + ) + } + }) + + it('should throw errors if data is not found', async () => { + try { + sandbox.stub(uut, 'decodeOpReturn').resolves(mockData.decodedOpReturn) + sandbox.stub(uut.bchjs.Electrumx, 'transactions').resolves({ transactions: [] }) + sandbox.stub(uut, 'getCIDData').resolves(mockData.mutableData) + + const documentHash = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + await uut.getMutableData(documentHash) + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'CID could not be found in OP_RETURN data', + 'Error message expected' + ) + } + }) + it('should handle bchjs error', async () => { + try { + sandbox.stub(uut, 'decodeOpReturn').resolves(mockData.decodedOpReturn) + sandbox.stub(uut.bchjs.Electrumx, 'transactions').throws(new Error('test error')) + + const documentHash = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + await uut.getMutableData(documentHash) + assert.fail('unexpected code path') + } catch (error) { + assert.include( + error.message, + 'test error', + 'Error message expected' + ) + } + }) + it('should return mutable data', async () => { + sandbox.stub(uut, 'decodeOpReturn') + .onFirstCall().resolves(mockData.decodedOpReturn) + .onSecondCall().resolves(JSON.parse(mockData.decodedOpReturn)) // data to force an error while parsing the JSON + .onThirdCall().resolves(mockData.decodedOpReturn) + + sandbox.stub(uut.bchjs.Electrumx, 'transactions').resolves(mockData.transactions) + sandbox.stub(uut, 'getCIDData').resolves(mockData.mutableData) + + const documentHash = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' + + const result = await uut.getMutableData(documentHash) + assert.isObject(result) + }) + }) }) From 9669d0b16a0aff09cb5f7d0afc40177c37414dee Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 17 Apr 2022 07:11:34 -0700 Subject: [PATCH 07/32] Minor edits --- src/routes/v5/psf-slp-indexer.js | 15 ++++++++++++--- test/v5/rate-limit-unit.js | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index a5067da..a450385 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -225,6 +225,8 @@ class PsfSlpIndexer { } } + // Get mutable and immutable data for a token, if the token was created with + // such data. async getTokenData (req, res, next) { try { // Verify env var is set for interacting with the indexer. @@ -240,7 +242,7 @@ class PsfSlpIndexer { }) } - // get token stats + // get token stats from the Genesis TX of the token. const withTxHistory = false const response = await _this.axios.post( `${_this.psfSlpIndexerApi}slp/token/`, @@ -251,6 +253,7 @@ class PsfSlpIndexer { const tokenStats = response.data.tokenData tokenData.genesisData = tokenStats + // try to get immutable data try { const immutableData = await _this.getCIDData(tokenStats.documentUri) @@ -266,6 +269,7 @@ class PsfSlpIndexer { } catch (error) { tokenData.mutableData = '' } + res.status(200) return res.json(tokenData) } catch (err) { @@ -282,13 +286,13 @@ class PsfSlpIndexer { ) } - // Gets the OP_RETURN data and decodes it + // Get the OP_RETURN data and decode it. const mutableData = await _this.decodeOpReturn(documentHash) const jsonData = JSON.parse(mutableData) const mspAddress = jsonData.mspAddress - // Gets the mspAddress transactions + // Gets the mutable data address (MDA) transaction history. const transactions = await _this.bchjs.Electrumx.transactions(mspAddress) const mspTxs = transactions.transactions @@ -355,9 +359,11 @@ class PsfSlpIndexer { if (!txid || typeof txid !== 'string') { throw new Error('txid must be a string.') } + // get transaction data const txData = await _this.bchjs.Electrumx.txData(txid) let data = false + // Maps the vout of the transaction in search of an OP_RETURN for (let i = 0; i < txData.details.vout.length; i++) { const vout = txData.details.vout[i] @@ -366,11 +372,13 @@ class PsfSlpIndexer { Buffer.from(vout.scriptPubKey.hex, 'hex') ).split(' ') + // Exit on the first OP_RETURN found. if (script[0] === 'OP_RETURN') { data = Buffer.from(script[1], 'hex').toString('ascii') break } } + return data } catch (error) { console.log('Error in decodeOpReturn().') @@ -378,6 +386,7 @@ class PsfSlpIndexer { } } + // Get the immutable data stored in the documentUrl field of the token. async getCIDData (cid) { try { if (!cid || typeof cid !== 'string') { diff --git a/test/v5/rate-limit-unit.js b/test/v5/rate-limit-unit.js index ab9a0e6..55a1298 100644 --- a/test/v5/rate-limit-unit.js +++ b/test/v5/rate-limit-unit.js @@ -326,7 +326,7 @@ describe('#rate-routelimit', () => { assert.property(val, 'error') assert.include( val.error, - 'Too many requests. Your limits are currently 10 requests per minute.' + 'Too many requests. Your limits are currently' ) assert.equal(res.locals.rateLimitTriggered, true, 'Rate limits triggered') From cc8a8e09472d0114014ee9e09ad94e829791eb5c Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 17 Apr 2022 07:58:33 -0700 Subject: [PATCH 08/32] Adding curl example --- src/routes/v5/psf-slp-indexer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index a450385..e990100 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -227,6 +227,9 @@ class PsfSlpIndexer { // Get mutable and immutable data for a token, if the token was created with // such data. + // + // Example: + // curl -H "Content-Type: application/json" -X POST -d '{ "tokenId": "afca62f07560b4c72c2ed6c9c3995315f964ccdfc37dded316d182640b42d88a" }' localhost:3000/v5/psf/slp/token/data async getTokenData (req, res, next) { try { // Verify env var is set for interacting with the indexer. From 302f3c6a0e0351490ebbff3b84565ad58a42fb2e Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 24 Apr 2022 17:41:59 -0700 Subject: [PATCH 09/32] fix(rate-limiting): Adding debugging for most used endpoint --- src/routes/v5/electrumx.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/v5/electrumx.js b/src/routes/v5/electrumx.js index 24ec61c..1e58d01 100644 --- a/src/routes/v5/electrumx.js +++ b/src/routes/v5/electrumx.js @@ -195,6 +195,8 @@ class Electrum { } } + console.log('req.locals: ', req.locals) + const response = await _this.axios.post( `${_this.fulcrumApi}electrumx/balance/`, { addresses } From 4dea95c63124212d2c2aee32a4f1a404ece1895e Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 24 Apr 2022 18:00:56 -0700 Subject: [PATCH 10/32] fix(electrumx): more debugging --- src/routes/v5/electrumx.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/v5/electrumx.js b/src/routes/v5/electrumx.js index 1e58d01..718effe 100644 --- a/src/routes/v5/electrumx.js +++ b/src/routes/v5/electrumx.js @@ -115,6 +115,8 @@ class Electrum { cashAddr ) + console.log('req.locals: ', req.locals) + const response = await _this.axios.get( `${_this.fulcrumApi}electrumx/balance/${address}` ) From 6c977a912e117b285149ae76de70ad534dc3e7cb Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 25 Apr 2022 15:22:49 -0700 Subject: [PATCH 11/32] fix(electrumx): Allowing POST balance to circumvent cache --- src/routes/v5/electrumx.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/routes/v5/electrumx.js b/src/routes/v5/electrumx.js index 718effe..e40f0ae 100644 --- a/src/routes/v5/electrumx.js +++ b/src/routes/v5/electrumx.js @@ -199,9 +199,16 @@ class Electrum { console.log('req.locals: ', req.locals) + // Use the cache for anonymous users. If the user has a valid JWT token + // or is using Basic Authentiation, then do not use the cache. + let useCache = true + if (req.locals.proLimit || req.locals.apiLevel > 10) { + useCache = false + } + const response = await _this.axios.post( `${_this.fulcrumApi}electrumx/balance/`, - { addresses } + { addresses, useCache } ) res.status(200) From 293213dc33f7cab4ac20fa6fd21cb73eb2aa7435 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 25 Apr 2022 15:31:24 -0700 Subject: [PATCH 12/32] fix(logs): Removing debugging screen spam --- src/routes/v5/electrumx.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/v5/electrumx.js b/src/routes/v5/electrumx.js index e40f0ae..2c4be45 100644 --- a/src/routes/v5/electrumx.js +++ b/src/routes/v5/electrumx.js @@ -115,7 +115,7 @@ class Electrum { cashAddr ) - console.log('req.locals: ', req.locals) + // console.log('req.locals: ', req.locals) const response = await _this.axios.get( `${_this.fulcrumApi}electrumx/balance/${address}` @@ -197,7 +197,7 @@ class Electrum { } } - console.log('req.locals: ', req.locals) + // console.log('req.locals: ', req.locals) // Use the cache for anonymous users. If the user has a valid JWT token // or is using Basic Authentiation, then do not use the cache. From 160366c17afd1795fa99af470a4068267c8e31ab Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 26 Apr 2022 08:35:36 -0700 Subject: [PATCH 13/32] fix(getTokenData): Updated to reflect changes in PS002 spec --- package-lock.json | 556 ++----------------------------- package.json | 2 +- src/routes/v5/psf-slp-indexer.js | 26 +- 3 files changed, 56 insertions(+), 528 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78c9689..f82e617 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@psf/bch-js": "^4.20.7", + "@psf/bch-js": "6.2.9", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", @@ -833,9 +833,9 @@ } }, "node_modules/@psf/bch-js": { - "version": "4.20.28", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-4.20.28.tgz", - "integrity": "sha512-tlWfYTUnmAzrFZDHTuP2CccE6fp20j4XcCIJiJYlpaKzxB0ilH8CEVWBQaMY+Fb+eaTrlSdiaDC5MBWV4klpQg==", + "version": "6.2.9", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.9.tgz", + "integrity": "sha512-7oj1+DqiSqOvl5Pn4PdLG+1hSptWqLHLEqen7UvkCL1KSR4qqVaI3m/j3SCHb6nWEZ4HceZalav2AM1LYHDEWg==", "license": "MIT", "dependencies": { "@chris.troutner/bip32-utils": "1.0.5", @@ -843,9 +843,7 @@ "@psf/bitcoincash-ops": "2.0.0", "@psf/bitcoincashjs-lib": "4.0.2", "@psf/coininfo": "4.0.0", - "@uppy/core": "1.10.4", - "@uppy/tus": "1.5.12", - "axios": "^0.21.4", + "axios": "0.26.1", "bc-bip68": "1.0.5", "bchaddrjs-slp": "0.2.5", "bigi": "1.4.2", @@ -866,6 +864,15 @@ "wif": "2.0.6" } }, + "node_modules/@psf/bch-js/node_modules/axios": { + "version": "0.26.1", + "resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, "node_modules/@psf/bch-js/node_modules/bignumber.js": { "version": "9.0.0", "resolved": "http://94.130.170.209:4873/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -1188,12 +1195,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/tus-js-client": { - "version": "1.8.0", - "resolved": "http://94.130.170.209:4873/@types%2ftus-js-client/-/tus-js-client-1.8.0.tgz", - "integrity": "sha512-lWxu5+6qfyfwsW99GzUeJ9y9JeOSSLduKxgYMvaYM7sGTDKZsrIIHTUbHI2P016xhXtu9NxmUM3GrB4i14ie4A==", - "license": "MIT" - }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "http://94.130.170.209:4873/@types%2fws/-/ws-7.4.7.tgz", @@ -1203,85 +1204,12 @@ "@types/node": "*" } }, - "node_modules/@uppy/companion-client": { - "version": "1.10.2", - "resolved": "http://94.130.170.209:4873/@uppy%2fcompanion-client/-/companion-client-1.10.2.tgz", - "integrity": "sha512-5RmsNF9UBvUqmqQz48SoiLvkpGmvQTgwNM4bJX8xwVozv/6goRpFrsMJGLwqFcHS/9xj6STKOqrM582g8exVwQ==", - "license": "MIT", - "dependencies": { - "@uppy/utils": "^3.6.2", - "namespace-emitter": "^2.0.1", - "qs-stringify": "^1.1.0", - "url-parse": "^1.4.7" - } - }, - "node_modules/@uppy/companion-client/node_modules/@uppy/utils": { - "version": "3.6.2", - "resolved": "http://94.130.170.209:4873/@uppy%2futils/-/utils-3.6.2.tgz", - "integrity": "sha512-wGTZma7eywIojfuE1vXlT0fxPSpmCRMkfgFWYc+6TL2FfGqWInmePoB+yal6/M2AnjeKHz6XYMhIpZkjOxFvcw==", - "license": "MIT", - "dependencies": { - "abortcontroller-polyfill": "^1.4.0", - "lodash.throttle": "^4.1.1" - } - }, - "node_modules/@uppy/core": { - "version": "1.10.4", - "resolved": "http://94.130.170.209:4873/@uppy%2fcore/-/core-1.10.4.tgz", - "integrity": "sha512-mORSXL4JyXHGo98u6u0sMzv3wtdI5jjHsqyThQAXx3LvctWE0EBrxE7vJqrXue2z/m9lovsZVhuzP2L7Qkuebg==", - "license": "MIT", - "dependencies": { - "@uppy/store-default": "^1.2.1", - "@uppy/utils": "^2.4.4", - "cuid": "^2.1.1", - "lodash.throttle": "^4.1.1", - "mime-match": "^1.0.2", - "namespace-emitter": "^2.0.1", - "preact": "8.2.9" - } - }, - "node_modules/@uppy/store-default": { - "version": "1.2.7", - "resolved": "http://94.130.170.209:4873/@uppy%2fstore-default/-/store-default-1.2.7.tgz", - "integrity": "sha512-58IG9yk/i/kYQ9uEwAwMFl1H2V3syOoODrYoFfVHlxaqv+9MkXBg2tHE2gk40iaAIxcCErcPxZkBOvkqzO1SQA==", - "license": "MIT" - }, - "node_modules/@uppy/tus": { - "version": "1.5.12", - "resolved": "http://94.130.170.209:4873/@uppy%2ftus/-/tus-1.5.12.tgz", - "integrity": "sha512-jDiwsTRHnMfb83ZB8JdDD0uA9DX0K/FqenGMYBGTOlkCjAcXD3sI59DzEHwq2TtY3ZH7iaL3fTNQ7ExBWkwrqw==", - "license": "MIT", - "dependencies": { - "@types/tus-js-client": "^1.8.0", - "@uppy/companion-client": "^1.4.4", - "@uppy/utils": "^2.4.4", - "tus-js-client": "^1.8.0" - }, - "peerDependencies": { - "@uppy/core": "^1.0.0" - } - }, - "node_modules/@uppy/utils": { - "version": "2.4.4", - "resolved": "http://94.130.170.209:4873/@uppy%2futils/-/utils-2.4.4.tgz", - "integrity": "sha512-7A0uwK5Rf8XcKqlpNUZ5L5LmkHT5c0/UWjDJGwmzeCxp2lECgzsMC+4vgA6kT4sFzPFbLtUtxHi7ecFwow3NQQ==", - "license": "MIT", - "dependencies": { - "lodash.throttle": "^4.1.1" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "http://94.130.170.209:4873/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "http://94.130.170.209:4873/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", - "license": "MIT" - }, "node_modules/accepts": { "version": "1.3.7", "resolved": "http://94.130.170.209:4873/accepts/-/accepts-1.3.7.tgz", @@ -2792,25 +2720,6 @@ "text-hex": "1.0.x" } }, - "node_modules/combine-errors": { - "version": "3.0.3", - "resolved": "http://94.130.170.209:4873/combine-errors/-/combine-errors-3.0.3.tgz", - "integrity": "sha1-9N9nQAg+VwOjGBEQwrEFUfAD2oY=", - "dependencies": { - "custom-error-instance": "2.1.1", - "lodash.uniqby": "4.5.0" - } - }, - "node_modules/combine-errors/node_modules/lodash.uniqby": { - "version": "4.5.0", - "resolved": "http://94.130.170.209:4873/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", - "integrity": "sha1-o6F7v2LutiQPSRhG6XwcTipeHiE=", - "license": "MIT", - "dependencies": { - "lodash._baseiteratee": "~4.7.0", - "lodash._baseuniq": "~4.6.0" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "http://94.130.170.209:4873/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3182,18 +3091,6 @@ "node": ">=8" } }, - "node_modules/cuid": { - "version": "2.1.8", - "resolved": "http://94.130.170.209:4873/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "license": "MIT" - }, - "node_modules/custom-error-instance": { - "version": "2.1.1", - "resolved": "http://94.130.170.209:4873/custom-error-instance/-/custom-error-instance-2.1.1.tgz", - "integrity": "sha1-PPY5FIemYppiR+sMoM4ACBt+Nho=", - "license": "ISC" - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "http://94.130.170.209:4873/dashdash/-/dashdash-1.14.1.tgz", @@ -4624,6 +4521,7 @@ "version": "3.0.2", "resolved": "http://94.130.170.209:4873/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, "license": "MIT" }, "node_modules/extsprintf": { @@ -4882,9 +4780,9 @@ "license": "MIT" }, "node_modules/follow-redirects": { - "version": "1.14.6", - "resolved": "http://94.130.170.209:4873/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.14.9", + "resolved": "http://94.130.170.209:4873/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "funding": [ { "type": "individual", @@ -6727,12 +6625,6 @@ "node": ">= 0.6.0" } }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "http://94.130.170.209:4873/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "license": "BSD-3-Clause" - }, "node_modules/js-sdsl": { "version": "2.1.4", "resolved": "http://94.130.170.209:4873/js-sdsl/-/js-sdsl-2.1.4.tgz", @@ -7148,52 +7040,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/lodash._baseiteratee": { - "version": "4.7.0", - "resolved": "http://94.130.170.209:4873/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", - "integrity": "sha1-NKm1VDVycnw9sueO2uPA6eZr0QI=", - "license": "MIT", - "dependencies": { - "lodash._stringtopath": "~4.8.0" - } - }, - "node_modules/lodash._basetostring": { - "version": "4.12.0", - "resolved": "http://94.130.170.209:4873/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", - "integrity": "sha1-kyfJ3FFYhmt/pLnUL0Y45XZt2d8=", - "license": "MIT" - }, - "node_modules/lodash._baseuniq": { - "version": "4.6.0", - "resolved": "http://94.130.170.209:4873/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", - "license": "MIT", - "dependencies": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "node_modules/lodash._createset": { - "version": "4.0.3", - "resolved": "http://94.130.170.209:4873/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=", - "license": "MIT" - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "http://94.130.170.209:4873/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "license": "MIT" - }, - "node_modules/lodash._stringtopath": { - "version": "4.8.0", - "resolved": "http://94.130.170.209:4873/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", - "integrity": "sha1-lBvPDmQmbl/B1m/tCmlZVExXaCQ=", - "license": "MIT", - "dependencies": { - "lodash._basetostring": "~4.12.0" - } - }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "http://94.130.170.209:4873/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -7303,12 +7149,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "http://94.130.170.209:4873/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "license": "MIT" - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "http://94.130.170.209:4873/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -7687,15 +7527,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-match": { - "version": "1.0.2", - "resolved": "http://94.130.170.209:4873/mime-match/-/mime-match-1.0.2.tgz", - "integrity": "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=", - "license": "ISC", - "dependencies": { - "wildcard": "^1.1.0" - } - }, "node_modules/mime-types": { "version": "2.1.34", "resolved": "http://94.130.170.209:4873/mime-types/-/mime-types-2.1.34.tgz", @@ -8137,12 +7968,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/namespace-emitter": { - "version": "2.0.1", - "resolved": "http://94.130.170.209:4873/namespace-emitter/-/namespace-emitter-2.0.1.tgz", - "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", - "license": "MIT" - }, "node_modules/nan": { "version": "2.15.0", "resolved": "http://94.130.170.209:4873/nan/-/nan-2.15.0.tgz", @@ -12351,13 +12176,6 @@ "node": ">=4" } }, - "node_modules/preact": { - "version": "8.2.9", - "resolved": "http://94.130.170.209:4873/preact/-/preact-8.2.9.tgz", - "integrity": "sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==", - "hasInstallScript": true, - "license": "MIT" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "http://94.130.170.209:4873/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12455,28 +12273,6 @@ "node": ">= 8" } }, - "node_modules/proper-lockfile": { - "version": "2.0.1", - "resolved": "http://94.130.170.209:4873/proper-lockfile/-/proper-lockfile-2.0.1.tgz", - "integrity": "sha1-FZ+wYZPTIAP0s2kd0uwaY0qoDR0=", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "retry": "^0.10.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.10.1", - "resolved": "http://94.130.170.209:4873/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "http://94.130.170.209:4873/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -12561,18 +12357,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qs-stringify": { - "version": "1.2.1", - "resolved": "http://94.130.170.209:4873/qs-stringify/-/qs-stringify-1.2.1.tgz", - "integrity": "sha512-2N5xGLGZUxpgAYq1fD1LmBSCbxQVsXYt5JU0nU3FuPWO8PlCnKNFQwXkZgyB6mrTdg7IbexX4wxIR403dJw9pw==", - "license": "MIT" - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "http://94.130.170.209:4873/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "http://94.130.170.209:4873/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -13077,12 +12861,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "license": "ISC" }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "http://94.130.170.209:4873/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.21.0", "resolved": "http://94.130.170.209:4873/resolve/-/resolve-1.21.0.tgz", @@ -14935,27 +14713,6 @@ "node": "*" } }, - "node_modules/tus-js-client": { - "version": "1.8.0", - "resolved": "http://94.130.170.209:4873/tus-js-client/-/tus-js-client-1.8.0.tgz", - "integrity": "sha512-qPX3TywqzxocTxUZtcS8X7Aik72SVMa0jKi4hWyfvRV+s9raVzzYGaP4MoJGaF0yOgm2+b6jXaVEHogxcJ8LGw==", - "license": "MIT", - "dependencies": { - "buffer-from": "^0.1.1", - "combine-errors": "^3.0.3", - "extend": "^3.0.2", - "js-base64": "^2.4.9", - "lodash.throttle": "^4.1.1", - "proper-lockfile": "^2.0.1", - "url-parse": "^1.4.3" - } - }, - "node_modules/tus-js-client/node_modules/buffer-from": { - "version": "0.1.2", - "resolved": "http://94.130.170.209:4873/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "license": "MIT" - }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "http://94.130.170.209:4873/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -15152,16 +14909,6 @@ "dev": true, "license": "MIT" }, - "node_modules/url-parse": { - "version": "1.5.4", - "resolved": "http://94.130.170.209:4873/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -15415,12 +15162,6 @@ "bs58check": "<3.0.0" } }, - "node_modules/wildcard": { - "version": "1.1.2", - "resolved": "http://94.130.170.209:4873/wildcard/-/wildcard-1.1.2.tgz", - "integrity": "sha1-pwIEUwhNjNLv5wup02liY94XEKU=", - "license": "MIT" - }, "node_modules/winston": { "version": "3.3.3", "resolved": "http://94.130.170.209:4873/winston/-/winston-3.3.3.tgz", @@ -16324,18 +16065,16 @@ } }, "@psf/bch-js": { - "version": "4.20.28", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-4.20.28.tgz", - "integrity": "sha512-tlWfYTUnmAzrFZDHTuP2CccE6fp20j4XcCIJiJYlpaKzxB0ilH8CEVWBQaMY+Fb+eaTrlSdiaDC5MBWV4klpQg==", + "version": "6.2.9", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.9.tgz", + "integrity": "sha512-7oj1+DqiSqOvl5Pn4PdLG+1hSptWqLHLEqen7UvkCL1KSR4qqVaI3m/j3SCHb6nWEZ4HceZalav2AM1LYHDEWg==", "requires": { "@chris.troutner/bip32-utils": "1.0.5", "@psf/bip21": "2.0.1", "@psf/bitcoincash-ops": "2.0.0", "@psf/bitcoincashjs-lib": "4.0.2", "@psf/coininfo": "4.0.0", - "@uppy/core": "1.10.4", - "@uppy/tus": "1.5.12", - "axios": "^0.21.4", + "axios": "0.26.1", "bc-bip68": "1.0.5", "bchaddrjs-slp": "0.2.5", "bigi": "1.4.2", @@ -16356,6 +16095,14 @@ "wif": "2.0.6" }, "dependencies": { + "axios": { + "version": "0.26.1", + "resolved": "http://94.130.170.209:4873/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, "bignumber.js": { "version": "9.0.0", "resolved": "http://94.130.170.209:4873/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -16613,11 +16360,6 @@ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, - "@types/tus-js-client": { - "version": "1.8.0", - "resolved": "http://94.130.170.209:4873/@types%2ftus-js-client/-/tus-js-client-1.8.0.tgz", - "integrity": "sha512-lWxu5+6qfyfwsW99GzUeJ9y9JeOSSLduKxgYMvaYM7sGTDKZsrIIHTUbHI2P016xhXtu9NxmUM3GrB4i14ie4A==" - }, "@types/ws": { "version": "7.4.7", "resolved": "http://94.130.170.209:4873/@types%2fws/-/ws-7.4.7.tgz", @@ -16626,76 +16368,11 @@ "@types/node": "*" } }, - "@uppy/companion-client": { - "version": "1.10.2", - "resolved": "http://94.130.170.209:4873/@uppy%2fcompanion-client/-/companion-client-1.10.2.tgz", - "integrity": "sha512-5RmsNF9UBvUqmqQz48SoiLvkpGmvQTgwNM4bJX8xwVozv/6goRpFrsMJGLwqFcHS/9xj6STKOqrM582g8exVwQ==", - "requires": { - "@uppy/utils": "^3.6.2", - "namespace-emitter": "^2.0.1", - "qs-stringify": "^1.1.0", - "url-parse": "^1.4.7" - }, - "dependencies": { - "@uppy/utils": { - "version": "3.6.2", - "resolved": "http://94.130.170.209:4873/@uppy%2futils/-/utils-3.6.2.tgz", - "integrity": "sha512-wGTZma7eywIojfuE1vXlT0fxPSpmCRMkfgFWYc+6TL2FfGqWInmePoB+yal6/M2AnjeKHz6XYMhIpZkjOxFvcw==", - "requires": { - "abortcontroller-polyfill": "^1.4.0", - "lodash.throttle": "^4.1.1" - } - } - } - }, - "@uppy/core": { - "version": "1.10.4", - "resolved": "http://94.130.170.209:4873/@uppy%2fcore/-/core-1.10.4.tgz", - "integrity": "sha512-mORSXL4JyXHGo98u6u0sMzv3wtdI5jjHsqyThQAXx3LvctWE0EBrxE7vJqrXue2z/m9lovsZVhuzP2L7Qkuebg==", - "requires": { - "@uppy/store-default": "^1.2.1", - "@uppy/utils": "^2.4.4", - "cuid": "^2.1.1", - "lodash.throttle": "^4.1.1", - "mime-match": "^1.0.2", - "namespace-emitter": "^2.0.1", - "preact": "8.2.9" - } - }, - "@uppy/store-default": { - "version": "1.2.7", - "resolved": "http://94.130.170.209:4873/@uppy%2fstore-default/-/store-default-1.2.7.tgz", - "integrity": "sha512-58IG9yk/i/kYQ9uEwAwMFl1H2V3syOoODrYoFfVHlxaqv+9MkXBg2tHE2gk40iaAIxcCErcPxZkBOvkqzO1SQA==" - }, - "@uppy/tus": { - "version": "1.5.12", - "resolved": "http://94.130.170.209:4873/@uppy%2ftus/-/tus-1.5.12.tgz", - "integrity": "sha512-jDiwsTRHnMfb83ZB8JdDD0uA9DX0K/FqenGMYBGTOlkCjAcXD3sI59DzEHwq2TtY3ZH7iaL3fTNQ7ExBWkwrqw==", - "requires": { - "@types/tus-js-client": "^1.8.0", - "@uppy/companion-client": "^1.4.4", - "@uppy/utils": "^2.4.4", - "tus-js-client": "^1.8.0" - } - }, - "@uppy/utils": { - "version": "2.4.4", - "resolved": "http://94.130.170.209:4873/@uppy%2futils/-/utils-2.4.4.tgz", - "integrity": "sha512-7A0uwK5Rf8XcKqlpNUZ5L5LmkHT5c0/UWjDJGwmzeCxp2lECgzsMC+4vgA6kT4sFzPFbLtUtxHi7ecFwow3NQQ==", - "requires": { - "lodash.throttle": "^4.1.1" - } - }, "abbrev": { "version": "1.1.1", "resolved": "http://94.130.170.209:4873/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "http://94.130.170.209:4873/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==" - }, "accepts": { "version": "1.3.7", "resolved": "http://94.130.170.209:4873/accepts/-/accepts-1.3.7.tgz", @@ -17765,26 +17442,6 @@ "text-hex": "1.0.x" } }, - "combine-errors": { - "version": "3.0.3", - "resolved": "http://94.130.170.209:4873/combine-errors/-/combine-errors-3.0.3.tgz", - "integrity": "sha1-9N9nQAg+VwOjGBEQwrEFUfAD2oY=", - "requires": { - "custom-error-instance": "2.1.1", - "lodash.uniqby": "4.5.0" - }, - "dependencies": { - "lodash.uniqby": { - "version": "4.5.0", - "resolved": "http://94.130.170.209:4873/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", - "integrity": "sha1-o6F7v2LutiQPSRhG6XwcTipeHiE=", - "requires": { - "lodash._baseiteratee": "~4.7.0", - "lodash._baseuniq": "~4.6.0" - } - } - } - }, "combined-stream": { "version": "1.0.8", "resolved": "http://94.130.170.209:4873/combined-stream/-/combined-stream-1.0.8.tgz", @@ -18055,16 +17712,6 @@ "resolved": "http://94.130.170.209:4873/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, - "cuid": { - "version": "2.1.8", - "resolved": "http://94.130.170.209:4873/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" - }, - "custom-error-instance": { - "version": "2.1.1", - "resolved": "http://94.130.170.209:4873/custom-error-instance/-/custom-error-instance-2.1.1.tgz", - "integrity": "sha1-PPY5FIemYppiR+sMoM4ACBt+Nho=" - }, "dashdash": { "version": "1.14.1", "resolved": "http://94.130.170.209:4873/dashdash/-/dashdash-1.14.1.tgz", @@ -19098,7 +18745,8 @@ "extend": { "version": "3.0.2", "resolved": "http://94.130.170.209:4873/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extsprintf": { "version": "1.3.0", @@ -19289,9 +18937,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.14.6", - "resolved": "http://94.130.170.209:4873/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + "version": "1.14.9", + "resolved": "http://94.130.170.209:4873/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "for-each": { "version": "0.3.3", @@ -20502,11 +20150,6 @@ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, - "js-base64": { - "version": "2.6.4", - "resolved": "http://94.130.170.209:4873/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" - }, "js-sdsl": { "version": "2.1.4", "resolved": "http://94.130.170.209:4873/js-sdsl/-/js-sdsl-2.1.4.tgz", @@ -20816,46 +20459,6 @@ "resolved": "http://94.130.170.209:4873/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash._baseiteratee": { - "version": "4.7.0", - "resolved": "http://94.130.170.209:4873/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", - "integrity": "sha1-NKm1VDVycnw9sueO2uPA6eZr0QI=", - "requires": { - "lodash._stringtopath": "~4.8.0" - } - }, - "lodash._basetostring": { - "version": "4.12.0", - "resolved": "http://94.130.170.209:4873/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", - "integrity": "sha1-kyfJ3FFYhmt/pLnUL0Y45XZt2d8=" - }, - "lodash._baseuniq": { - "version": "4.6.0", - "resolved": "http://94.130.170.209:4873/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", - "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "resolved": "http://94.130.170.209:4873/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "http://94.130.170.209:4873/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash._stringtopath": { - "version": "4.8.0", - "resolved": "http://94.130.170.209:4873/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", - "integrity": "sha1-lBvPDmQmbl/B1m/tCmlZVExXaCQ=", - "requires": { - "lodash._basetostring": "~4.12.0" - } - }, "lodash.capitalize": { "version": "4.2.1", "resolved": "http://94.130.170.209:4873/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -20948,11 +20551,6 @@ "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", "dev": true }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "http://94.130.170.209:4873/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, "lodash.truncate": { "version": "4.4.2", "resolved": "http://94.130.170.209:4873/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -21213,14 +20811,6 @@ "resolved": "http://94.130.170.209:4873/mime-db/-/mime-db-1.51.0.tgz", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, - "mime-match": { - "version": "1.0.2", - "resolved": "http://94.130.170.209:4873/mime-match/-/mime-match-1.0.2.tgz", - "integrity": "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=", - "requires": { - "wildcard": "^1.1.0" - } - }, "mime-types": { "version": "2.1.34", "resolved": "http://94.130.170.209:4873/mime-types/-/mime-types-2.1.34.tgz", @@ -21530,11 +21120,6 @@ "resolved": "http://94.130.170.209:4873/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "namespace-emitter": { - "version": "2.0.1", - "resolved": "http://94.130.170.209:4873/namespace-emitter/-/namespace-emitter-2.0.1.tgz", - "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" - }, "nan": { "version": "2.15.0", "resolved": "http://94.130.170.209:4873/nan/-/nan-2.15.0.tgz", @@ -24511,11 +24096,6 @@ "find-up": "^2.1.0" } }, - "preact": { - "version": "8.2.9", - "resolved": "http://94.130.170.209:4873/preact/-/preact-8.2.9.tgz", - "integrity": "sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==" - }, "prelude-ls": { "version": "1.2.1", "resolved": "http://94.130.170.209:4873/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -24580,22 +24160,6 @@ "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true }, - "proper-lockfile": { - "version": "2.0.1", - "resolved": "http://94.130.170.209:4873/proper-lockfile/-/proper-lockfile-2.0.1.tgz", - "integrity": "sha1-FZ+wYZPTIAP0s2kd0uwaY0qoDR0=", - "requires": { - "graceful-fs": "^4.1.2", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "resolved": "http://94.130.170.209:4873/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" - } - } - }, "proxy-addr": { "version": "2.0.7", "resolved": "http://94.130.170.209:4873/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -24653,16 +24217,6 @@ "side-channel": "^1.0.4" } }, - "qs-stringify": { - "version": "1.2.1", - "resolved": "http://94.130.170.209:4873/qs-stringify/-/qs-stringify-1.2.1.tgz", - "integrity": "sha512-2N5xGLGZUxpgAYq1fD1LmBSCbxQVsXYt5JU0nU3FuPWO8PlCnKNFQwXkZgyB6mrTdg7IbexX4wxIR403dJw9pw==" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "http://94.130.170.209:4873/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, "queue-microtask": { "version": "1.2.3", "resolved": "http://94.130.170.209:4873/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -25013,11 +24567,6 @@ "resolved": "http://94.130.170.209:4873/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "requires-port": { - "version": "1.0.0", - "resolved": "http://94.130.170.209:4873/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, "resolve": { "version": "1.21.0", "resolved": "http://94.130.170.209:4873/resolve/-/resolve-1.21.0.tgz", @@ -26345,27 +25894,6 @@ "safe-buffer": "^5.0.1" } }, - "tus-js-client": { - "version": "1.8.0", - "resolved": "http://94.130.170.209:4873/tus-js-client/-/tus-js-client-1.8.0.tgz", - "integrity": "sha512-qPX3TywqzxocTxUZtcS8X7Aik72SVMa0jKi4hWyfvRV+s9raVzzYGaP4MoJGaF0yOgm2+b6jXaVEHogxcJ8LGw==", - "requires": { - "buffer-from": "^0.1.1", - "combine-errors": "^3.0.3", - "extend": "^3.0.2", - "js-base64": "^2.4.9", - "lodash.throttle": "^4.1.1", - "proper-lockfile": "^2.0.1", - "url-parse": "^1.4.3" - }, - "dependencies": { - "buffer-from": { - "version": "0.1.2", - "resolved": "http://94.130.170.209:4873/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" - } - } - }, "tweetnacl": { "version": "0.14.5", "resolved": "http://94.130.170.209:4873/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -26507,15 +26035,6 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "url-parse": { - "version": "1.5.4", - "resolved": "http://94.130.170.209:4873/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -26699,11 +26218,6 @@ "bs58check": "<3.0.0" } }, - "wildcard": { - "version": "1.1.2", - "resolved": "http://94.130.170.209:4873/wildcard/-/wildcard-1.1.2.tgz", - "integrity": "sha1-pwIEUwhNjNLv5wup02liY94XEKU=" - }, "winston": { "version": "3.3.3", "resolved": "http://94.130.170.209:4873/winston/-/winston-3.3.3.tgz", diff --git a/package.json b/package.json index c36395f..30f1936 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "node": ">=10.15.1" }, "dependencies": { - "@psf/bch-js": "^4.20.7", + "@psf/bch-js": "6.2.9", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index e990100..8cdf742 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -229,7 +229,7 @@ class PsfSlpIndexer { // such data. // // Example: - // curl -H "Content-Type: application/json" -X POST -d '{ "tokenId": "afca62f07560b4c72c2ed6c9c3995315f964ccdfc37dded316d182640b42d88a" }' localhost:3000/v5/psf/slp/token/data + // curl -H "Content-Type: application/json" -X POST -d '{ "tokenId": "f055256b938f1ecfa270459d6f12c7c8c82b66d3263c03d5074445a2b1a498a3" }' localhost:3000/v5/psf/slp/token/data async getTokenData (req, res, next) { try { // Verify env var is set for interacting with the indexer. @@ -292,17 +292,18 @@ class PsfSlpIndexer { // Get the OP_RETURN data and decode it. const mutableData = await _this.decodeOpReturn(documentHash) const jsonData = JSON.parse(mutableData) + // console.log(`jsonData: ${JSON.stringify(jsonData, null, 2)}`) - const mspAddress = jsonData.mspAddress + const mutableDataAddr = jsonData.mda // Gets the mutable data address (MDA) transaction history. - const transactions = await _this.bchjs.Electrumx.transactions(mspAddress) + const transactions = await _this.bchjs.Electrumx.transactions(mutableDataAddr) const mspTxs = transactions.transactions // console.log(`mspTxs: ${JSON.stringify(mspTxs, null, 2)}`) let data = false - // Maps each transaction of the mspAddress + // Maps each transaction of the mutableDataAddr // if finds an OP_RETURN decode is and closes the loop // Start with the newest TXID entry and scan the history to find the first // entry with an IPFS CID. @@ -326,8 +327,15 @@ class PsfSlpIndexer { // Keep searching if this TX does not have a cid value. if (!obj.cid) continue - // TODO: Ensure data was generated by the MSP address and not an - // update from a different address. + // Ensure data was generated by the MDA + const txData = await this.bchjs.Transaction.get(txid) + const vinAddress = txData.txData.vin[0].address + + // Skip entry if it was not made by the MDA private key. + if (mutableDataAddr !== vinAddress) { + console.log('Data is not generated by MDA') + continue + } break } catch (error) { @@ -352,6 +360,7 @@ class PsfSlpIndexer { return result } catch (err) { console.log('Error in getMutableData().') + // console.log('Error in getMutableData(): ', err) throw err } } @@ -395,7 +404,12 @@ class PsfSlpIndexer { if (!cid || typeof cid !== 'string') { throw new Error('cid must be a string.') } + + // Assuming that CID starts with ipfs://. Cutting out that prefix. + cid = cid.substring(7) + const dataUrl = `https://${cid}.ipfs.dweb.link/data.json` + console.log(`dataUrl: ${dataUrl}`) const response = await _this.axios.get(dataUrl) // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`) From 8d834310344df3a845328caa2e06d55e0cc10634 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 08:37:58 -0700 Subject: [PATCH 14/32] fix(api-doc): Updated api-doc --- apidoc.json | 5 +- package-lock.json | 2404 +++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 3 files changed, 2231 insertions(+), 180 deletions(-) diff --git a/apidoc.json b/apidoc.json index 2d85824..e2009c2 100644 --- a/apidoc.json +++ b/apidoc.json @@ -1,4 +1,3 @@ { - "sampleUrl": null - - } \ No newline at end of file + "sampleUrl": null +} diff --git a/package-lock.json b/package-lock.json index 78c9689..cac3a3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@psf/bch-js": "^4.20.7", - "apidoc": "^0.26.0", + "apidoc": "0.50.5", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", "body-parser": "^1.18.3", @@ -515,6 +515,15 @@ "kuler": "^2.0.0" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "http://94.130.170.209:4873/@discoveryjs%2fjson-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.2.2", "resolved": "http://94.130.170.209:4873/@eslint%2feslintrc/-/eslintrc-0.2.2.tgz", @@ -1147,6 +1156,38 @@ "node": ">= 6" } }, + "node_modules/@types/eslint": { + "version": "8.4.1", + "resolved": "http://94.130.170.209:4873/@types%2feslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "http://94.130.170.209:4873/@types%2feslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "http://94.130.170.209:4873/@types%2festree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "http://94.130.170.209:4873/@types%2fjson-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "http://94.130.170.209:4873/@types%2fjson5/-/json5-0.0.29.tgz", @@ -1270,6 +1311,200 @@ "lodash.throttle": "^4.1.1" } }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2ffloating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fleb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2futf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2fconfigtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "license": "MIT", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2finfo/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "license": "MIT", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2fserve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "license": "MIT", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "http://94.130.170.209:4873/@xtuc%2fieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "http://94.130.170.209:4873/@xtuc%2flong/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "http://94.130.170.209:4873/abbrev/-/abbrev-1.1.1.tgz", @@ -1349,7 +1584,6 @@ "version": "6.12.6", "resolved": "http://94.130.170.209:4873/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1362,6 +1596,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "http://94.130.170.209:4873/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1455,44 +1698,68 @@ } }, "node_modules/apidoc": { - "version": "0.26.0", - "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.26.0.tgz", - "integrity": "sha512-IEw/Z7HMMbjeVjK2sZvZSwAln8AqalLzf3qLDtkcedXVhdxGm6W7UgIW6fshegqNTMLzm8CFEMi4Lxbeu0xKTw==", + "version": "0.50.5", + "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.50.5.tgz", + "integrity": "sha512-bp4nze32IsUgeDoRHcpZY8mdZ/GHMHyMak6ptLQkrzQ1rL6LYf0Mu4mBJmVksA+N6/hOsnOhoPQGeiZp2BVX2w==", "license": "MIT", + "os": [ + "darwin", + "freebsd", + "linux", + "openbsd", + "win32" + ], "dependencies": { - "apidoc-core": "^0.12.0", - "commander": "^2.20.0", - "fs-extra": "^9.0.1", - "handlebars": "^4.7.6", - "lodash": "^4.17.20", - "markdown-it": "^11.0.0", - "nodemon": "^2.0.4", + "bootstrap": "3.4.1", + "commander": "^8.3.0", + "diff-match-patch": "^1.0.5", + "esbuild-loader": "^2.16.0", + "expose-loader": "^3.1.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "iconv-lite": "^0.6.3", + "jquery": "^3.6.0", + "klaw-sync": "^6.0.0", + "lodash": "^4.17.21", + "markdown-it": "^12.2.0", + "nodemon": "^2.0.15", + "path-to-regexp": "^6.2.0", + "prismjs": "^1.25.0", + "semver": "^7.3.5", + "style-loader": "^3.3.1", + "url-parse": "^1.5.3", + "webpack": "^5.64.2", + "webpack-cli": "^4.9.1", "winston": "^3.3.3" }, "bin": { "apidoc": "bin/apidoc" }, "engines": { - "node": ">= 0.10.0" + "node": ">=14.0.0" } }, - "node_modules/apidoc-core": { - "version": "0.12.0", - "resolved": "http://94.130.170.209:4873/apidoc-core/-/apidoc-core-0.12.0.tgz", - "integrity": "sha512-VMhkJWz5IAyvWM0RnEbKNi1qe8se+id3/Ki3H/ePM8ih0KYTfaaSDxqo2w4uIVB1UVVKFvrTWyYUyQs7CEcoKQ==", + "node_modules/apidoc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "http://94.130.170.209:4873/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "license": "MIT", "dependencies": { - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "iconv-lite": "^0.6.2", - "klaw-sync": "^6.0.0", - "lodash": "^4.17.20", - "semver": "~7.3.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" } }, + "node_modules/apidoc/node_modules/path-to-regexp": { + "version": "6.2.0", + "resolved": "http://94.130.170.209:4873/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "license": "MIT" + }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/append-transform/-/append-transform-2.0.0.tgz", @@ -1684,6 +1951,7 @@ "version": "1.0.0", "resolved": "http://94.130.170.209:4873/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, "license": "ISC", "engines": { "node": ">= 4.0.0" @@ -2100,6 +2368,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "http://94.130.170.209:4873/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/bottleneck": { "version": "2.19.5", "resolved": "http://94.130.170.209:4873/bottleneck/-/bottleneck-2.19.5.tgz", @@ -2211,7 +2488,6 @@ "version": "4.19.1", "resolved": "http://94.130.170.209:4873/browserslist/-/browserslist-4.19.1.tgz", "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001286", @@ -2443,7 +2719,6 @@ "version": "1.0.30001298", "resolved": "http://94.130.170.209:4873/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", - "dev": true, "license": "CC-BY-4.0", "funding": { "type": "opencollective", @@ -2545,6 +2820,15 @@ "fsevents": "~2.1.1" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "http://94.130.170.209:4873/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/ci-info/-/ci-info-2.0.0.tgz", @@ -2702,6 +2986,32 @@ "node": ">=6" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "http://94.130.170.209:4873/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "http://94.130.170.209:4873/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "http://94.130.170.209:4873/clone-response/-/clone-response-1.0.2.tgz", @@ -2773,6 +3083,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "http://94.130.170.209:4873/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "license": "MIT" + }, "node_modules/colors": { "version": "1.4.1", "resolved": "http://94.130.170.209:4873/colors/-/colors-1.4.1.tgz", @@ -2825,10 +3141,13 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "http://94.130.170.209:4873/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "version": "8.3.0", + "resolved": "http://94.130.170.209:4873/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } }, "node_modules/commist": { "version": "1.1.0", @@ -3162,7 +3481,6 @@ "version": "7.0.3", "resolved": "http://94.130.170.209:4873/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3459,6 +3777,12 @@ "node": ">=0.3.1" } }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "http://94.130.170.209:4873/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3673,7 +3997,6 @@ "version": "1.4.38", "resolved": "http://94.130.170.209:4873/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz", "integrity": "sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ==", - "dev": true, "license": "ISC" }, "node_modules/electrum-cash": { @@ -3745,6 +4068,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "http://94.130.170.209:4873/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/enabled": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/enabled/-/enabled-2.0.0.tgz", @@ -3769,6 +4101,19 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.9.3", + "resolved": "http://94.130.170.209:4873/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "http://94.130.170.209:4873/enquirer/-/enquirer-2.3.6.tgz", @@ -3783,10 +4128,13 @@ } }, "node_modules/entities": { - "version": "2.0.3", - "resolved": "http://94.130.170.209:4873/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "license": "BSD-2-Clause" + "version": "2.1.0", + "resolved": "http://94.130.170.209:4873/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/env-ci": { "version": "5.5.0", @@ -3803,6 +4151,18 @@ "node": ">=10.17" } }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "http://94.130.170.209:4873/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "http://94.130.170.209:4873/error-ex/-/error-ex-1.3.2.tgz", @@ -3866,6 +4226,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "http://94.130.170.209:4873/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "license": "MIT" + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "http://94.130.170.209:4873/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -3890,11 +4256,385 @@ "dev": true, "license": "MIT" }, + "node_modules/esbuild": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild/-/esbuild-0.14.38.tgz", + "integrity": "sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.38", + "esbuild-android-arm64": "0.14.38", + "esbuild-darwin-64": "0.14.38", + "esbuild-darwin-arm64": "0.14.38", + "esbuild-freebsd-64": "0.14.38", + "esbuild-freebsd-arm64": "0.14.38", + "esbuild-linux-32": "0.14.38", + "esbuild-linux-64": "0.14.38", + "esbuild-linux-arm": "0.14.38", + "esbuild-linux-arm64": "0.14.38", + "esbuild-linux-mips64le": "0.14.38", + "esbuild-linux-ppc64le": "0.14.38", + "esbuild-linux-riscv64": "0.14.38", + "esbuild-linux-s390x": "0.14.38", + "esbuild-netbsd-64": "0.14.38", + "esbuild-openbsd-64": "0.14.38", + "esbuild-sunos-64": "0.14.38", + "esbuild-windows-32": "0.14.38", + "esbuild-windows-64": "0.14.38", + "esbuild-windows-arm64": "0.14.38" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz", + "integrity": "sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz", + "integrity": "sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz", + "integrity": "sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz", + "integrity": "sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz", + "integrity": "sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz", + "integrity": "sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz", + "integrity": "sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz", + "integrity": "sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz", + "integrity": "sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz", + "integrity": "sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz", + "integrity": "sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz", + "integrity": "sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz", + "integrity": "sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz", + "integrity": "sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-loader": { + "version": "2.18.0", + "resolved": "http://94.130.170.209:4873/esbuild-loader/-/esbuild-loader-2.18.0.tgz", + "integrity": "sha512-AKqxM3bI+gvGPV8o6NAhR+cBxVO8+dh+O0OXBHIXXwuSGumckbPWHzZ17subjBGI2YEGyJ1STH7Haj8aCrwL/w==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.14.6", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^2.2.0" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz", + "integrity": "sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz", + "integrity": "sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz", + "integrity": "sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz", + "integrity": "sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz", + "integrity": "sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz", + "integrity": "sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "http://94.130.170.209:4873/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4324,7 +5064,6 @@ "version": "5.1.1", "resolved": "http://94.130.170.209:4873/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -4435,7 +5174,6 @@ "version": "4.3.0", "resolved": "http://94.130.170.209:4873/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -4448,7 +5186,6 @@ "version": "5.3.0", "resolved": "http://94.130.170.209:4873/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4458,7 +5195,6 @@ "version": "4.3.0", "resolved": "http://94.130.170.209:4873/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4483,6 +5219,15 @@ "node": ">= 0.6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "http://94.130.170.209:4873/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "http://94.130.170.209:4873/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -4497,7 +5242,6 @@ "version": "5.1.1", "resolved": "http://94.130.170.209:4873/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -4517,6 +5261,22 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expose-loader": { + "version": "3.1.0", + "resolved": "http://94.130.170.209:4873/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/express": { "version": "4.17.2", "resolved": "http://94.130.170.209:4873/express/-/express-4.17.2.tgz", @@ -4640,7 +5400,6 @@ "version": "3.1.3", "resolved": "http://94.130.170.209:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-diff": { @@ -4671,7 +5430,6 @@ "version": "2.1.0", "resolved": "http://94.130.170.209:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -4681,6 +5439,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "http://94.130.170.209:4873/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "http://94.130.170.209:4873/fastq/-/fastq-1.13.0.tgz", @@ -5049,6 +5813,7 @@ "version": "9.1.0", "resolved": "http://94.130.170.209:4873/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -5163,7 +5928,6 @@ "version": "6.0.1", "resolved": "http://94.130.170.209:4873/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -5306,6 +6070,12 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "http://94.130.170.209:4873/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, "node_modules/global-dirs": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/global-dirs/-/global-dirs-3.0.0.tgz", @@ -5862,7 +6632,6 @@ "version": "2.1.0", "resolved": "http://94.130.170.209:4873/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -5965,6 +6734,25 @@ "node": ">=4" } }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "http://94.130.170.209:4873/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "http://94.130.170.209:4873/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6020,6 +6808,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "http://94.130.170.209:4873/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/into-stream": { "version": "6.0.0", "resolved": "http://94.130.170.209:4873/into-stream/-/into-stream-6.0.0.tgz", @@ -6559,6 +7356,15 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "license": "ISC" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "http://94.130.170.209:4873/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "http://94.130.170.209:4873/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -6727,6 +7533,50 @@ "node": ">= 0.6.0" } }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "http://94.130.170.209:4873/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "http://94.130.170.209:4873/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "http://94.130.170.209:4873/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "http://94.130.170.209:4873/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "license": "MIT" + }, "node_modules/js-base64": { "version": "2.6.4", "resolved": "http://94.130.170.209:4873/js-base64/-/js-base64-2.6.4.tgz", @@ -6796,7 +7646,6 @@ "version": "1.0.2", "resolved": "http://94.130.170.209:4873/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -6817,7 +7666,6 @@ "version": "0.4.1", "resolved": "http://94.130.170.209:4873/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -6838,7 +7686,6 @@ "version": "2.2.0", "resolved": "http://94.130.170.209:4873/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.5" @@ -7006,7 +7853,6 @@ "version": "6.0.3", "resolved": "http://94.130.170.209:4873/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7128,6 +7974,38 @@ "node": ">=4" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "http://94.130.170.209:4873/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "http://94.130.170.209:4873/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/big.js": { + "version": "5.2.2", + "resolved": "http://94.130.170.209:4873/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/locate-path/-/locate-path-2.0.0.tgz", @@ -7303,6 +8181,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "http://94.130.170.209:4873/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "license": "MIT" + }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "http://94.130.170.209:4873/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -7492,13 +8376,13 @@ } }, "node_modules/markdown-it": { - "version": "11.0.1", - "resolved": "http://94.130.170.209:4873/markdown-it/-/markdown-it-11.0.1.tgz", - "integrity": "sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==", + "version": "12.3.2", + "resolved": "http://94.130.170.209:4873/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "entities": "~2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" @@ -7507,6 +8391,12 @@ "markdown-it": "bin/markdown-it.js" } }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "http://94.130.170.209:4873/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/marked": { "version": "2.1.3", "resolved": "http://94.130.170.209:4873/marked/-/marked-2.1.3.tgz", @@ -7623,7 +8513,6 @@ "version": "2.0.0", "resolved": "http://94.130.170.209:4873/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -7712,7 +8601,6 @@ "version": "2.1.0", "resolved": "http://94.130.170.209:4873/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8310,7 +9198,6 @@ "version": "2.0.1", "resolved": "http://94.130.170.209:4873/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true, "license": "MIT" }, "node_modules/nodemon": { @@ -8647,7 +9534,6 @@ "version": "4.0.1", "resolved": "http://94.130.170.209:4873/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -11850,7 +12736,6 @@ "version": "5.1.2", "resolved": "http://94.130.170.209:4873/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -12140,7 +13025,6 @@ "version": "3.1.1", "resolved": "http://94.130.170.209:4873/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12210,7 +13094,6 @@ "version": "1.0.0", "resolved": "http://94.130.170.209:4873/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -12253,7 +13136,6 @@ "version": "4.2.0", "resolved": "http://94.130.170.209:4873/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -12266,7 +13148,6 @@ "version": "4.1.0", "resolved": "http://94.130.170.209:4873/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -12280,7 +13161,6 @@ "version": "5.0.0", "resolved": "http://94.130.170.209:4873/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -12293,7 +13173,6 @@ "version": "2.3.0", "resolved": "http://94.130.170.209:4873/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -12309,7 +13188,6 @@ "version": "4.1.0", "resolved": "http://94.130.170.209:4873/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -12322,7 +13200,6 @@ "version": "2.2.0", "resolved": "http://94.130.170.209:4873/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -12332,7 +13209,6 @@ "version": "4.0.0", "resolved": "http://94.130.170.209:4873/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12404,6 +13280,15 @@ "node": ">=6.0.0" } }, + "node_modules/prismjs": { + "version": "1.28.0", + "resolved": "http://94.130.170.209:4873/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "http://94.130.170.209:4873/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12517,7 +13402,6 @@ "version": "2.1.1", "resolved": "http://94.130.170.209:4873/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -12877,6 +13761,18 @@ "node": ">= 8" } }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "http://94.130.170.209:4873/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/redent/-/redent-3.0.0.tgz", @@ -13087,7 +13983,6 @@ "version": "1.21.0", "resolved": "http://94.130.170.209:4873/resolve/-/resolve-1.21.0.tgz", "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.8.0", @@ -13101,6 +13996,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "http://94.130.170.209:4873/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "http://94.130.170.209:4873/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "http://94.130.170.209:4873/resolve-from/-/resolve-from-4.0.0.tgz", @@ -13233,6 +14149,24 @@ "big.js": "^3.1.3" } }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "http://94.130.170.209:4873/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/scryptsy": { "version": "2.1.0", "resolved": "http://94.130.170.209:4873/scryptsy/-/scryptsy-2.1.0.tgz", @@ -13463,6 +14397,24 @@ "node": ">=4" } }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "http://94.130.170.209:4873/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serialize-javascript/node_modules/randombytes": { + "version": "2.1.0", + "resolved": "http://94.130.170.209:4873/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/serve-static": { "version": "1.14.2", "resolved": "http://94.130.170.209:4873/serve-static/-/serve-static-1.14.2.tgz", @@ -13503,11 +14455,22 @@ "sha.js": "bin.js" } }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "http://94.130.170.209:4873/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -13520,7 +14483,6 @@ "version": "3.0.0", "resolved": "http://94.130.170.209:4873/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13732,6 +14694,12 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "http://94.130.170.209:4873/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "http://94.130.170.209:4873/source-map/-/source-map-0.6.1.tgz", @@ -13741,6 +14709,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "http://94.130.170.209:4873/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spawn-error-forwarder": { "version": "1.0.0", "resolved": "http://94.130.170.209:4873/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", @@ -14526,7 +15504,6 @@ "version": "2.0.0", "resolved": "http://94.130.170.209:4873/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -14558,6 +15535,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "http://94.130.170.209:4873/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "http://94.130.170.209:4873/supports-color/-/supports-color-7.2.0.tgz", @@ -14588,7 +15581,6 @@ "version": "1.0.0", "resolved": "http://94.130.170.209:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -14638,6 +15630,15 @@ "dev": true, "license": "MIT" }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "http://94.130.170.209:4873/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tape": { "version": "5.4.0", "resolved": "http://94.130.170.209:4873/tape/-/tape-5.4.0.tgz", @@ -14730,6 +15731,114 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.13.0", + "resolved": "http://94.130.170.209:4873/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.8.0-beta.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "http://94.130.170.209:4873/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "license": "MIT", + "dependencies": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.7.1", + "resolved": "http://94.130.170.209:4873/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "http://94.130.170.209:4873/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "http://94.130.170.209:4873/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/tr46": { + "version": "1.0.1", + "resolved": "http://94.130.170.209:4873/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/terser/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "http://94.130.170.209:4873/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/terser/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "http://94.130.170.209:4873/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "http://94.130.170.209:4873/test-exclude/-/test-exclude-6.0.0.tgz", @@ -15139,7 +16248,6 @@ "version": "4.4.1", "resolved": "http://94.130.170.209:4873/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -15251,6 +16359,19 @@ "extsprintf": "^1.2.0" } }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "http://94.130.170.209:4873/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -15258,6 +16379,167 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/webpack": { + "version": "5.72.0", + "resolved": "http://94.130.170.209:4873/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "http://94.130.170.209:4873/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "http://94.130.170.209:4873/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "http://94.130.170.209:4873/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/wildcard": { + "version": "2.0.0", + "resolved": "http://94.130.170.209:4873/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "license": "MIT" + }, + "node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "http://94.130.170.209:4873/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.7.1", + "resolved": "http://94.130.170.209:4873/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "http://94.130.170.209:4873/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "http://94.130.170.209:4873/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "http://94.130.170.209:4873/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -15273,7 +16555,6 @@ "version": "2.0.2", "resolved": "http://94.130.170.209:4873/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -16079,6 +17360,11 @@ "kuler": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "http://94.130.170.209:4873/@discoveryjs%2fjson-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + }, "@eslint/eslintrc": { "version": "0.2.2", "resolved": "http://94.130.170.209:4873/@eslint%2feslintrc/-/eslintrc-0.2.2.tgz", @@ -16578,6 +17864,34 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "http://94.130.170.209:4873/@types%2feslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "http://94.130.170.209:4873/@types%2feslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "http://94.130.170.209:4873/@types%2festree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "http://94.130.170.209:4873/@types%2fjson-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, "@types/json5": { "version": "0.0.29", "resolved": "http://94.130.170.209:4873/@types%2fjson5/-/json5-0.0.29.tgz", @@ -16686,6 +18000,167 @@ "lodash.throttle": "^4.1.1" } }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2ffloating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fhelper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fleb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2futf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "http://94.130.170.209:4873/@webassemblyjs%2fwast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2fconfigtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2finfo/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "http://94.130.170.209:4873/@webpack-cli%2fserve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "http://94.130.170.209:4873/@xtuc%2fieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "http://94.130.170.209:4873/@xtuc%2flong/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, "abbrev": { "version": "1.1.1", "resolved": "http://94.130.170.209:4873/abbrev/-/abbrev-1.1.1.tgz", @@ -16741,7 +18216,6 @@ "version": "6.12.6", "resolved": "http://94.130.170.209:4873/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16749,6 +18223,12 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "http://94.130.170.209:4873/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, "ansi-align": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/ansi-align/-/ansi-align-3.0.1.tgz", @@ -16809,31 +18289,49 @@ } }, "apidoc": { - "version": "0.26.0", - "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.26.0.tgz", - "integrity": "sha512-IEw/Z7HMMbjeVjK2sZvZSwAln8AqalLzf3qLDtkcedXVhdxGm6W7UgIW6fshegqNTMLzm8CFEMi4Lxbeu0xKTw==", + "version": "0.50.5", + "resolved": "http://94.130.170.209:4873/apidoc/-/apidoc-0.50.5.tgz", + "integrity": "sha512-bp4nze32IsUgeDoRHcpZY8mdZ/GHMHyMak6ptLQkrzQ1rL6LYf0Mu4mBJmVksA+N6/hOsnOhoPQGeiZp2BVX2w==", "requires": { - "apidoc-core": "^0.12.0", - "commander": "^2.20.0", - "fs-extra": "^9.0.1", - "handlebars": "^4.7.6", - "lodash": "^4.17.20", - "markdown-it": "^11.0.0", - "nodemon": "^2.0.4", - "winston": "^3.3.3" - } - }, - "apidoc-core": { - "version": "0.12.0", - "resolved": "http://94.130.170.209:4873/apidoc-core/-/apidoc-core-0.12.0.tgz", - "integrity": "sha512-VMhkJWz5IAyvWM0RnEbKNi1qe8se+id3/Ki3H/ePM8ih0KYTfaaSDxqo2w4uIVB1UVVKFvrTWyYUyQs7CEcoKQ==", - "requires": { - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "iconv-lite": "^0.6.2", + "bootstrap": "3.4.1", + "commander": "^8.3.0", + "diff-match-patch": "^1.0.5", + "esbuild-loader": "^2.16.0", + "expose-loader": "^3.1.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "iconv-lite": "^0.6.3", + "jquery": "^3.6.0", "klaw-sync": "^6.0.0", - "lodash": "^4.17.20", - "semver": "~7.3.2" + "lodash": "^4.17.21", + "markdown-it": "^12.2.0", + "nodemon": "^2.0.15", + "path-to-regexp": "^6.2.0", + "prismjs": "^1.25.0", + "semver": "^7.3.5", + "style-loader": "^3.3.1", + "url-parse": "^1.5.3", + "webpack": "^5.64.2", + "webpack-cli": "^4.9.1", + "winston": "^3.3.3" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "http://94.130.170.209:4873/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "path-to-regexp": { + "version": "6.2.0", + "resolved": "http://94.130.170.209:4873/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" + } } }, "append-transform": { @@ -16972,7 +18470,8 @@ "at-least-node": { "version": "1.0.0", "resolved": "http://94.130.170.209:4873/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true }, "available-typed-arrays": { "version": "1.0.5", @@ -17276,6 +18775,11 @@ } } }, + "bootstrap": { + "version": "3.4.1", + "resolved": "http://94.130.170.209:4873/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + }, "bottleneck": { "version": "2.19.5", "resolved": "http://94.130.170.209:4873/bottleneck/-/bottleneck-2.19.5.tgz", @@ -17358,7 +18862,6 @@ "version": "4.19.1", "resolved": "http://94.130.170.209:4873/browserslist/-/browserslist-4.19.1.tgz", "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001286", "electron-to-chromium": "^1.4.17", @@ -17509,8 +19012,7 @@ "caniuse-lite": { "version": "1.0.30001298", "resolved": "http://94.130.170.209:4873/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", - "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", - "dev": true + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==" }, "cardinal": { "version": "2.1.1", @@ -17580,6 +19082,11 @@ "readdirp": "~3.2.0" } }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "http://94.130.170.209:4873/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, "ci-info": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/ci-info/-/ci-info-2.0.0.tgz", @@ -17692,6 +19199,26 @@ } } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "http://94.130.170.209:4873/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "http://94.130.170.209:4873/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + } + } + }, "clone-response": { "version": "1.0.2", "resolved": "http://94.130.170.209:4873/clone-response/-/clone-response-1.0.2.tgz", @@ -17751,6 +19278,11 @@ "simple-swizzle": "^0.2.2" } }, + "colorette": { + "version": "2.0.16", + "resolved": "http://94.130.170.209:4873/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + }, "colors": { "version": "1.4.1", "resolved": "http://94.130.170.209:4873/colors/-/colors-1.4.1.tgz", @@ -17795,9 +19327,9 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "http://94.130.170.209:4873/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "8.3.0", + "resolved": "http://94.130.170.209:4873/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "commist": { "version": "1.1.0", @@ -18043,7 +19575,6 @@ "version": "7.0.3", "resolved": "http://94.130.170.209:4873/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -18252,6 +19783,11 @@ "resolved": "http://94.130.170.209:4873/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "diff-match-patch": { + "version": "1.0.5", + "resolved": "http://94.130.170.209:4873/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/dir-glob/-/dir-glob-3.0.1.tgz", @@ -18426,8 +19962,7 @@ "electron-to-chromium": { "version": "1.4.38", "resolved": "http://94.130.170.209:4873/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz", - "integrity": "sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ==", - "dev": true + "integrity": "sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ==" }, "electrum-cash": { "version": "2.0.9", @@ -18487,6 +20022,11 @@ "resolved": "http://94.130.170.209:4873/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "emojis-list": { + "version": "3.0.0", + "resolved": "http://94.130.170.209:4873/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, "enabled": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/enabled/-/enabled-2.0.0.tgz", @@ -18505,6 +20045,15 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.9.3", + "resolved": "http://94.130.170.209:4873/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "http://94.130.170.209:4873/enquirer/-/enquirer-2.3.6.tgz", @@ -18515,9 +20064,9 @@ } }, "entities": { - "version": "2.0.3", - "resolved": "http://94.130.170.209:4873/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.1.0", + "resolved": "http://94.130.170.209:4873/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "env-ci": { "version": "5.5.0", @@ -18530,6 +20079,11 @@ "java-properties": "^1.0.0" } }, + "envinfo": { + "version": "7.8.1", + "resolved": "http://94.130.170.209:4873/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" + }, "error-ex": { "version": "1.3.2", "resolved": "http://94.130.170.209:4873/error-ex/-/error-ex-1.3.2.tgz", @@ -18581,6 +20135,11 @@ "isarray": "^2.0.5" } }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "http://94.130.170.209:4873/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, "es-to-primitive": { "version": "1.2.1", "resolved": "http://94.130.170.209:4873/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -18597,11 +20156,170 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "esbuild": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild/-/esbuild-0.14.38.tgz", + "integrity": "sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==", + "requires": { + "esbuild-android-64": "0.14.38", + "esbuild-android-arm64": "0.14.38", + "esbuild-darwin-64": "0.14.38", + "esbuild-darwin-arm64": "0.14.38", + "esbuild-freebsd-64": "0.14.38", + "esbuild-freebsd-arm64": "0.14.38", + "esbuild-linux-32": "0.14.38", + "esbuild-linux-64": "0.14.38", + "esbuild-linux-arm": "0.14.38", + "esbuild-linux-arm64": "0.14.38", + "esbuild-linux-mips64le": "0.14.38", + "esbuild-linux-ppc64le": "0.14.38", + "esbuild-linux-riscv64": "0.14.38", + "esbuild-linux-s390x": "0.14.38", + "esbuild-netbsd-64": "0.14.38", + "esbuild-openbsd-64": "0.14.38", + "esbuild-sunos-64": "0.14.38", + "esbuild-windows-32": "0.14.38", + "esbuild-windows-64": "0.14.38", + "esbuild-windows-arm64": "0.14.38" + } + }, + "esbuild-android-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz", + "integrity": "sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==", + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz", + "integrity": "sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==", + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz", + "integrity": "sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==", + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz", + "integrity": "sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==", + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz", + "integrity": "sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==", + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz", + "integrity": "sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==", + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz", + "integrity": "sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==", + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz", + "integrity": "sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==", + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz", + "integrity": "sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==", + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz", + "integrity": "sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==", + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz", + "integrity": "sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==", + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz", + "integrity": "sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==", + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz", + "integrity": "sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==", + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz", + "integrity": "sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==", + "optional": true + }, + "esbuild-loader": { + "version": "2.18.0", + "resolved": "http://94.130.170.209:4873/esbuild-loader/-/esbuild-loader-2.18.0.tgz", + "integrity": "sha512-AKqxM3bI+gvGPV8o6NAhR+cBxVO8+dh+O0OXBHIXXwuSGumckbPWHzZ17subjBGI2YEGyJ1STH7Haj8aCrwL/w==", + "requires": { + "esbuild": "^0.14.6", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^2.2.0" + } + }, + "esbuild-netbsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz", + "integrity": "sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==", + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz", + "integrity": "sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==", + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz", + "integrity": "sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==", + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz", + "integrity": "sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==", + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz", + "integrity": "sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==", + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.38", + "resolved": "http://94.130.170.209:4873/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz", + "integrity": "sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==", + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "http://94.130.170.209:4873/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -18890,7 +20608,6 @@ "version": "5.1.1", "resolved": "http://94.130.170.209:4873/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -18964,7 +20681,6 @@ "version": "4.3.0", "resolved": "http://94.130.170.209:4873/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -18972,16 +20688,14 @@ "estraverse": { "version": "5.3.0", "resolved": "http://94.130.170.209:4873/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" } } }, "estraverse": { "version": "4.3.0", "resolved": "http://94.130.170.209:4873/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", @@ -18994,6 +20708,11 @@ "resolved": "http://94.130.170.209:4873/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "events": { + "version": "3.3.0", + "resolved": "http://94.130.170.209:4873/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "http://94.130.170.209:4873/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -19007,7 +20726,6 @@ "version": "5.1.1", "resolved": "http://94.130.170.209:4873/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -19020,6 +20738,12 @@ "strip-final-newline": "^2.0.0" } }, + "expose-loader": { + "version": "3.1.0", + "resolved": "http://94.130.170.209:4873/expose-loader/-/expose-loader-3.1.0.tgz", + "integrity": "sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==", + "requires": {} + }, "express": { "version": "4.17.2", "resolved": "http://94.130.170.209:4873/express/-/express-4.17.2.tgz", @@ -19109,8 +20833,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "http://94.130.170.209:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -19134,8 +20857,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "http://94.130.170.209:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -19143,6 +20865,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "http://94.130.170.209:4873/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" + }, "fastq": { "version": "1.13.0", "resolved": "http://94.130.170.209:4873/fastq/-/fastq-1.13.0.tgz", @@ -19401,6 +21128,7 @@ "version": "9.1.0", "resolved": "http://94.130.170.209:4873/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -19471,8 +21199,7 @@ "get-stream": { "version": "6.0.1", "resolved": "http://94.130.170.209:4873/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { "version": "1.0.0", @@ -19584,6 +21311,11 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "http://94.130.170.209:4873/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "global-dirs": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/global-dirs/-/global-dirs-3.0.0.tgz", @@ -19965,8 +21697,7 @@ "human-signals": { "version": "2.1.0", "resolved": "http://94.130.170.209:4873/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.6.3", @@ -20024,6 +21755,15 @@ "resolved": "http://94.130.170.209:4873/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, + "import-local": { + "version": "3.1.0", + "resolved": "http://94.130.170.209:4873/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "http://94.130.170.209:4873/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -20064,6 +21804,11 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "2.2.0", + "resolved": "http://94.130.170.209:4873/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, "into-stream": { "version": "6.0.0", "resolved": "http://94.130.170.209:4873/into-stream/-/into-stream-6.0.0.tgz", @@ -20378,6 +22123,11 @@ "resolved": "http://94.130.170.209:4873/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "3.0.1", + "resolved": "http://94.130.170.209:4873/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, "isomorphic-ws": { "version": "4.0.1", "resolved": "http://94.130.170.209:4873/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -20502,6 +22252,36 @@ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, + "jest-worker": { + "version": "27.5.1", + "resolved": "http://94.130.170.209:4873/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "http://94.130.170.209:4873/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joycon": { + "version": "3.1.1", + "resolved": "http://94.130.170.209:4873/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==" + }, + "jquery": { + "version": "3.6.0", + "resolved": "http://94.130.170.209:4873/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "js-base64": { "version": "2.6.4", "resolved": "http://94.130.170.209:4873/js-base64/-/js-base64-2.6.4.tgz", @@ -20553,8 +22333,7 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "http://94.130.170.209:4873/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -20571,8 +22350,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "http://94.130.170.209:4873/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -20590,7 +22368,6 @@ "version": "2.2.0", "resolved": "http://94.130.170.209:4873/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -20712,8 +22489,7 @@ "kind-of": { "version": "6.0.3", "resolved": "http://94.130.170.209:4873/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "klaw-sync": { "version": "6.0.0", @@ -20801,6 +22577,28 @@ } } }, + "loader-runner": { + "version": "4.3.0", + "resolved": "http://94.130.170.209:4873/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "http://94.130.170.209:4873/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "http://94.130.170.209:4873/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + } + } + }, "locate-path": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/locate-path/-/locate-path-2.0.0.tgz", @@ -20948,6 +22746,11 @@ "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "http://94.130.170.209:4873/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "lodash.throttle": { "version": "4.1.1", "resolved": "http://94.130.170.209:4873/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -21081,15 +22884,22 @@ "dev": true }, "markdown-it": { - "version": "11.0.1", - "resolved": "http://94.130.170.209:4873/markdown-it/-/markdown-it-11.0.1.tgz", - "integrity": "sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==", + "version": "12.3.2", + "resolved": "http://94.130.170.209:4873/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "http://94.130.170.209:4873/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } } }, "marked": { @@ -21173,8 +22983,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -21232,8 +23041,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "http://94.130.170.209:4873/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -21665,8 +23473,7 @@ "node-releases": { "version": "2.0.1", "resolved": "http://94.130.170.209:4873/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "nodemon": { "version": "2.0.15", @@ -23865,7 +25672,6 @@ "version": "4.0.1", "resolved": "http://94.130.170.209:4873/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "requires": { "path-key": "^3.0.0" } @@ -24178,7 +25984,6 @@ "version": "5.1.2", "resolved": "http://94.130.170.209:4873/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -24367,8 +26172,7 @@ "path-key": { "version": "3.1.1", "resolved": "http://94.130.170.209:4873/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -24418,8 +26222,7 @@ "picocolors": { "version": "1.0.0", "resolved": "http://94.130.170.209:4873/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -24446,7 +26249,6 @@ "version": "4.2.0", "resolved": "http://94.130.170.209:4873/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "requires": { "find-up": "^4.0.0" }, @@ -24455,7 +26257,6 @@ "version": "4.1.0", "resolved": "http://94.130.170.209:4873/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -24465,7 +26266,6 @@ "version": "5.0.0", "resolved": "http://94.130.170.209:4873/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -24474,7 +26274,6 @@ "version": "2.3.0", "resolved": "http://94.130.170.209:4873/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -24483,7 +26282,6 @@ "version": "4.1.0", "resolved": "http://94.130.170.209:4873/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -24491,14 +26289,12 @@ "p-try": { "version": "2.2.0", "resolved": "http://94.130.170.209:4873/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "path-exists": { "version": "4.0.0", "resolved": "http://94.130.170.209:4873/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" } } }, @@ -24543,6 +26339,11 @@ "fast-diff": "^1.1.2" } }, + "prismjs": { + "version": "1.28.0", + "resolved": "http://94.130.170.209:4873/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "http://94.130.170.209:4873/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -24628,8 +26429,7 @@ "punycode": { "version": "2.1.1", "resolved": "http://94.130.170.209:4873/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.1.1", @@ -24874,6 +26674,14 @@ "picomatch": "^2.0.4" } }, + "rechoir": { + "version": "0.7.1", + "resolved": "http://94.130.170.209:4873/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "requires": { + "resolve": "^1.9.0" + } + }, "redent": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/redent/-/redent-3.0.0.tgz", @@ -25022,13 +26830,27 @@ "version": "1.21.0", "resolved": "http://94.130.170.209:4873/resolve/-/resolve-1.21.0.tgz", "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "http://94.130.170.209:4873/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "http://94.130.170.209:4873/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "http://94.130.170.209:4873/resolve-from/-/resolve-from-4.0.0.tgz", @@ -25118,6 +26940,16 @@ "big.js": "^3.1.3" } }, + "schema-utils": { + "version": "3.1.1", + "resolved": "http://94.130.170.209:4873/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "scryptsy": { "version": "2.1.0", "resolved": "http://94.130.170.209:4873/scryptsy/-/scryptsy-2.1.0.tgz", @@ -25291,6 +27123,24 @@ } } }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "http://94.130.170.209:4873/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + }, + "dependencies": { + "randombytes": { + "version": "2.1.0", + "resolved": "http://94.130.170.209:4873/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + } + } + }, "serve-static": { "version": "1.14.2", "resolved": "http://94.130.170.209:4873/serve-static/-/serve-static-1.14.2.tgz", @@ -25321,11 +27171,18 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "http://94.130.170.209:4873/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -25333,8 +27190,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "http://94.130.170.209:4873/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -25493,11 +27349,25 @@ "bignumber.js": "^9.0.0" } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "http://94.130.170.209:4873/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, "source-map": { "version": "0.6.1", "resolved": "http://94.130.170.209:4873/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-support": { + "version": "0.5.21", + "resolved": "http://94.130.170.209:4873/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "spawn-error-forwarder": { "version": "1.0.0", "resolved": "http://94.130.170.209:4873/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", @@ -26051,8 +27921,7 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "http://94.130.170.209:4873/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-indent": { "version": "3.0.0", @@ -26069,6 +27938,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "style-loader": { + "version": "3.3.1", + "resolved": "http://94.130.170.209:4873/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} + }, "supports-color": { "version": "7.2.0", "resolved": "http://94.130.170.209:4873/supports-color/-/supports-color-7.2.0.tgz", @@ -26090,8 +27965,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "http://94.130.170.209:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "table": { "version": "6.8.0", @@ -26126,6 +28000,11 @@ } } }, + "tapable": { + "version": "2.2.1", + "resolved": "http://94.130.170.209:4873/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, "tape": { "version": "5.4.0", "resolved": "http://94.130.170.209:4873/tape/-/tape-5.4.0.tgz", @@ -26195,6 +28074,72 @@ } } }, + "terser": { + "version": "5.13.0", + "resolved": "http://94.130.170.209:4873/terser/-/terser-5.13.0.tgz", + "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.8.0-beta.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "http://94.130.170.209:4873/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + }, + "commander": { + "version": "2.20.3", + "resolved": "http://94.130.170.209:4873/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "http://94.130.170.209:4873/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "http://94.130.170.209:4873/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "http://94.130.170.209:4873/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "http://94.130.170.209:4873/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "http://94.130.170.209:4873/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "requires": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "http://94.130.170.209:4873/test-exclude/-/test-exclude-6.0.0.tgz", @@ -26496,7 +28441,6 @@ "version": "4.4.1", "resolved": "http://94.130.170.209:4873/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -26580,12 +28524,121 @@ "extsprintf": "^1.2.0" } }, + "watchpack": { + "version": "2.3.1", + "resolved": "http://94.130.170.209:4873/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "http://94.130.170.209:4873/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", "dev": true }, + "webpack": { + "version": "5.72.0", + "resolved": "http://94.130.170.209:4873/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "http://94.130.170.209:4873/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "http://94.130.170.209:4873/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "http://94.130.170.209:4873/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + } + } + }, + "webpack-cli": { + "version": "4.9.2", + "resolved": "http://94.130.170.209:4873/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "http://94.130.170.209:4873/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "http://94.130.170.209:4873/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "dependencies": { + "wildcard": { + "version": "2.0.0", + "resolved": "http://94.130.170.209:4873/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + } + } + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "http://94.130.170.209:4873/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + }, "whatwg-url": { "version": "5.0.0", "resolved": "http://94.130.170.209:4873/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -26600,7 +28653,6 @@ "version": "2.0.2", "resolved": "http://94.130.170.209:4873/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index c36395f..b9be882 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@psf/bch-js": "^4.20.7", - "apidoc": "^0.26.0", + "apidoc": "0.50.5", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", "body-parser": "^1.18.3", From 7459f7aff6ebcb6f22cd952b561dfddd2ff197c4 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:06:12 -0700 Subject: [PATCH 15/32] Editing readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 563c21f..bb7c5e6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,10 @@ [![License](https://img.shields.io/npm/l/@psf/bch-js)](https://github.com/Permissionless-Software-Foundation/bch-js/blob/master/LICENSE.md) [![js-standard-style](https://img.shields.io/badge/javascript-standard%20code%20style-green.svg?style=flat-square)](https://github.com/feross/standard) -This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for working with a Bitcoin Cash full node and various indexers. See [this article](https://psfoundation.cash/blog/cash-stack) to learn about the 'Cash Stack'. Visit [FullStack.cash](https://fullstack.cash), sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. +This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. +- High-level documentation is available on [CashStack.info](https://cashstack.info). + +While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. From 7a3e03c4b7d82a10bf38bca8c562637cca2e0bfd Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:09:52 -0700 Subject: [PATCH 16/32] Editing readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bb7c5e6..7fe0f8e 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ [![License](https://img.shields.io/npm/l/@psf/bch-js)](https://github.com/Permissionless-Software-Foundation/bch-js/blob/master/LICENSE.md) [![js-standard-style](https://img.shields.io/badge/javascript-standard%20code%20style-green.svg?style=flat-square)](https://github.com/feross/standard) -This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. +This is a REST API server, written in node.js JavaScript, using the [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. - High-level documentation is available on [CashStack.info](https://cashstack.info). -While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. +While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. From 776628ae9ef18ba683fd9f6604b7dc08b3c2bef2 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:22:09 -0700 Subject: [PATCH 17/32] Editing readme --- README.md | 16 ++++++++++------ diagrams/bch-api-dependency-graph.dia | Bin 0 -> 1433 bytes diagrams/bch-api-dependency-graph.png | Bin 0 -> 13529 bytes 3 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 diagrams/bch-api-dependency-graph.dia create mode 100644 diagrams/bch-api-dependency-graph.png diff --git a/README.md b/README.md index 7fe0f8e..31764e7 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,21 @@ This is a REST API server, written in node.js JavaScript, using the [Express.js] While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. -This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. +This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available. And the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. -![Cash Stack Network Diagram](./generic-network-diagram.png) +![bch-api dependency diagram](./diagrams/bch-api-dependency-graph.png) -Both bch-api and bch-js are part of the 'Cash Stack' [full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). +Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). -- [API Documentation](https://fullstack.cash/documentation) -- [Example Code](https://fullstack.cash/examples) +- [CashStack](https://cashstack.info) high-level documentation. +- [bch-api REST API reference](https://api.fullstack.cash/docs/) +- [bch-js JavaScript API reference](https://bchjs.fullstack.cash/) +- [bch-js example code](https://github.com/Permissionless-Software-Foundation/bch-js-examples) +- [Additional documentation on FullStack.cash](https://fullstack.cash/documentation) +- [Additional examples on FullStack.cash](https://fullstack.cash/examples) Have questions? Need help? Join our community support: -[Telegram channel](https://t.me/bch_js_toolkit) +- [Telegram channel](https://t.me/bch_js_toolkit) ## Features The following features set this repository apart from rest.bitcoin.com: diff --git a/diagrams/bch-api-dependency-graph.dia b/diagrams/bch-api-dependency-graph.dia new file mode 100644 index 0000000000000000000000000000000000000000..cb131ae4eae14233c8cc16f22b3140ef3beecc4a GIT binary patch literal 1433 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 Nw!F&Cyz53!{|ANHM}`0Z literal 0 HcmV?d00001 From db0a4c466a64e7604188a880be3598be7f3bcfbe Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:52:03 -0700 Subject: [PATCH 18/32] fix(README): Updating README --- README.md | 55 ++++++++++++++------------ diagrams/bch-api-dependency-graph.dia | Bin 1433 -> 1488 bytes diagrams/bch-api-dependency-graph.png | Bin 13529 -> 13865 bytes diagrams/donation-qr.png | Bin 0 -> 2028 bytes start-dev-example.sh | 18 ++------- 5 files changed, 33 insertions(+), 40 deletions(-) create mode 100644 diagrams/donation-qr.png diff --git a/README.md b/README.md index 31764e7..9a9827f 100644 --- a/README.md +++ b/README.md @@ -24,34 +24,19 @@ Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). Have questions? Need help? Join our community support: - [Telegram channel](https://t.me/bch_js_toolkit) -## Features -The following features set this repository apart from rest.bitcoin.com: - -- Fine grain access is controlled with a JWT token using -[this back end auth server](https://github.com/Permissionless-Software-Foundation/jwt-bch-api) and [this front end](https://github.com/Permissionless-Software-Foundation/jwt-bch-frontend). Can be used to monetize access to the REST API. -- Typescript removed and ES8 JavaScript used instead. -- `npm audit fix` frequently run to fix dependencies. - -## Live Demo -You can test a live demo of the REST API by running the -[bch-js examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples). -Rate limits are 20 requests per minute, but you can increase them to 100 with a [paid account](https://fullstack.cash/pricing). -You can bootstrap your own REST API server by downloading and installing the infrastructure listed on the [CashStrap](https://fullstack.cash/cashstrap) page. - ### Configure bch-js The live servers can be used by [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) by settings the `restURL` config property to one of these servers: -- BCHN Mainnet REST API server: https://bchn.fullstack.cash/v4/ -- ABC Mainnet REST API server: https://abc.fullstack.cash/v4/ -- Testnet3 REST API server: https://testnet3.fullstack.cash/v4/ +- BCH Mainnet REST API server: https://bchn.fullstack.cash/v5/ +- eCash Mainnet REST API server: https://abc.fullstack.cash/v5/ - Check server status: https://metrics.fullstack.cash ## Installation There are two installation paths, depending if you want a *development* or *production* environment. You'll also need to set up the underlying infrastructure -described on [this page](https://psfoundation.cash/blog/cash-stack). +described on [CashStack.info](https://cashstack.info). -This code targets the Ubuntu 18.04 LTS Linux OS or higher. +This hardware target for this software is a PC running Ubuntu 18.04 LTS Linux OS or higher. ### Development This is a standard node.js project. The installation is as follows: @@ -76,7 +61,7 @@ For a production environment, a Docker container is provided in the containers target the Ubuntu 18.04 LTS Linux OS. - Install Docker and Docker Compose by following the commands on -[this Dev Ops page](https://troutsblog.com/research/dev-ops/overview). +[this Dev Ops page](https://bafybeidpuq6pgpryd22wwykhqh2etw44pzofuncm5ldczk5v733tkwk55y.ipfs.dweb.link/docs/dev-ops/overview). - Customize the [bash script](docker/mainnet/start-local-mainnet.sh) for your installation. @@ -90,7 +75,13 @@ installation. `docker-compose up` ## Rate Limits -The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: +Rate limiting of the REST API can be controlled in three different ways: + - JWT tokens for individual users + - Basic Authentication tokens for company-wide usage. + - Whitelisting for specific domain names + +### JWT Tokens +The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: - `Authorization: Token ` @@ -103,12 +94,24 @@ export BCHJSTOKEN=eyJhbGciOiJ.... curl "https://bchn.fullstack.cash/v4/electrumx/balance/bitcoincash:qr69kyzha07dcecrsvjwsj4s6slnlq4r8c30lxnur3" -X GET -H "Content-Type: application/json" -H "Authorization: Token ${BCHJSTOKEN}" ``` -## Support -Have questions? Need help? Join our community support -[Telegram channel](https://t.me/bch_js_toolkit) +### Basic Authentication +For private installations, Basic Authentication can be used to give everyone in an organization access to higher rate limits, while restricting use by the public. More than one Basic Authentication password can be generated by using the colon `:` to separate entries in the `PRO_PASS` environment variable. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. -## IPFS -Copies of this repository will occasionally be uploaded and hosted on [IPFS](https://ipfs.io): +### Whitelists +Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. + +## Donate + +The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers: + +
+ +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

+
+ + +## Censorship Resistance +Copies of this repository will occasionally be uploaded and hosted on the Filecoin blockchain, [IPFS](https://ipfs.io), and the [Radicle](https://radicle.xyz) p2p network. - v1.25.1: [QmXFzFJHenymhReDc9oGAxbpmvK2fJYnisQ2pJn3gGyKKX](https://ipfs.io/ipfs/QmXFzFJHenymhReDc9oGAxbpmvK2fJYnisQ2pJn3gGyKKX) diff --git a/diagrams/bch-api-dependency-graph.dia b/diagrams/bch-api-dependency-graph.dia index cb131ae4eae14233c8cc16f22b3140ef3beecc4a..1193c5bb05aa7663a6477e7340eb2dcf0463619c 100644 GIT binary patch literal 1488 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

QXUC0y&Xdd^pzDz2Lh5PI@el)DHf%l|DcVY3g) zPljc~77+M3L-a{ZR&pXOAzcW{PZYz;7+{BTfU`m016H^J?zet3(3D~MdI-Rt_Ay${ z9uKSRP~DVNcvzK*|KDT0&nW=faRRcTH|DXFVUat9ClaJpc-C+UzB&J*Z>zS0VK<(2 zJVna^#b`YV+(6Wrr+0oxUa{d}kRo%~PKIox2^Qm%X!LS52T*$=uo0g}?0}iSzt$BY zI#H{9^~lN+gVPljxssc~BhlXsx=$y>`Oz(BS-6}vL~qEl_<6$l6WMriWJLXF zF8Ym}gU3=$pcnm7e$uT0Bcy=Ei44)fzyuQE;@NKo4k!#SEnq}SSyW;bKy&DmLJB@K z-E-`7;;W*53g`SfNq0op4gLdXzW9~=fPKyRVSboGVl$ohUjJ>Aye>-i+H3C(EK8R z=cj1DFaX~2fW^Ixd34}Sut9)@;Z4}_%p%+UkLf)dP{CloQ=BHstQ;)U~%{golRiq7<5O9Sqc* z%~uAvct$J_I|08#3-(@}iZGfvOpaOA*I@B|I0;1dE1>-^_aC?;MS?F4aT%h`WhQkA z1ZoYvM5I4x9*TaZGM%_J#PzwZHQ=GC=tAwsG?^H+cXU7@;OlZ5Z=fzq69`UOu7-Xy zc+KQs_}T>fl8GXDoPG7EK`YQsV8D{ zYU0VfY7tXlqFu7@m0TM^ZA~H;s#)?8_bo}zWHCh8eIcWdk)F0KOAHuVl52`Idlu`Lh}%hOJ4YCAqm%E~9TuP>t$d}iY47TK zW#j#`jzy5V2`qgGmbd{M0SL>{hyMu%J-wca%F0BPe!6~z9-SnBe5jD|V3z)Pr+|s$ zg22bckR!{+_!onyfn-q(o9WG_KtKTx_uatM;jU&#UR`XQFzE_@PWf2v}88^ zEmT=-)PnUx zLy{5_dix^6h-+a07N$iJ8;lLvjPn2eA5Z*GTgi3!dF21XL~HFV;xqHFAAjsf-g(XG Wz)pXi4}SZFke9{Eq+d07^uGYldSDm; literal 13529 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 Nw!F&Cyz53!{|ANHM}`0Z diff --git a/diagrams/donation-qr.png b/diagrams/donation-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..a0efbbfa12fcfcbbdb8e67be2177f2d244c365a2 GIT binary patch literal 2028 zcmb7Fdr(tX9*%Gg7YF3R6g9YPFWp3U0k!fFotVOfAjTk|gjW$kOiYVeOA(0j_KL_R zY9r7f6vBYKQdU&xDg=Zwfi`WW86Zkii8L(lrJ)EI9tHPYm_BD`XZpvz=Qrp4&hPPk z-#O>c2o9s4`NF+iY-G~8~dE@WWnrgPnaptKCqcLjk$Q_|Nc>_x&!&>tGIm=g8a>Dl~=W?Yn-*j=^! zeON0EM^!wTVrvbfsWqS48H2*To`r^oen`HrDhoZC8h>#oE4RZ7sm$E1d$0XN)b`rb zZi{~{VTR}3@|@*A`}5e|kIgQl?(PG|7{^GP*tfPpa=E_EELfX|%yyuMk6IcTx4x8S z-?AcOadA!49h?VLW~-p6)n6S)(HLvTY04XGNmMzPF$AJ0@~K>92MXgBI+jg?J_doX z90S!{8~-MZqdvks5a_d{1<|TwiXp}7s)siM-5hD2?$GFH4x^Xfw{NRx7s;%t+d&=u zdZ(qjaSGP(n}rvW4$i>sv!O+H0kdCeN;hDl=}YKpYP?FCeUMA!$ZViFSWzqhEM)?g z%7=UzgZ4btngsNhQ=g`ubL4)`dv>31 z_WXRX1AX_i8w~mnvX3@t-`6HjX)pbKRWx$aqc1w_x`nM#l~!Yd`4?^l_+bcFD|AFU z6E9i=8^WaNHL($jWm27){gXQjG<{;S+ufll-UH_e`ZsAaz$d4H#~SPy6@P%jE(N>T zOPlvar$LycToBPKytg>?7eEA{xKsJ1CjMn9!g4f zv%(OnB`$ExEf#&w5my>$K3zJOq$iBK1!SU<3i=m$*??E{FbM|(P%eJ(h@`%X)8DO8 zedku_ueRma5sm;LFaUslHp8Dr6uQ~EyIhQV(ZbF@#ft(fa>ZmL1-KxU^4$P@PSm{C z0tAP9IYMpp{p1tlBFfZXkDehHHQF+wU((D$$mX81V0B?S3up#AH#er4a~*D)Ga|By5LaMmiEdwGlKJx+kiY zN3MDmm$xV%e{W7uU9b4;9a+lPQSGF4#URX((}2rSfdBob?L^+z5Q#o^$f5T2Z}gbq zrANxX+0tTBH0%f}a5jt<2vt(r_1AomiNPz!8$<+`jp zt!6X{Z}QAl6kad z@{Y<_t!71D=y5)ju@xMTG!Lj~p}xWsnz``*t%tnKuF0h@=4#%G-0M`c{PEdZzNaY= zb8lmmYY>rZPS9_`A(&@8b2qgGB4DeNyS=*hy^5=-uggfBk4RG6ip!d>24`LsuwY!J z{x~)HZ7<{MW^e;RH_JkdQ=eoRR_wuz2EXB1XVAX8LAOljvb_;zMyRf_&qQGawI+Lz8^KhU{GG{Ue9?QQC|4t zz;q9yye+fAgGV>wXl~cKOGSC;!82FlDT)jhacMBgfL-8UqDh)w+yo{laKaX#u!Q6N zkH(yiY&;h1&^s=S;y-aeBwyf-p_X`Vn-2mVSQESCw};L~dHmJ2mt%9KOM>d0lw(dW zLUEKlC|93}Lsel6R_>*3H^kFzFzgZ(XcLR({ClWnj|py}$:12300/ -# Use the same address as SLPDB_URL if you don't have a separate whitelist server. -export SLPDB_PASS_WL=somelongpassword -export SLPDB_WHITELIST_URL=http://:12300/ -# slp-api alternative SLP validator using slp-validate: -# https://github.com/Permissionless-Software-Foundation/slp-api -export SLP_API_URL=http://10.0.0.5:5001/ +# psf-slp-indxer +export SLP_INDEXER_API=http://:/ # Mainnet Fulcrum / ElectrumX -export FULCRUM_URL=192.168.0.6 -export FULCRUM_PORT=50002 -# Fulcrum API (used for /v5+ routes) export FULCRUM_API=http://172.17.0.1:3001/v1/ # Redis DB - Used for rate limiting - customize to your own Redis installation. @@ -46,7 +36,7 @@ export REDIS_HOST=172.17.0.1 export TOKENSECRET=somelongpassword # So that bch-api can call bch-js locally. -export LOCAL_RESTURL=http://127.0.0.1:3000/v4/ +export LOCAL_RESTURL=http://127.0.0.1:3000/v5/ # Basic Authentication password export PRO_PASS=somerandomepassword:someotherrandompassword:aThirdPassword From 92c257ceb30046661830a2f5abed305cbfe13002 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:59:01 -0700 Subject: [PATCH 19/32] Updating README --- LICENSE.md | 2 +- README.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index cdcc7fd..f442d31 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Permissionless Software Foundation +Copyright (c) 2022 Permissionless Software Foundation developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9a9827f..6797158 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,12 @@ This is a REST API server, written in node.js JavaScript, using the [Express.js] While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. -This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available. And the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. +This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available, and the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. ![bch-api dependency diagram](./diagrams/bch-api-dependency-graph.png) -Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). +## Documentation +All the software above is part of the [Cash Stack](https://cashstack.info). - [CashStack](https://cashstack.info) high-level documentation. - [bch-api REST API reference](https://api.fullstack.cash/docs/) @@ -72,16 +73,16 @@ installation. - Run the Docker container with: -`docker-compose up` +`docker-compose up -d` ## Rate Limits Rate limiting of the REST API can be controlled in three different ways: - JWT tokens for individual users - - Basic Authentication tokens for company-wide usage. + - Basic Authentication tokens for organization-wide usage. - Whitelisting for specific domain names ### JWT Tokens -The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: +The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly (without bch-js), you can then include the JWT token in the HTTP header like this: - `Authorization: Token ` @@ -98,14 +99,14 @@ curl "https://bchn.fullstack.cash/v4/electrumx/balance/bitcoincash:qr69kyzha07dc For private installations, Basic Authentication can be used to give everyone in an organization access to higher rate limits, while restricting use by the public. More than one Basic Authentication password can be generated by using the colon `:` to separate entries in the `PRO_PASS` environment variable. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. ### Whitelists -Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. +Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. ## Donate The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers:

- +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

@@ -117,4 +118,3 @@ Copies of this repository will occasionally be uploaded and hosted on the Fileco ## License [MIT](./LICENSE.md) -a From 2b219901bd7a18ad1e6c2bca77c76c43260673c2 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:59:48 -0700 Subject: [PATCH 20/32] Updating README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6797158..c12cf72 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Website domain names can be added to the `WHITELIST_DOMAINS` environment variabl The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers:
- +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

From 77a541733d13bd33b332fe34cf8138c9ee7aa27e Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 12:05:25 -0700 Subject: [PATCH 21/32] fixing readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c12cf72..fb1ac0f 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Website domain names can be added to the `WHITELIST_DOMAINS` environment variabl ## Donate -The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers: +This open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers:
From 777c12776ee3358085589ee51c11b04f9d0e2900 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 2 May 2022 12:18:44 -0700 Subject: [PATCH 22/32] feat(getTokenData): PS002 mutable data retrieval --- src/routes/v5/psf-slp-indexer.js | 13 +++++++++++++ test/v5/psf-slp-indexer.js | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index ebff388..1dc759e 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -225,6 +225,18 @@ class PsfSlpIndexer { } } + /** + * @api {post} /psf/slp/token/data Get token data + * @apiName Get token data + * @apiGroup PSF SLP + * @apiDescription Get mutable and immutable data if the token contains them. + * + * + * @apiExample Example usage: + * curl -H "Content-Type: application/json" -X POST -d '{ "tokenId": "f055256b938f1ecfa270459d6f12c7c8c82b66d3263c03d5074445a2b1a498a3" }' localhost:3000/v5/psf/slp/token/data + * + * + */ // Get mutable and immutable data for a token, if the token was created with // such data. // @@ -276,6 +288,7 @@ class PsfSlpIndexer { res.status(200) return res.json(tokenData) } catch (err) { + console.log('Error in getTokenData(): ', err) return _this.errorHandler(err, res) } } diff --git a/test/v5/psf-slp-indexer.js b/test/v5/psf-slp-indexer.js index 7215a7b..1fe7d7f 100644 --- a/test/v5/psf-slp-indexer.js +++ b/test/v5/psf-slp-indexer.js @@ -498,6 +498,7 @@ describe('#PsfSlpIndexer', () => { assert.property(status, 'chainBlockHeight') }) }) + describe('#errorHandler', () => { it('should handle unexpected errors', () => { sandbox.stub(uut.routeUtils, 'decodeError').returns({ msg: false }) @@ -507,6 +508,7 @@ describe('#PsfSlpIndexer', () => { assert.equal(res.statusCode, 400, 'HTTP status code 400 expected.') assert.property(result, 'error') }) + it('should handle unknow errors', () => { sandbox.stub(uut.routeUtils, 'decodeError').returns({ msg: false }) @@ -516,6 +518,7 @@ describe('#PsfSlpIndexer', () => { assert.property(result, 'error') }) }) + describe('#checkEnvVar', () => { it('should throw errors if SLP_INDEXER_API env var is not provided', () => { const savedSlpIndexerUrl = process.env.SLP_INDEXER_API @@ -533,6 +536,7 @@ describe('#PsfSlpIndexer', () => { process.env.SLP_INDEXER_API = savedSlpIndexerUrl }) }) + describe('#getCIDData', () => { it('should throw errors if cid is not provided', async () => { try { @@ -546,6 +550,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should handle axios error', async () => { try { sandbox.stub(uut.axios, 'get').throws(new Error('test error')) @@ -560,6 +565,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should return cid object data', async () => { sandbox.stub(uut.axios, 'get').resolves({ data: mockData.immutableData }) const cid = 'bafybeigp3bfmj6woms7pywb7s7r6npcdudvsabvzne2chyspxtdendrwmy' @@ -581,6 +587,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should handle bchjs error', async () => { try { sandbox.stub(uut.bchjs.Electrumx, 'txData').throws(new Error('test error')) @@ -595,12 +602,14 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should return data', async () => { sandbox.stub(uut.bchjs.Electrumx, 'txData').resolves({ details: mockData.txData.txData }) const txid = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' const result = await uut.decodeOpReturn(txid) assert.isString(result) }) + it('should return false if data is not found', async () => { sandbox.stub(uut.bchjs.Electrumx, 'txData').resolves({ details: { vout: [] } }) const txid = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' @@ -608,6 +617,7 @@ describe('#PsfSlpIndexer', () => { assert.isFalse(result) }) }) + describe('#getTokenData', async () => { it('should throw 400 error if tokenId is missing', async () => { const result = await uut.getTokenData(req, res) @@ -715,6 +725,7 @@ describe('#PsfSlpIndexer', () => { assert.property(genesisData, 'totalMinted') assert.property(genesisData, 'txs') }) + it('should GET tokens data if immutableData data not found', async function () { req.body.tokenId = 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' @@ -752,6 +763,7 @@ describe('#PsfSlpIndexer', () => { assert.property(genesisData, 'totalMinted') assert.property(genesisData, 'txs') }) + it('should GET tokens data if mutable data not found', async function () { req.body.tokenId = 'a4fb5c2da1aa064e25018a43f9165040071d9e984ba190c222a7f59053af84b2' @@ -790,6 +802,7 @@ describe('#PsfSlpIndexer', () => { assert.property(genesisData, 'txs') }) }) + describe('#getMutableData', () => { it('should throw errors if documentHash is not provided', async () => { try { @@ -803,6 +816,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should throw errors if cid is not provided in OP Return', async () => { try { sandbox.stub(uut, 'decodeOpReturn').resolves('{}') @@ -838,6 +852,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should handle bchjs error', async () => { try { sandbox.stub(uut, 'decodeOpReturn').resolves(mockData.decodedOpReturn) @@ -854,6 +869,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should skip mutable data if was not generated by the MDA private key', async () => { try { sandbox.stub(uut, 'decodeOpReturn').resolves(mockData.decodedOpReturn) @@ -873,6 +889,7 @@ describe('#PsfSlpIndexer', () => { ) } }) + it('should return mutable data', async () => { sandbox.stub(uut, 'decodeOpReturn') .onFirstCall().resolves(mockData.decodedOpReturn) From 805c6da906500f04a2ece8f9bf28209af8af90fb Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sat, 7 May 2022 20:35:50 -0700 Subject: [PATCH 23/32] Updating bch-js --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca099f0..0805e57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@psf/bch-js": "6.2.9", + "@psf/bch-js": "6.2.14", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", @@ -833,9 +833,9 @@ } }, "node_modules/@psf/bch-js": { - "version": "6.2.9", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.9.tgz", - "integrity": "sha512-7oj1+DqiSqOvl5Pn4PdLG+1hSptWqLHLEqen7UvkCL1KSR4qqVaI3m/j3SCHb6nWEZ4HceZalav2AM1LYHDEWg==", + "version": "6.2.14", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz", + "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==", "license": "MIT", "dependencies": { "@chris.troutner/bip32-utils": "1.0.5", @@ -16055,9 +16055,9 @@ } }, "@psf/bch-js": { - "version": "6.2.9", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.9.tgz", - "integrity": "sha512-7oj1+DqiSqOvl5Pn4PdLG+1hSptWqLHLEqen7UvkCL1KSR4qqVaI3m/j3SCHb6nWEZ4HceZalav2AM1LYHDEWg==", + "version": "6.2.14", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz", + "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==", "requires": { "@chris.troutner/bip32-utils": "1.0.5", "@psf/bip21": "2.0.1", diff --git a/package.json b/package.json index 30f1936..1fbbf6f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "node": ">=10.15.1" }, "dependencies": { - "@psf/bch-js": "6.2.9", + "@psf/bch-js": "6.2.14", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", From a3adf1eab55b1a3c8e9783058f323dbd86f88220 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sat, 7 May 2022 20:49:13 -0700 Subject: [PATCH 24/32] fix(token data): Returning CID and not actual content --- src/routes/v5/psf-slp-indexer.js | 6 ++++-- test/v5/psf-slp-indexer.js | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 1dc759e..9c0d4ab 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -271,7 +271,8 @@ class PsfSlpIndexer { // try to get immutable data try { - const immutableData = await _this.getCIDData(tokenStats.documentUri) + // const immutableData = await _this.getCIDData(tokenStats.documentUri) + const immutableData = tokenStats.documentUri tokenData.immutableData = immutableData } catch (error) { tokenData.immutableData = '' @@ -367,8 +368,9 @@ class PsfSlpIndexer { if (!cid) { throw new Error('CID could not be found in OP_RETURN data') } + const result = cid - const result = await _this.getCIDData(cid) + // const result = await _this.getCIDData(cid) // console.log(`response.data: ${JSON.stringify(response.data, null, 2)}`) return result diff --git a/test/v5/psf-slp-indexer.js b/test/v5/psf-slp-indexer.js index 1fe7d7f..ef9b782 100644 --- a/test/v5/psf-slp-indexer.js +++ b/test/v5/psf-slp-indexer.js @@ -706,8 +706,8 @@ describe('#PsfSlpIndexer', () => { assert.property(result, 'mutableData') assert.isObject(result.genesisData) - assert.isObject(result.immutableData) - assert.isObject(result.mutableData) + // assert.isObject(result.immutableData) + // assert.isObject(result.mutableData) const genesisData = result.genesisData assert.property(genesisData, 'ticker') @@ -745,7 +745,7 @@ describe('#PsfSlpIndexer', () => { assert.isObject(result.genesisData) assert.isObject(result.mutableData) - assert.equal(result.immutableData, '') + // assert.equal(result.immutableData, '') const genesisData = result.genesisData assert.property(genesisData, 'ticker') @@ -782,8 +782,8 @@ describe('#PsfSlpIndexer', () => { assert.property(result, 'mutableData') assert.isObject(result.genesisData) - assert.isObject(result.immutableData) - assert.equal(result.mutableData, '') + // assert.isObject(result.immutableData) + // assert.equal(result.mutableData, '') const genesisData = result.genesisData assert.property(genesisData, 'ticker') @@ -904,7 +904,7 @@ describe('#PsfSlpIndexer', () => { const documentHash = 'c37ba29f40ecc61662ea56324fdb72a5f1e66add2078854c2144765b9030358a' const result = await uut.getMutableData(documentHash) - assert.isObject(result) + assert.isString(result) }) }) }) From f138d32022e96dfeaae165b0a4c96470d87fee41 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 10 May 2022 07:05:34 -0700 Subject: [PATCH 25/32] fix(docker): Limiting size of logging --- docker/mainnet/docker-compose.yml | 50 ++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/docker/mainnet/docker-compose.yml b/docker/mainnet/docker-compose.yml index d5a2b49..02bb2ce 100644 --- a/docker/mainnet/docker-compose.yml +++ b/docker/mainnet/docker-compose.yml @@ -1,19 +1,33 @@ -bch-api-main: - build: . - dockerfile: Dockerfile - #image: bitcore - container_name: bch-api-main - links: - - redis-main - ports: - - "3000:3000" - volumes: - - ../../logs:/home/safeuser/bch-api/logs - restart: always +version: '3.9' -redis-main: - image: redis:latest - container_name: redis-main - restart: always - ports: - - "172.17.0.1:6379:6379" +services: + bch-api-main: + build: + context: ./ + dockerfile: Dockerfile + #image: bitcore + container_name: bch-api-main + links: + - redis-main + ports: + - "3000:3000" + volumes: + - ../../logs:/home/safeuser/bch-api/logs + logging: + driver: 'json-file' + options: + max-size: '10m' + max-file: '10' + restart: always + + redis-main: + image: redis:latest + container_name: redis-main + logging: + driver: 'json-file' + options: + max-size: '10m' + max-file: '10' + restart: always + ports: + - "172.17.0.1:6379:6379" From d1c35044b4d0d493aca5ac82ac7aa9206fdbac4f Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 10 May 2022 14:57:01 -0700 Subject: [PATCH 26/32] fix(getMutableData): Adding additional debuging to console --- src/routes/v5/psf-slp-indexer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 9c0d4ab..90dec15 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -375,8 +375,8 @@ class PsfSlpIndexer { return result } catch (err) { - console.log('Error in getMutableData().') - // console.log('Error in getMutableData(): ', err) + // console.log('Error in getMutableData().') + console.log('Error in getMutableData(): ', err) throw err } } @@ -432,7 +432,7 @@ class PsfSlpIndexer { return response.data } catch (error) { - console.log('Error in getCIDData().') + console.log('Error in getCIDData(): ', err) throw error } } From 8aad3b6b9719875cf071b5027c9787081a05649c Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 10 May 2022 15:10:51 -0700 Subject: [PATCH 27/32] fix(bch-js): Updating to v6.3.4 --- package-lock.json | 14 +++++++------- package.json | 2 +- src/routes/v5/psf-slp-indexer.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0805e57..21027f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@psf/bch-js": "6.2.14", + "@psf/bch-js": "6.3.4", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", @@ -833,9 +833,9 @@ } }, "node_modules/@psf/bch-js": { - "version": "6.2.14", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz", - "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==", + "version": "6.3.4", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.3.4.tgz", + "integrity": "sha512-TgT1R+PUJomdpUUuOY/PDb8Nl6PDbF9qohlbkEv7cvkT1WvkN1Obma4b2tziL45mxhKVM3ASYBgAGw8yURiiXQ==", "license": "MIT", "dependencies": { "@chris.troutner/bip32-utils": "1.0.5", @@ -16055,9 +16055,9 @@ } }, "@psf/bch-js": { - "version": "6.2.14", - "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.2.14.tgz", - "integrity": "sha512-tHF2DyBRgYHTvdhVY58dOzbCOuKQrhc9QvYyj+K4c7mfsVgprjU+FTcM9ZFcE3A+0G/92VBP4/kkfccqfdLlWA==", + "version": "6.3.4", + "resolved": "http://94.130.170.209:4873/@psf%2fbch-js/-/bch-js-6.3.4.tgz", + "integrity": "sha512-TgT1R+PUJomdpUUuOY/PDb8Nl6PDbF9qohlbkEv7cvkT1WvkN1Obma4b2tziL45mxhKVM3ASYBgAGw8yURiiXQ==", "requires": { "@chris.troutner/bip32-utils": "1.0.5", "@psf/bip21": "2.0.1", diff --git a/package.json b/package.json index 1fbbf6f..d659a0f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "node": ">=10.15.1" }, "dependencies": { - "@psf/bch-js": "6.2.14", + "@psf/bch-js": "6.3.4", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 90dec15..2cc0299 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -432,7 +432,7 @@ class PsfSlpIndexer { return response.data } catch (error) { - console.log('Error in getCIDData(): ', err) + console.log('Error in getCIDData(): ', error) throw error } } From 5d9565b1d289143bfeefb16f574d9d83e4568f5e Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 10 May 2022 16:14:55 -0700 Subject: [PATCH 28/32] fix(bch-js): Trying improved bch-js instance in psf-slp-indexer.js --- config/index.js | 4 +++- src/routes/v5/psf-slp-indexer.js | 12 +++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/index.js b/config/index.js index 9012c90..a1ce78a 100644 --- a/config/index.js +++ b/config/index.js @@ -24,7 +24,9 @@ const config = { : 10000, whitelistDomains: process.env.WHITELIST_DOMAINS ? process.env.WHITELIST_DOMAINS.split(',') - : ['fullstack.cash', 'psfoundation.cash', '10.0.'] + : ['fullstack.cash', 'psfoundation.cash', '10.0.'], + + restURL: process.env.LOCAL_RESTURL ? process.env.LOCAL_RESTURL : 'http://127.0.0.1:3000/v5/' } module.exports = config diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 2cc0299..2baf938 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -7,18 +7,16 @@ const express = require('express') const router = express.Router() const axios = require('axios') const util = require('util') +const BCHJS = require('@psf/bch-js') // Local libraries const RouteUtils = require('../../util/route-utils') -const routeUtils = new RouteUtils() - -const BCHJS = require('@psf/bch-js') -const bchjs = new BCHJS() - -// Local libraries -// const wlogger = require('../../../util/winston-logging') const config = require('../../../config') +const routeUtils = new RouteUtils() +const bchjs = new BCHJS({restURL: config.restURL}) + + let _this class PsfSlpIndexer { From 767a0fd38bfcac5dbfee8d953a9d30c71909c6bf Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 15 May 2022 07:51:37 -0700 Subject: [PATCH 29/32] Minor clarification to comment --- src/routes/v5/psf-slp-indexer.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 2baf938..2d3a747 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -315,8 +315,9 @@ class PsfSlpIndexer { // console.log(`mdaTxs: ${JSON.stringify(mdaTxs, null, 2)}`) let data = false - // Maps each transaction of the mutableDataAddr - // if finds an OP_RETURN decode is and closes the loop + // Maps each transaction of the mutableDataAddr. + // If it finds an OP_RETURN, decode it. Exit the loop once the first + // valid mutable data entry is found. // Start with the newest TXID entry and scan the history to find the first // entry with an IPFS CID. for (let i = mdaTxs.length - 1; i > -1; i--) { @@ -345,7 +346,7 @@ class PsfSlpIndexer { // Skip entry if it was not made by the MDA private key. if (mutableDataAddr !== vinAddress) { - console.log('Data is not generated by MDA') + console.log('Data is not generated by MDA, skipping.') data = false continue } From 0d00d340cfe4716752431a09aee10f1ccb090a57 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Fri, 10 Jun 2022 06:46:16 -0700 Subject: [PATCH 30/32] fix(body size): Increasing POST body size allowed --- src/app.js | 4 ++-- src/routes/v5/psf-slp-indexer.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app.js b/src/app.js index 6674225..d8c200c 100644 --- a/src/app.js +++ b/src/app.js @@ -90,8 +90,8 @@ const logStream = { } app.use(logger(morganFormat, { stream: logStream })) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: false })) +app.use(bodyParser.json({ limit: '50mb' })) +app.use(bodyParser.urlencoded({ extended: false, limit: '50mb' })) app.use(cookieParser()) app.use(express.static(path.join(__dirname, 'public'))) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 2d3a747..2ed8c0a 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -14,8 +14,7 @@ const RouteUtils = require('../../util/route-utils') const config = require('../../../config') const routeUtils = new RouteUtils() -const bchjs = new BCHJS({restURL: config.restURL}) - +const bchjs = new BCHJS({ restURL: config.restURL }) let _this From c58e3e0ea9d51fd036f3841987cce8fcb8e8dff5 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 10 Jul 2022 15:33:17 -0700 Subject: [PATCH 31/32] Updating gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4fa0638..907bb49 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,6 @@ logs/* docs/* docker/mainnet/start-local-mainnet.sh docker/testnet/start-local-testnet.sh - +start-local-bchn.sh !logs/README.md From 4f74d9486b7a2638dc8e70db10133e508ac38773 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 10 Jul 2022 18:25:31 -0700 Subject: [PATCH 32/32] fix(psf-slp-indexer getAddress): Letting ecash addrs pass through --- src/routes/v5/psf-slp-indexer.js | 42 +++++++++++++++++--------------- test/v5/psf-slp-indexer.js | 21 ++++++++++++++++ 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/routes/v5/psf-slp-indexer.js b/src/routes/v5/psf-slp-indexer.js index 2ed8c0a..9c6823a 100644 --- a/src/routes/v5/psf-slp-indexer.js +++ b/src/routes/v5/psf-slp-indexer.js @@ -97,27 +97,29 @@ class PsfSlpIndexer { }) } - // Ensure the input is a valid BCH address. - try { - _this.bchjs.SLP.Address.toCashAddress(address) - } catch (err) { - res.status(400) - return res.json({ - success: false, - error: `Invalid BCH address. Double check your address is valid: ${address}` - }) - } + if (!address.includes('ecash')) { + // Ensure the input is a valid BCH address. + try { + _this.bchjs.SLP.Address.toCashAddress(address) + } catch (err) { + res.status(400) + return res.json({ + success: false, + error: `Invalid BCH address. Double check your address is valid: ${address}` + }) + } - // Prevent a common user error. Ensure they are using the correct network address. - const cashAddr = _this.bchjs.SLP.Address.toCashAddress(address) - const networkIsValid = _this.routeUtils.validateNetwork(cashAddr) - if (!networkIsValid) { - res.status(400) - return res.json({ - success: false, - error: - 'Invalid network. Trying to use a testnet address on mainnet, or vice versa.' - }) + // Prevent a common user error. Ensure they are using the correct network address. + const cashAddr = _this.bchjs.SLP.Address.toCashAddress(address) + const networkIsValid = _this.routeUtils.validateNetwork(cashAddr) + if (!networkIsValid) { + res.status(400) + return res.json({ + success: false, + error: + 'Invalid network. Trying to use a testnet address on mainnet, or vice versa.' + }) + } } const response = await _this.axios.post( diff --git a/test/v5/psf-slp-indexer.js b/test/v5/psf-slp-indexer.js index ef9b782..db6b8c3 100644 --- a/test/v5/psf-slp-indexer.js +++ b/test/v5/psf-slp-indexer.js @@ -430,6 +430,27 @@ describe('#PsfSlpIndexer', () => { assert.isArray(balance.txs) assert.isArray(balance.balances) }) + + it('should GET data for ecash address', async function () { + req.body.address = + 'ecash:qr5c4hfy52zn87484cucvzle5pljz0gtr5vhtw9z09' + + // Mock the RPC call for unit tests. + if (process.env.TEST === 'unit') { + sandbox.stub(uut.axios, 'post').resolves({ data: mockData.balance }) + } else { + return this.skip() + } + + const result = await uut.getAddress(req, res) + const balance = result.balance + assert.property(balance, 'utxos') + assert.property(balance, 'txs') + assert.property(balance, 'balances') + assert.isArray(balance.utxos) + assert.isArray(balance.txs) + assert.isArray(balance.balances) + }) }) describe('#getStatus', async () => {