From dfcd203fe77bc61e3693a0b1eec97ded5b20d843 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 07:18:00 -0600 Subject: [PATCH 01/12] chore: base 53:kread on 49 --- proposals/53:kread-start/config.json | 3 + proposals/53:kread-start/core-eval-support.js | 152 ++++++++++++++++++ proposals/53:kread-start/eval.sh | 19 +++ proposals/53:kread-start/package.json | 18 +++ proposals/53:kread-start/test.sh | 18 +++ proposals/53:kread-start/use.sh | 8 + 6 files changed, 218 insertions(+) create mode 100644 proposals/53:kread-start/config.json create mode 100644 proposals/53:kread-start/core-eval-support.js create mode 100644 proposals/53:kread-start/eval.sh create mode 100644 proposals/53:kread-start/package.json create mode 100644 proposals/53:kread-start/test.sh create mode 100644 proposals/53:kread-start/use.sh diff --git a/proposals/53:kread-start/config.json b/proposals/53:kread-start/config.json new file mode 100644 index 00000000..8acfb07d --- /dev/null +++ b/proposals/53:kread-start/config.json @@ -0,0 +1,3 @@ +{ + "type": "/agoric.swingset.CoreEvalProposal" +} diff --git a/proposals/53:kread-start/core-eval-support.js b/proposals/53:kread-start/core-eval-support.js new file mode 100644 index 00000000..61910552 --- /dev/null +++ b/proposals/53:kread-start/core-eval-support.js @@ -0,0 +1,152 @@ +// @ts-check +import { + Far, + makeMarshal, + makeTranslationTable, +} from '../../upgrade-test-scripts/lib/unmarshal.js'; +import { Fail, NonNullish } from '../../upgrade-test-scripts/lib/assert.js'; + +// TODO: factor out ambient authority from these +// or at least allow caller to supply authority. +import { mintIST } from '../../upgrade-test-scripts/lib/econHelpers.js'; +import { agoric } from '../../upgrade-test-scripts/lib/cliHelper.js'; + +// move to unmarshal.js? +const makeBoardUnmarshal = () => { + const synthesizeRemotable = (_slot, iface) => + Far(iface.replace(/^Alleged: /, ''), {}); + + const { convertValToSlot, convertSlotToVal } = makeTranslationTable( + slot => Fail`unknown id: ${slot}`, + synthesizeRemotable, + ); + + return makeMarshal(convertValToSlot, convertSlotToVal); +}; + +export const getContractInfo = async (path, io = {}) => { + const m = makeBoardUnmarshal(); + const { + agoric: { follow = agoric.follow }, + prefix = 'published.', + } = io; + console.log('@@TODO: prevent agoric follow hang', prefix, path); + const txt = await follow('-lF', `:${prefix}${path}`, '-o', 'text'); + const { body, slots } = JSON.parse(txt); + return m.fromCapData({ body, slots }); +}; + +// not really core-eval related +export const testIncludes = (t, needle, haystack, label, sense = true) => { + t.log(needle, sense ? 'in' : 'not in', haystack.length, label, '?'); + const check = sense ? t.deepEqual : t.notDeepEqual; + if (sense) { + t.deepEqual( + haystack.filter(c => c === needle), + [needle], + ); + } else { + t.deepEqual( + haystack.filter(c => c === needle), + [], + ); + } +}; + +/** + * @param {Record} record - e.g. { color: 'blue' } + * @returns {string[]} - e.g. ['--color', 'blue'] + */ +export const flags = record => { + return Object.entries(record) + .map(([k, v]) => [`--${k}`, v]) + .flat(); +}; + +export const txAbbr = tx => { + const { txhash, code, height, gas_used } = tx; + return { txhash, code, height, gas_used }; +}; + +export const loadedBundleIds = swingstore => { + const ids = swingstore`SELECT bundleID FROM bundles`.map(r => r.bundleID); + return ids; +}; + +/** + * @param {string} cacheFn - e.g. /home/me.agoric/cache/b1-DEADBEEF.json + */ +export const bundleDetail = cacheFn => { + const fileName = NonNullish(cacheFn.split('/').at(-1)); + const id = fileName.replace(/\.json$/, ''); + const hash = id.replace(/^b1-/, ''); + return { fileName, endoZipBase64Sha512: hash, id }; +}; + +const importBundleCost = (bytes, price = 0.002) => { + return bytes * price; +}; + +/** + * @typedef {{ + * bundles: string[], + * evals: { permit: string; script: string }[], + * }} ProposalInfo + */ + +const myISTBalance = async (agd, addr, denom = 'uist', unit = 1_000_000) => { + const coins = await agd.query(['bank', 'balances', addr]); + const coin = coins.balances.find(a => a.denom === denom); + return Number(coin.amount) / unit; +}; + +/** + * @param {number} myIST + * @param {number} cost + * @param {{ + * unit?: number, padding?: number, minInitialDebt?: number, + * collateralPrice: number, + * }} opts + * @returns + */ +const mintCalc = (myIST, cost, opts) => { + const { + unit = 1_000_000, + padding = 1, + minInitialDebt = 6, + collateralPrice, + } = opts; + const { round, max } = Math; + const wantMinted = max(round(cost - myIST + padding), minInitialDebt); + const giveCollateral = round(wantMinted / collateralPrice) + 1; + const sendValue = round(giveCollateral * unit); + return { wantMinted, giveCollateral, sendValue }; +}; + +/** + * + * @param {ReturnType} agd + * @param {*} config + * @param {number} bytes total bytes + * @param {{ log: (...args: any[]) => void }} io + * @returns + */ +export const ensureISTForInstall = async (agd, config, bytes, { log }) => { + const cost = importBundleCost(bytes); + log({ totalSize: bytes, cost }); + const { installer } = config; + const addr = agd.lookup(installer); + const istBalance = await myISTBalance(agd, addr); + + if (istBalance > cost) { + log('balance sufficient', { istBalance, cost }); + return; + } + const { sendValue, wantMinted, giveCollateral } = mintCalc( + istBalance, + cost, + config, + ); + log({ wantMinted }); + await mintIST(addr, sendValue, wantMinted, giveCollateral); +}; diff --git a/proposals/53:kread-start/eval.sh b/proposals/53:kread-start/eval.sh new file mode 100644 index 00000000..42d4275d --- /dev/null +++ b/proposals/53:kread-start/eval.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Exit when any command fails +set -e + +source /usr/src/upgrade-test-scripts/env_setup.sh + +ls -al + +yarn install --frozen-lockfile + +# XXX to avoid rebuilding lower layers +# TODO clean up JS lib code so it's more independent +cp package.json yarn.lock /usr/src/upgrade-test-scripts/lib/ +cd /usr/src/upgrade-test-scripts/lib/ && yarn install --frozen-lockfile +cd - + +# XXX using Ava serial to script the core-eval +yarn ava upgrade-wf.test.js diff --git a/proposals/53:kread-start/package.json b/proposals/53:kread-start/package.json new file mode 100644 index 00000000..2ad2b325 --- /dev/null +++ b/proposals/53:kread-start/package.json @@ -0,0 +1,18 @@ +{ + "type": "module", + "license": "Apache-2.0", + "devDependencies": {}, + "dependencies": { + "@endo/zip": "^0.2.35", + "ava": "^5.3.1", + "better-sqlite3": "^8.5.1", + "execa": "^7.2.0", + "tmp": "^0.2.1" + }, + "scripts": { + "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" + }, + "ava": { + "timeout": "30s" + } +} diff --git a/proposals/53:kread-start/test.sh b/proposals/53:kread-start/test.sh new file mode 100644 index 00000000..8c2494e8 --- /dev/null +++ b/proposals/53:kread-start/test.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +source /usr/src/upgrade-test-scripts/env_setup.sh + +testMinChildren() { + path=$1 + min=$2 + line="$(agd query vstorage children $path -o jsonlines)" + ok=$(echo $line | jq ".children | length | . > $min") + test_val "$ok" "true" "$path: more than $min children" +} + +# Check brand aux data for more than just vbank assets +testMinChildren published.boardAux 3 + +# TODO trade game asset diff --git a/proposals/53:kread-start/use.sh b/proposals/53:kread-start/use.sh new file mode 100644 index 00000000..0dc1342b --- /dev/null +++ b/proposals/53:kread-start/use.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Exit when any command fails +set -e + +source /usr/src/upgrade-test-scripts/env_setup.sh + +echo "Nothing to put into chain history for NFT smart wallet per se." From b2b42da227d79f234299f1da48546ba7961adf05 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 07:18:53 -0600 Subject: [PATCH 02/12] chore: copy KREAd proposal test from agoric-sdk agoric-sdk/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/mn2-start.test.js . --- proposals/53:kread-start/mn2-start.test.js | 516 +++++++++++++++++++++ 1 file changed, 516 insertions(+) create mode 100644 proposals/53:kread-start/mn2-start.test.js diff --git a/proposals/53:kread-start/mn2-start.test.js b/proposals/53:kread-start/mn2-start.test.js new file mode 100644 index 00000000..4dd831da --- /dev/null +++ b/proposals/53:kread-start/mn2-start.test.js @@ -0,0 +1,516 @@ +// @ts-check + +/** + * @file mainnet-2 contract start test + * + * Expects several environment variables: + * If $MN2_PROPOSAL_INFO is not set, no tests are run. + * + * $MN2_PROPOSAL_INFO is a directory with the results of + * running `agoric run xyz-script.js` one or more times. + * Note: include the trailing / in the $MN_PROPOSAL_INFO. + * + * Each time, in addition to any *-permit.json and *.js files, + * stdout is parsed with `parseProposals.js` to produce + * a *-info.json file containing... + * + * @typedef {{ + * bundles: string[], + * evals: { permit: string; script: string }[], + * }} ProposalInfo + * + * Only the last path segment of ProposalInfo.bundles is used. + * All bundles must be available in $MN2_PROPOSAL_INFO/bundles/ . + * + * $MN2_INSTANCE is a key in agoricNames.instance + * where the mainnet-2 contract instance is expected to be installed. + * A vstorage node under published by this name is also expected. + */ + +import anyTest from 'ava'; +import * as cpAmbient from 'child_process'; // TODO: use execa +import * as fspAmbient from 'fs/promises'; +import { tmpName as tmpNameAmbient } from 'tmp'; +import * as pathAmbient from 'path'; +import * as processAmbient from 'process'; +import dbOpenAmbient from 'better-sqlite3'; + +// TODO: factor out ambient authority from these +// or at least allow caller to supply authority. +import { mintIST } from '../lib/econHelpers.js'; +import { agoric, wellKnownIdentities } from '../lib/cliHelper.js'; +import { + provisionSmartWallet, + voteLatestProposalAndWait, +} from '../lib/commonUpgradeHelpers.js'; + +import { makeAgd } from '../lib/agd-lib.js'; +import { Far, makeMarshal, makeTranslationTable } from '../lib/unmarshal.js'; +import { Fail, NonNullish } from '../lib/assert.js'; +import { dbTool } from '../lib/vat-status.js'; +import { makeFileRW, makeWebCache, makeWebRd } from '../lib/webAsset.js'; + +/** @typedef {Awaited>} TestContext */ +/** @type {import('ava').TestFn}} */ +const test = anyTest; + +/** + * URLs of release assets, including bundle hashes agreed by BLD stakers + * + * TODO: get permits, scripts from blockchain? + * TODO: verify bundle contents against hashes? + * + * KREAd-rc1 to Mainnet + * voting 2023-09-28 to 2023-10-01 + * https://agoric.explorers.guru/proposal/53 + */ +const releaseInfo = { + url: 'https://github.com/Kryha/KREAd/releases/tag/KREAd-rc1', + /** @type {Record} */ + buildAssets: { + 'kread-committee-info.json': { + evals: [ + { + permit: 'kread-invite-committee-permit.json', + script: 'kread-invite-committee.js', + }, + ], + bundles: [ + '/Users/wietzes/.agoric/cache/b1-51085a4ad4ac3448ccf039c0b54b41bd11e9367dfbd641deda38e614a7f647d7f1c0d34e55ba354d0331b1bf54c999fca911e6a796c90c30869f7fb8887b3024.json', + '/Users/wietzes/.agoric/cache/b1-a724453e7bfcaae1843be4532e18c1236c3d6d33bf6c44011f2966e155bc7149b904573014e583fdcde2b9cf2913cb8b337fc9daf79c59a38a37c99030fcf7dc.json', + ], + }, + 'start-kread-info.json': { + evals: [{ permit: 'start-kread-permit.json', script: 'start-kread.js' }], + bundles: [ + '/Users/wietzes/.agoric/cache/b1-853acd6ba3993f0f19d6c5b0a88c9a722c9b41da17cf7f98ff7705e131860c4737d7faa758ca2120773632dbaf949e4bcce2a2cbf2db224fa09cd165678f64ac.json', + '/Users/wietzes/.agoric/cache/b1-0c3363b8737677076e141a84b84c8499012f6ba79c0871fc906c8be1bb6d11312a7d14d5a3356828a1de6baa4bee818a37b7cb1ca2064f6eecbabc0a40d28136.json', + ], + }, + }, +}; + +const dappAPI = { + instance: 'kread', // agoricNames.instance key + vstorageNode: 'kread', +}; + +const staticConfig = { + deposit: '10000000ubld', // 10 BLD + installer: 'gov1', // as in: agd keys show gov1 + proposer: 'validator', + collateralPrice: 6, // conservatively low price. TODO: look up + swingstorePath: '~/.agoric/data/agoric/swingstore.sqlite', + releaseAssets: releaseInfo.url.replace('/tag/', '/download/') + '/', + buildInfo: Object.values(releaseInfo.buildAssets), + initialCoins: `20000000ubld`, // enough to provision a smartWallet + accounts: { + krgov1: { + address: 'agoric1890064p6j3xhzzdf8daknd6kpvhw766ds8flgw', + mnemonic: + 'loop clump life tattoo action wish loop garbage room custom tooth lunar increase major draw wage bind vanish order behind bounce unknown cry practice', + }, + krgov2: { + address: 'agoric1vqm5x5sj4lxmj2kem7x92tuhaum0k2yzyj6mgu', + mnemonic: + 'expect wheel safe ankle caution vote reduce sell night pencil suit scrap tumble divorce element become result front hurt begin deputy liberty develop next', + }, + kRoyalties: { + address: 'agoric1yjc8llu3fugm7tgqye4rd5n92l9x2dhe30dazp', + mnemonic: + 'talent approve render pool chief inch nuclear minor rhythm laundry praise swift clog neck shoot elder rely junior rule basket energy payment giggle torch', + }, + kPlatform: { + address: 'agoric1enwuyn2hzyyvt39x87tk9rhlkpqtyv9haj7mgs', + mnemonic: + 'magic enrich village office myth depth upper pair april dad visit memory resemble castle lab surface globe debate chair upper army pony moon tone', + }, + }, + ...dappAPI, +}; + +/** + * Provide access to the outside world via t.context. + */ +const makeTestContext = async (io = {}) => { + const { + process: { env } = processAmbient, + child_process: { execFileSync } = cpAmbient, + dbOpen = dbOpenAmbient, + fsp = fspAmbient, + path = pathAmbient, + tmpName = tmpNameAmbient, + } = io; + + const src = makeWebRd(staticConfig.releaseAssets, { fetch }); + const td = await new Promise((resolve, reject) => + tmpName({ prefix: 'assets' }, (err, x) => (err ? reject(err) : resolve(x))), + ); + const dest = makeFileRW(td, { fsp, path }); + td.teardown(() => assets.remove()); + const assets = makeWebCache(src, dest); + + const config = { + assets, + chainId: 'agoriclocal', + ...staticConfig, + }; + + // This agd API is based on experience "productizing" + // the inter bid CLI in #7939 + const agd = makeAgd({ execFileSync: execFileSync }).withOpts({ + keyringBackend: 'test', + }); + + const dbPath = staticConfig.swingstorePath.replace(/^~/, env.HOME); + const swingstore = dbTool(dbOpen(dbPath, { readonly: true })); + + return { agd, agoric, swingstore, config }; +}; + +test.before(async t => (t.context = await makeTestContext())); + +const testIncludes = (t, needle, haystack, label, sense = true) => { + t.log(needle, sense ? 'in' : 'not in', haystack.length, label, '?'); + const check = sense ? t.deepEqual : t.notDeepEqual; + if (sense) { + t.deepEqual( + haystack.filter(c => c === needle), + [needle], + ); + } else { + t.deepEqual( + haystack.filter(c => c === needle), + [], + ); + } +}; + +test.serial(`pre-flight: not in agoricNames.instance`, async t => { + const { config, agoric } = t.context; + const { instance: target } = config; + const { instance } = await wellKnownIdentities({ agoric }); + testIncludes(t, target, Object.keys(instance), 'instance keys', false); +}); + +const makeBoardUnmarshal = () => { + const synthesizeRemotable = (_slot, iface) => + Far(iface.replace(/^Alleged: /, ''), {}); + + const { convertValToSlot, convertSlotToVal } = makeTranslationTable( + slot => Fail`unknown id: ${slot}`, + synthesizeRemotable, + ); + + return makeMarshal(convertValToSlot, convertSlotToVal); +}; + +export const getContractInfo = async (path, io = {}) => { + const m = makeBoardUnmarshal(); + const { + agoric: { follow = agoric.follow }, + prefix = 'published.', + } = io; + console.log('@@TODO: prevent agoric follow hang', prefix, path); + const txt = await follow('-lF', `:${prefix}${path}`, '-o', 'text'); + const { body, slots } = JSON.parse(txt); + return m.fromCapData({ body, slots }); +}; + +// XXX dead code - worth keeping somewhere? +const ensureMintLimit = async (targetNum, manager = 0, unit = 1_000_000) => { + const io = { agoric }; + const [{ current }, metrics] = await Promise.all([ + getContractInfo(`vaultFactory.managers.manager${manager}.governance`, io), + getContractInfo(`vaultFactory.managers.manager${manager}.metrics`, io), + ]); + const { totalDebt } = metrics; + const { + DebtLimit: { value: limit }, + } = current; + const nums = { + total: Number(totalDebt.value) / unit, + limit: Number(limit.value) / unit, + target: targetNum, + }; + nums.target += nums.total; + console.log( + nums, + nums.limit >= nums.target ? 'limit > target' : 'LIMIT TOO LOW', + ); + if (nums.limit >= nums.target) return; + throw Error('raising mint limit not impl'); +}; + +const myISTBalance = async (agd, addr, denom = 'uist', unit = 1_000_000) => { + const coins = await agd.query(['bank', 'balances', addr]); + const coin = coins.balances.find(a => a.denom === denom); + return Number(coin.amount) / unit; +}; + +const importBundleCost = (bytes, price = 0.002) => { + return bytes * price; +}; + +/** + * @param {number} myIST + * @param {number} cost + * @param {{ + * unit?: number, padding?: number, minInitialDebt?: number, + * collateralPrice: number, + * }} opts + * @returns + */ +const mintCalc = (myIST, cost, opts) => { + const { + unit = 1_000_000, + padding = 1, + minInitialDebt = 6, + collateralPrice, + } = opts; + const { round, max } = Math; + const wantMinted = max(round(cost - myIST + padding), minInitialDebt); + const giveCollateral = round(wantMinted / collateralPrice) + 1; + const sendValue = round(giveCollateral * unit); + return { wantMinted, giveCollateral, sendValue }; +}; + +const loadedBundleIds = swingstore => { + const ids = swingstore`SELECT bundleID FROM bundles`.map(r => r.bundleID); + return ids; +}; + +/** + * @param {string} cacheFn - e.g. /home/me.agoric/cache/b1-DEADBEEF.json + */ +const bundleDetail = cacheFn => { + const fileName = NonNullish(cacheFn.split('/').at(-1)); + const id = fileName.replace(/\.json$/, ''); + const hash = id.replace(/^b1-/, ''); + return { fileName, endoZipBase64Sha512: hash, id }; +}; + +test.serial('bundles not yet installed', async t => { + const { swingstore, config } = t.context; + const loaded = loadedBundleIds(swingstore); + const info = staticConfig.buildInfo; + for (const { bundles, evals } of info) { + t.log(evals[0].script, evals.length, 'eval', bundles.length, 'bundles'); + for (const bundle of bundles) { + const { id } = bundleDetail(bundle); + testIncludes(t, id, loaded, 'loaded bundles', false); + } + } +}); + +/** @param {number[]} xs */ +const sum = xs => xs.reduce((a, b) => a + b, 0); + +/** @param {import('../lib/webAsset.js').WebCache} assets */ +const readBundleSizes = async assets => { + const info = staticConfig.buildInfo; + const bundleSizes = await Promise.all( + info + .map(({ bundles }) => + bundles.map(b => assets.size(bundleDetail(b).fileName)), + ) + .flat(), + ); + const totalSize = sum(bundleSizes); + return { bundleSizes, totalSize }; +}; + +const ensureISTForInstall = async (agd, config, { log }) => { + const { proposalDir, installer } = config; + const { bundleSizes, totalSize } = await readBundleSizes(proposalDir); + const cost = importBundleCost(sum(bundleSizes)); + log({ bundleSizes, totalSize, cost }); + + const addr = agd.lookup(installer); + const istBalance = await myISTBalance(agd, addr); + + if (istBalance > cost) { + log('balance sufficient', { istBalance, cost }); + return; + } + const { sendValue, wantMinted, giveCollateral } = mintCalc( + istBalance, + cost, + config, + ); + log({ wantMinted }); + await mintIST(addr, sendValue, wantMinted, giveCollateral); +}; + +test.serial('ensure enough IST to install bundles', async t => { + const { agd, config } = t.context; + await ensureISTForInstall(agd, config, { log: t.log }); + t.pass(); +}); + +const txAbbr = tx => { + const { txhash, code, height, gas_used } = tx; + return { txhash, code, height, gas_used }; +}; + +test.serial('ensure bundles installed', async t => { + const { agd, swingstore, agoric, config, io } = t.context; + const { chainId, assets } = config; + const loaded = loadedBundleIds(swingstore); + const from = agd.lookup(config.installer); + + let todo = 0; + let done = 0; + for (const { bundles } of staticConfig.buildInfo) { + todo += bundles.length; + for (const bundle of bundles) { + const { id, fileName, endoZipBase64Sha512 } = bundleDetail(bundle); + if (loaded.includes(id)) { + t.log('bundle already installed', id); + done += 1; + continue; + } + + const bundleRd = await assets.storedPath(fileName); + const result = await agd.tx( + ['swingset', 'install-bundle', `@${bundleRd}`, '--gas', 'auto'], + { from, chainId, yes: true }, + ); + t.log(txAbbr(result)); + t.is(result.code, 0); + + const info = await getContractInfo('bundles', { agoric, prefix: '' }); + t.log(info); + done += 1; + t.deepEqual(info, { + endoZipBase64Sha512, + error: null, + installed: true, + }); + } + } + t.is(todo, done); +}); + +/** + * @param {Record} record - e.g. { color: 'blue' } + * @returns {string[]} - e.g. ['--color', 'blue'] + */ +const flags = record => { + return Object.entries(record) + .map(([k, v]) => [`--${k}`, v]) + .flat(); +}; + +test.serial('core eval prereqs: provision royalty, gov, ...', async t => { + const { agd, config } = t.context; + const { entries } = Object; + + for (const [name, { address, mnemonic }] of entries(config.accounts)) { + try { + agd.lookup(address); + t.log(name, 'key already added'); + continue; + } catch (_e) {} + t.log('add key', name); + agd.keys.add(name, mnemonic); + } + + for (const [name, { address }] of entries(config.accounts)) { + const walletPath = `published.wallet.${address}`; + const data = await agd.query(['vstorage', 'data', walletPath]); + if (data.value.length > 0) { + t.log(name, 'wallet already provisioned'); + continue; + } + await provisionSmartWallet(address, config.initialCoins); + } + + t.pass(); +}); + +test.serial('core eval proposal passes', async t => { + const { agd, swingstore, config } = t.context; + const from = agd.lookup(config.proposer); + const { chainId, deposit, assets, instance } = config; + const info = { title: instance, description: `start ${instance}` }; + t.log('submit proposal', instance); + + // double-check that bundles are loaded + const loaded = loadedBundleIds(swingstore); + const { buildInfo } = staticConfig; + for (const { bundles } of buildInfo) { + for (const bundle of bundles) { + const { id } = bundleDetail(bundle); + testIncludes(t, id, loaded, 'loaded bundles'); + } + } + + const evalNames = buildInfo + .map(({ evals }) => evals) + .flat() + .map(e => [e.permit, e.script]) + .flat(); + const evalPaths = await Promise.all(evalNames.map(e => assets.storedPath(e))); + t.log(evalPaths); + console.debug('await tx', evalPaths); + const result = await agd.tx( + [ + 'gov', + 'submit-proposal', + 'swingset-core-eval', + ...evalPaths, + ...flags({ ...info, deposit }), + ...flags({ gas: 'auto', 'gas-adjustment': '1.2' }), + ], + { from, chainId, yes: true }, + ); + t.log(txAbbr(result)); + t.is(result.code, 0); + + console.debug('await voteLatestProposalAndWait', evalPaths); + const detail = await voteLatestProposalAndWait(); + t.log(detail.proposal_id, detail.voting_end_time, detail.status); + t.is(detail.status, 'PROPOSAL_STATUS_PASSED'); +}); + +test.serial(`agoricNames.instance is populated`, async t => { + const { config, agoric } = t.context; + const { instance: target } = config; + const { instance, brand } = await wellKnownIdentities({ agoric }); + const present = Object.keys(instance); + testIncludes(t, target, present, 'instance keys'); +}); + +// needs 2 brand names +test.todo(`agoricNames.brand is populated`); +test.todo('boardAux is populated'); + +test.serial('vstorage published.CHILD is present', async t => { + const { agd, config } = t.context; + const { vstorageNode } = config; + const { children } = await agd.query(['vstorage', 'children', 'published']); + testIncludes(t, vstorageNode, children, 'published children'); +}); + +// KREAd specific below here +// TODO refactor this test for re-use across MN2 scripts + +// TODO test this more robustly with the pausing feature +// This doesn't work with mainline KREAd becaues they don't have anything +// to write upon contract start. The pausing test will ensure there's +// a latestQuestion node published. +test.serial('kread commmittee is present', async t => { + const { agd, config } = t.context; + const { vstorageNode } = config; + const { children } = await agd.query([ + 'vstorage', + 'children', + 'published.committees', + ]); + testIncludes(t, 'kread-gov', children, 'published children'); +}); + +test.todo('test contract features- mint character'); +test.todo('test contract governance - pause'); +test.todo('test contract governance - API'); From 2e8859481b1de4008211831534f1a390e1f48a29 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 07:19:41 -0600 Subject: [PATCH 03/12] chore(53): lock packages --- proposals/53:kread-start/yarn.lock | 1318 ++++++++++++++++++++++++++++ 1 file changed, 1318 insertions(+) create mode 100644 proposals/53:kread-start/yarn.lock diff --git a/proposals/53:kread-start/yarn.lock b/proposals/53:kread-start/yarn.lock new file mode 100644 index 00000000..0e65a8ac --- /dev/null +++ b/proposals/53:kread-start/yarn.lock @@ -0,0 +1,1318 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@endo/zip@^0.2.35": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@endo/zip/-/zip-0.2.35.tgz#37a7f9266ca9c9167de5e42b55b0d9c979598d87" + integrity sha512-UM+mMZjBtJf33lXj38xXIEIe1B5wrgg/nT9CHrC8s+Pj/h63eMpQmcJzjL2vMKrvq3Tsj+TDzmQhtYcbrFACqQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +acorn-walk@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + +acorn@^8.8.2: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== + +arrgv@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" + integrity sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw== + +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== + +ava@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ava/-/ava-5.3.1.tgz#335737dd963b7941b90214836cea2e8de1f4d5f4" + integrity sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg== + dependencies: + acorn "^8.8.2" + acorn-walk "^8.2.0" + ansi-styles "^6.2.1" + arrgv "^1.0.2" + arrify "^3.0.0" + callsites "^4.0.0" + cbor "^8.1.0" + chalk "^5.2.0" + chokidar "^3.5.3" + chunkd "^2.0.1" + ci-info "^3.8.0" + ci-parallel-vars "^1.0.1" + clean-yaml-object "^0.1.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" + common-path-prefix "^3.0.0" + concordance "^5.0.4" + currently-unhandled "^0.4.1" + debug "^4.3.4" + emittery "^1.0.1" + figures "^5.0.0" + globby "^13.1.4" + ignore-by-default "^2.1.0" + indent-string "^5.0.0" + is-error "^2.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + matcher "^5.0.0" + mem "^9.0.2" + ms "^2.1.3" + p-event "^5.0.1" + p-map "^5.5.0" + picomatch "^2.3.1" + pkg-conf "^4.0.0" + plur "^5.1.0" + pretty-ms "^8.0.0" + resolve-cwd "^3.0.0" + stack-utils "^2.0.6" + strip-ansi "^7.0.1" + supertap "^3.0.1" + temp-dir "^3.0.0" + write-file-atomic "^5.0.1" + yargs "^17.7.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +better-sqlite3@^8.5.1: + version "8.7.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-8.7.0.tgz#bcc341856187b1d110a8a47234fa89c48c8ef538" + integrity sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +callsites@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chunkd@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" + integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== + +ci-info@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +ci-parallel-vars@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz#e87ff0625ccf9d286985b29b4ada8485ca9ffbc2" + integrity sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg== + +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +clean-yaml-object@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" + integrity sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw== + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== + dependencies: + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" + js-string-escape "^1.0.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" + well-known-symbols "^2.0.0" + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== + dependencies: + array-find-index "^1.0.1" + +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== + dependencies: + time-zone "^1.0.0" + +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emittery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.1.tgz#e0cf36e2d7eef94dbd025969f642d57ae50a56cd" + integrity sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +figures@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" + integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== + dependencies: + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^13.1.4: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.1.0.tgz#c0e0de1a99b6065bdc93315a6f728867981464db" + integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== + +ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +irregular-plurals@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" + integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-error@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" + integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-unicode-supported@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== + +js-yaml@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +load-json-file@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== + dependencies: + escape-string-regexp "^5.0.0" + +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== + dependencies: + blueimp-md5 "^2.10.0" + +mem@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +node-abi@^3.3.0: + version "3.51.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d" + integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA== + dependencies: + semver "^7.3.5" + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== + dependencies: + aggregate-error "^4.0.0" + +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +parse-ms@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" + integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-conf@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== + dependencies: + find-up "^6.0.0" + load-json-file "^7.0.0" + +plur@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== + dependencies: + irregular-plurals "^3.3.0" + +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +pretty-ms@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" + integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== + dependencies: + parse-ms "^3.0.0" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@^7.3.2, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supertap@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== + dependencies: + indent-string "^5.0.0" + js-yaml "^3.14.1" + serialize-error "^7.0.1" + strip-ansi "^7.0.1" + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +temp-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" + integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== + +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 2bacdb182ab0b33ec53301816f308701b5f60385 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 08:10:48 -0600 Subject: [PATCH 04/12] chore(53): trivial test/use for KREAd so far --- proposals/53:kread-start/test.sh | 15 ++------------- proposals/53:kread-start/use.sh | 4 ++-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/proposals/53:kread-start/test.sh b/proposals/53:kread-start/test.sh index 8c2494e8..80fc752e 100644 --- a/proposals/53:kread-start/test.sh +++ b/proposals/53:kread-start/test.sh @@ -2,17 +2,6 @@ set -e -source /usr/src/upgrade-test-scripts/env_setup.sh +# source /usr/src/upgrade-test-scripts/env_setup.sh -testMinChildren() { - path=$1 - min=$2 - line="$(agd query vstorage children $path -o jsonlines)" - ok=$(echo $line | jq ".children | length | . > $min") - test_val "$ok" "true" "$path: more than $min children" -} - -# Check brand aux data for more than just vbank assets -testMinChildren published.boardAux 3 - -# TODO trade game asset +echo "no post-build tests for KREAd" diff --git a/proposals/53:kread-start/use.sh b/proposals/53:kread-start/use.sh index 0dc1342b..b26ebbf2 100644 --- a/proposals/53:kread-start/use.sh +++ b/proposals/53:kread-start/use.sh @@ -3,6 +3,6 @@ # Exit when any command fails set -e -source /usr/src/upgrade-test-scripts/env_setup.sh +# source /usr/src/upgrade-test-scripts/env_setup.sh -echo "Nothing to put into chain history for NFT smart wallet per se." +echo "TODO: mint character..." From 3ca6f91e77a5adec383824fc427748dd7a0f2700 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 08:26:17 -0600 Subject: [PATCH 05/12] chore: get KREAd test running (but failing) - factor out core-eval-support --- proposals/53:kread-start/eval.sh | 3 +- proposals/53:kread-start/mn2-start.test.js | 220 ++++----------------- 2 files changed, 37 insertions(+), 186 deletions(-) diff --git a/proposals/53:kread-start/eval.sh b/proposals/53:kread-start/eval.sh index 42d4275d..b7917223 100644 --- a/proposals/53:kread-start/eval.sh +++ b/proposals/53:kread-start/eval.sh @@ -16,4 +16,5 @@ cd /usr/src/upgrade-test-scripts/lib/ && yarn install --frozen-lockfile cd - # XXX using Ava serial to script the core-eval -yarn ava upgrade-wf.test.js +yarn ava mn2-start.test.js + diff --git a/proposals/53:kread-start/mn2-start.test.js b/proposals/53:kread-start/mn2-start.test.js index 4dd831da..93827c2b 100644 --- a/proposals/53:kread-start/mn2-start.test.js +++ b/proposals/53:kread-start/mn2-start.test.js @@ -1,30 +1,14 @@ // @ts-check /** - * @file mainnet-2 contract start test + * @file mainnet-2 contract start test for KREAd * - * Expects several environment variables: - * If $MN2_PROPOSAL_INFO is not set, no tests are run. - * - * $MN2_PROPOSAL_INFO is a directory with the results of - * running `agoric run xyz-script.js` one or more times. - * Note: include the trailing / in the $MN_PROPOSAL_INFO. - * - * Each time, in addition to any *-permit.json and *.js files, - * stdout is parsed with `parseProposals.js` to produce - * a *-info.json file containing... + * Proposal info is fetched from a release. * * @typedef {{ * bundles: string[], * evals: { permit: string; script: string }[], * }} ProposalInfo - * - * Only the last path segment of ProposalInfo.bundles is used. - * All bundles must be available in $MN2_PROPOSAL_INFO/bundles/ . - * - * $MN2_INSTANCE is a key in agoricNames.instance - * where the mainnet-2 contract instance is expected to be installed. - * A vstorage node under published by this name is also expected. */ import anyTest from 'ava'; @@ -37,18 +21,24 @@ import dbOpenAmbient from 'better-sqlite3'; // TODO: factor out ambient authority from these // or at least allow caller to supply authority. -import { mintIST } from '../lib/econHelpers.js'; -import { agoric, wellKnownIdentities } from '../lib/cliHelper.js'; +import { agoric, wellKnownIdentities } from '../../upgrade-test-scripts/lib/cliHelper.js'; import { provisionSmartWallet, voteLatestProposalAndWait, -} from '../lib/commonUpgradeHelpers.js'; +} from '../../upgrade-test-scripts/lib/commonUpgradeHelpers.js'; -import { makeAgd } from '../lib/agd-lib.js'; -import { Far, makeMarshal, makeTranslationTable } from '../lib/unmarshal.js'; -import { Fail, NonNullish } from '../lib/assert.js'; -import { dbTool } from '../lib/vat-status.js'; -import { makeFileRW, makeWebCache, makeWebRd } from '../lib/webAsset.js'; +import { makeAgd } from '../../upgrade-test-scripts/lib/agd-lib.js'; +import { dbTool } from '../../upgrade-test-scripts/lib/vat-status.js'; +import { makeFileRW, makeWebCache, makeWebRd } from '../../upgrade-test-scripts/lib/webAsset.js'; +import { + bundleDetail, + ensureISTForInstall, + flags, + getContractInfo, + loadedBundleIds, + testIncludes, + txAbbr, +} from './core-eval-support.js'; /** @typedef {Awaited>} TestContext */ /** @type {import('ava').TestFn}} */ @@ -64,8 +54,12 @@ const test = anyTest; * voting 2023-09-28 to 2023-10-01 * https://agoric.explorers.guru/proposal/53 */ -const releaseInfo = { - url: 'https://github.com/Kryha/KREAd/releases/tag/KREAd-rc1', +const assetInfo = { + repo:{ + release:'https://github.com/Kryha/KREAd/releases/tag/KREAd-rc1', + url:'https://github.com/Kryha/KREAd', + name: 'KREAd', + }, /** @type {Record} */ buildAssets: { 'kread-committee-info.json': { @@ -96,13 +90,13 @@ const dappAPI = { }; const staticConfig = { - deposit: '10000000ubld', // 10 BLD - installer: 'gov1', // as in: agd keys show gov1 + deposit: '10000000ubld', // 10 BLD. XXX mainnet was 5000 at the time + installer: 'user1', // as in: agd keys show gov1 proposer: 'validator', collateralPrice: 6, // conservatively low price. TODO: look up swingstorePath: '~/.agoric/data/agoric/swingstore.sqlite', - releaseAssets: releaseInfo.url.replace('/tag/', '/download/') + '/', - buildInfo: Object.values(releaseInfo.buildAssets), + releaseAssets: assetInfo.repo.release.replace('/tag/', '/download/') + '/', + buildInfo: Object.values(assetInfo.buildAssets), initialCoins: `20000000ubld`, // enough to provision a smartWallet accounts: { krgov1: { @@ -147,8 +141,10 @@ const makeTestContext = async (io = {}) => { tmpName({ prefix: 'assets' }, (err, x) => (err ? reject(err) : resolve(x))), ); const dest = makeFileRW(td, { fsp, path }); - td.teardown(() => assets.remove()); + // FIXME Error: `t.teardown()` is not allowed in hooks + // t.teardown(() => assets.remove()); const assets = makeWebCache(src, dest); + console.log(`bundleAssets: ${assets}`) const config = { assets, @@ -170,22 +166,6 @@ const makeTestContext = async (io = {}) => { test.before(async t => (t.context = await makeTestContext())); -const testIncludes = (t, needle, haystack, label, sense = true) => { - t.log(needle, sense ? 'in' : 'not in', haystack.length, label, '?'); - const check = sense ? t.deepEqual : t.notDeepEqual; - if (sense) { - t.deepEqual( - haystack.filter(c => c === needle), - [needle], - ); - } else { - t.deepEqual( - haystack.filter(c => c === needle), - [], - ); - } -}; - test.serial(`pre-flight: not in agoricNames.instance`, async t => { const { config, agoric } = t.context; const { instance: target } = config; @@ -193,103 +173,6 @@ test.serial(`pre-flight: not in agoricNames.instance`, async t => { testIncludes(t, target, Object.keys(instance), 'instance keys', false); }); -const makeBoardUnmarshal = () => { - const synthesizeRemotable = (_slot, iface) => - Far(iface.replace(/^Alleged: /, ''), {}); - - const { convertValToSlot, convertSlotToVal } = makeTranslationTable( - slot => Fail`unknown id: ${slot}`, - synthesizeRemotable, - ); - - return makeMarshal(convertValToSlot, convertSlotToVal); -}; - -export const getContractInfo = async (path, io = {}) => { - const m = makeBoardUnmarshal(); - const { - agoric: { follow = agoric.follow }, - prefix = 'published.', - } = io; - console.log('@@TODO: prevent agoric follow hang', prefix, path); - const txt = await follow('-lF', `:${prefix}${path}`, '-o', 'text'); - const { body, slots } = JSON.parse(txt); - return m.fromCapData({ body, slots }); -}; - -// XXX dead code - worth keeping somewhere? -const ensureMintLimit = async (targetNum, manager = 0, unit = 1_000_000) => { - const io = { agoric }; - const [{ current }, metrics] = await Promise.all([ - getContractInfo(`vaultFactory.managers.manager${manager}.governance`, io), - getContractInfo(`vaultFactory.managers.manager${manager}.metrics`, io), - ]); - const { totalDebt } = metrics; - const { - DebtLimit: { value: limit }, - } = current; - const nums = { - total: Number(totalDebt.value) / unit, - limit: Number(limit.value) / unit, - target: targetNum, - }; - nums.target += nums.total; - console.log( - nums, - nums.limit >= nums.target ? 'limit > target' : 'LIMIT TOO LOW', - ); - if (nums.limit >= nums.target) return; - throw Error('raising mint limit not impl'); -}; - -const myISTBalance = async (agd, addr, denom = 'uist', unit = 1_000_000) => { - const coins = await agd.query(['bank', 'balances', addr]); - const coin = coins.balances.find(a => a.denom === denom); - return Number(coin.amount) / unit; -}; - -const importBundleCost = (bytes, price = 0.002) => { - return bytes * price; -}; - -/** - * @param {number} myIST - * @param {number} cost - * @param {{ - * unit?: number, padding?: number, minInitialDebt?: number, - * collateralPrice: number, - * }} opts - * @returns - */ -const mintCalc = (myIST, cost, opts) => { - const { - unit = 1_000_000, - padding = 1, - minInitialDebt = 6, - collateralPrice, - } = opts; - const { round, max } = Math; - const wantMinted = max(round(cost - myIST + padding), minInitialDebt); - const giveCollateral = round(wantMinted / collateralPrice) + 1; - const sendValue = round(giveCollateral * unit); - return { wantMinted, giveCollateral, sendValue }; -}; - -const loadedBundleIds = swingstore => { - const ids = swingstore`SELECT bundleID FROM bundles`.map(r => r.bundleID); - return ids; -}; - -/** - * @param {string} cacheFn - e.g. /home/me.agoric/cache/b1-DEADBEEF.json - */ -const bundleDetail = cacheFn => { - const fileName = NonNullish(cacheFn.split('/').at(-1)); - const id = fileName.replace(/\.json$/, ''); - const hash = id.replace(/^b1-/, ''); - return { fileName, endoZipBase64Sha512: hash, id }; -}; - test.serial('bundles not yet installed', async t => { const { swingstore, config } = t.context; const loaded = loadedBundleIds(swingstore); @@ -306,7 +189,7 @@ test.serial('bundles not yet installed', async t => { /** @param {number[]} xs */ const sum = xs => xs.reduce((a, b) => a + b, 0); -/** @param {import('../lib/webAsset.js').WebCache} assets */ +/** @param {import('../../upgrade-test-scripts/lib/webAsset.js').WebCache} assets */ const readBundleSizes = async assets => { const info = staticConfig.buildInfo; const bundleSizes = await Promise.all( @@ -320,39 +203,16 @@ const readBundleSizes = async assets => { return { bundleSizes, totalSize }; }; -const ensureISTForInstall = async (agd, config, { log }) => { - const { proposalDir, installer } = config; - const { bundleSizes, totalSize } = await readBundleSizes(proposalDir); - const cost = importBundleCost(sum(bundleSizes)); - log({ bundleSizes, totalSize, cost }); - - const addr = agd.lookup(installer); - const istBalance = await myISTBalance(agd, addr); - - if (istBalance > cost) { - log('balance sufficient', { istBalance, cost }); - return; - } - const { sendValue, wantMinted, giveCollateral } = mintCalc( - istBalance, - cost, - config, - ); - log({ wantMinted }); - await mintIST(addr, sendValue, wantMinted, giveCollateral); -}; - test.serial('ensure enough IST to install bundles', async t => { const { agd, config } = t.context; - await ensureISTForInstall(agd, config, { log: t.log }); + const { totalSize } = await readBundleSizes(config.assets); + + await ensureISTForInstall(agd, config, totalSize, { + log: t.log, + }); t.pass(); }); -const txAbbr = tx => { - const { txhash, code, height, gas_used } = tx; - return { txhash, code, height, gas_used }; -}; - test.serial('ensure bundles installed', async t => { const { agd, swingstore, agoric, config, io } = t.context; const { chainId, assets } = config; @@ -392,16 +252,6 @@ test.serial('ensure bundles installed', async t => { t.is(todo, done); }); -/** - * @param {Record} record - e.g. { color: 'blue' } - * @returns {string[]} - e.g. ['--color', 'blue'] - */ -const flags = record => { - return Object.entries(record) - .map(([k, v]) => [`--${k}`, v]) - .flat(); -}; - test.serial('core eval prereqs: provision royalty, gov, ...', async t => { const { agd, config } = t.context; const { entries } = Object; From 208ae678f2ef9e6d56fe8e6f3d4b0d694431e273 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 11:29:04 -0600 Subject: [PATCH 06/12] chore: impersonate KREAd accounts - gov, royalty, ... --- proposals/53:kread-start/mn2-start.test.js | 80 +++++++++++++++++----- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/proposals/53:kread-start/mn2-start.test.js b/proposals/53:kread-start/mn2-start.test.js index 93827c2b..6372db21 100644 --- a/proposals/53:kread-start/mn2-start.test.js +++ b/proposals/53:kread-start/mn2-start.test.js @@ -21,15 +21,23 @@ import dbOpenAmbient from 'better-sqlite3'; // TODO: factor out ambient authority from these // or at least allow caller to supply authority. -import { agoric, wellKnownIdentities } from '../../upgrade-test-scripts/lib/cliHelper.js'; +import { + agoric, + wellKnownIdentities, +} from '../../upgrade-test-scripts/lib/cliHelper.js'; import { provisionSmartWallet, voteLatestProposalAndWait, + waitForBlock, } from '../../upgrade-test-scripts/lib/commonUpgradeHelpers.js'; import { makeAgd } from '../../upgrade-test-scripts/lib/agd-lib.js'; import { dbTool } from '../../upgrade-test-scripts/lib/vat-status.js'; -import { makeFileRW, makeWebCache, makeWebRd } from '../../upgrade-test-scripts/lib/webAsset.js'; +import { + makeFileRW, + makeWebCache, + makeWebRd, +} from '../../upgrade-test-scripts/lib/webAsset.js'; import { bundleDetail, ensureISTForInstall, @@ -55,9 +63,9 @@ const test = anyTest; * https://agoric.explorers.guru/proposal/53 */ const assetInfo = { - repo:{ - release:'https://github.com/Kryha/KREAd/releases/tag/KREAd-rc1', - url:'https://github.com/Kryha/KREAd', + repo: { + release: 'https://github.com/Kryha/KREAd/releases/tag/KREAd-rc1', + url: 'https://github.com/Kryha/KREAd', name: 'KREAd', }, /** @type {Record} */ @@ -100,21 +108,26 @@ const staticConfig = { initialCoins: `20000000ubld`, // enough to provision a smartWallet accounts: { krgov1: { + impersonate: 'agoric1hlm7w6pyyqnwz35jdknly8mp0ehvyrl04xjez7', address: 'agoric1890064p6j3xhzzdf8daknd6kpvhw766ds8flgw', mnemonic: 'loop clump life tattoo action wish loop garbage room custom tooth lunar increase major draw wage bind vanish order behind bounce unknown cry practice', }, krgov2: { + impersonate: 'agoric19rtq0t8rm5ej5eyumgl0qwepzr7t4x50whx9ae', address: 'agoric1vqm5x5sj4lxmj2kem7x92tuhaum0k2yzyj6mgu', mnemonic: 'expect wheel safe ankle caution vote reduce sell night pencil suit scrap tumble divorce element become result front hurt begin deputy liberty develop next', }, kRoyalties: { - address: 'agoric1yjc8llu3fugm7tgqye4rd5n92l9x2dhe30dazp', + // Note: same as the krgov2 account + impersonate: 'agoric19rtq0t8rm5ej5eyumgl0qwepzr7t4x50whx9ae', + address: 'agoric1vqm5x5sj4lxmj2kem7x92tuhaum0k2yzyj6mgu', mnemonic: - 'talent approve render pool chief inch nuclear minor rhythm laundry praise swift clog neck shoot elder rely junior rule basket energy payment giggle torch', + 'expect wheel safe ankle caution vote reduce sell night pencil suit scrap tumble divorce element become result front hurt begin deputy liberty develop next', }, kPlatform: { + impersonate: 'agoric1plt4252p5yu4x0nndfnkumh0gws7pdeksqq33e', address: 'agoric1enwuyn2hzyyvt39x87tk9rhlkpqtyv9haj7mgs', mnemonic: 'magic enrich village office myth depth upper pair april dad visit memory resemble castle lab surface globe debate chair upper army pony moon tone', @@ -137,14 +150,16 @@ const makeTestContext = async (io = {}) => { } = io; const src = makeWebRd(staticConfig.releaseAssets, { fetch }); - const td = await new Promise((resolve, reject) => - tmpName({ prefix: 'assets' }, (err, x) => (err ? reject(err) : resolve(x))), - ); + const tmpNameP = prefix => + new Promise((resolve, reject) => + tmpName({ prefix }, (err, x) => (err ? reject(err) : resolve(x))), + ); + const td = await tmpNameP('assets'); const dest = makeFileRW(td, { fsp, path }); // FIXME Error: `t.teardown()` is not allowed in hooks // t.teardown(() => assets.remove()); const assets = makeWebCache(src, dest); - console.log(`bundleAssets: ${assets}`) + console.log(`bundleAssets: ${assets}`); const config = { assets, @@ -161,7 +176,10 @@ const makeTestContext = async (io = {}) => { const dbPath = staticConfig.swingstorePath.replace(/^~/, env.HOME); const swingstore = dbTool(dbOpen(dbPath, { readonly: true })); - return { agd, agoric, swingstore, config }; + /* @param {string} baseName */ + const mkTempRW = async baseName => + makeFileRW(await tmpNameP(baseName), { fsp, path }); + return { agd, agoric, swingstore, config, mkTempRW }; }; test.before(async t => (t.context = await makeTestContext())); @@ -207,7 +225,7 @@ test.serial('ensure enough IST to install bundles', async t => { const { agd, config } = t.context; const { totalSize } = await readBundleSizes(config.assets); - await ensureISTForInstall(agd, config, totalSize, { + await ensureISTForInstall(agd, config, totalSize, { log: t.log, }); t.pass(); @@ -279,8 +297,23 @@ test.serial('core eval prereqs: provision royalty, gov, ...', async t => { t.pass(); }); +/** + * @param {string} text + * @param {string} fileName + */ +const acctSub = (text, fileName) => { + let out = text; + for (const [name, detail] of Object.entries(staticConfig.accounts)) { + if (out.includes(detail.impersonate)) { + console.log('impersonating', name, 'in', fileName); + out = out.replace(detail.impersonate, detail.address); + } + } + return out; +}; + test.serial('core eval proposal passes', async t => { - const { agd, swingstore, config } = t.context; + const { agd, swingstore, config, mkTempRW } = t.context; const from = agd.lookup(config.proposer); const { chainId, deposit, assets, instance } = config; const info = { title: instance, description: `start ${instance}` }; @@ -296,14 +329,23 @@ test.serial('core eval proposal passes', async t => { } } + /** @param {string} script */ + const withKnownKeys = async script => { + const text = await assets.getText(script); + const text2 = acctSub(text, script); + const out = await mkTempRW(script); + await out.writeText(text2); + return out.toString(); + }; + const evalNames = buildInfo .map(({ evals }) => evals) .flat() .map(e => [e.permit, e.script]) .flat(); - const evalPaths = await Promise.all(evalNames.map(e => assets.storedPath(e))); + const evalPaths = await Promise.all(evalNames.map(withKnownKeys)); t.log(evalPaths); - console.debug('await tx', evalPaths); + console.log('await tx', evalPaths); const result = await agd.tx( [ 'gov', @@ -318,9 +360,13 @@ test.serial('core eval proposal passes', async t => { t.log(txAbbr(result)); t.is(result.code, 0); - console.debug('await voteLatestProposalAndWait', evalPaths); + console.log('await voteLatestProposalAndWait', evalPaths); const detail = await voteLatestProposalAndWait(); t.log(detail.proposal_id, detail.voting_end_time, detail.status); + + // TODO: how long is long enough? poll? + await waitForBlock(5); + t.is(detail.status, 'PROPOSAL_STATUS_PASSED'); }); From a996188498e87f715bfcb9e2270de6273cd162be Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 11:55:57 -0600 Subject: [PATCH 07/12] style(53): indent package.json by 2 --- proposals/53:kread-start/package.json | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/proposals/53:kread-start/package.json b/proposals/53:kread-start/package.json index 2ad2b325..99d72c36 100644 --- a/proposals/53:kread-start/package.json +++ b/proposals/53:kread-start/package.json @@ -1,18 +1,18 @@ { - "type": "module", - "license": "Apache-2.0", - "devDependencies": {}, - "dependencies": { - "@endo/zip": "^0.2.35", - "ava": "^5.3.1", - "better-sqlite3": "^8.5.1", - "execa": "^7.2.0", - "tmp": "^0.2.1" - }, - "scripts": { - "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" - }, - "ava": { - "timeout": "30s" - } + "type": "module", + "license": "Apache-2.0", + "devDependencies": {}, + "dependencies": { + "@endo/zip": "^0.2.35", + "ava": "^5.3.1", + "better-sqlite3": "^8.5.1", + "execa": "^7.2.0", + "tmp": "^0.2.1" + }, + "scripts": { + "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" + }, + "ava": { + "timeout": "30s" + } } From 5e4a397ef211ad0dc3f9add8f2000347127498fc Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 11:56:22 -0600 Subject: [PATCH 08/12] chore(53): give KREAd a long time to initialize --- proposals/53:kread-start/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/53:kread-start/package.json b/proposals/53:kread-start/package.json index 99d72c36..0911ed7b 100644 --- a/proposals/53:kread-start/package.json +++ b/proposals/53:kread-start/package.json @@ -13,6 +13,6 @@ "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" }, "ava": { - "timeout": "30s" + "timeout": "300s" } } From 04a0de4664a9103dd73922f74c560e36e328ced8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 11:56:49 -0600 Subject: [PATCH 09/12] chore(53): poll until KREAd initialization is done - show size of kread.item as a progress indicator --- proposals/53:kread-start/mn2-start.test.js | 51 +++++++++++++++++----- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/proposals/53:kread-start/mn2-start.test.js b/proposals/53:kread-start/mn2-start.test.js index 6372db21..7cf410b3 100644 --- a/proposals/53:kread-start/mn2-start.test.js +++ b/proposals/53:kread-start/mn2-start.test.js @@ -370,25 +370,54 @@ test.serial('core eval proposal passes', async t => { t.is(detail.status, 'PROPOSAL_STATUS_PASSED'); }); +test.serial('vstorage published.CHILD is present', async t => { + const { agd, config } = t.context; + const { vstorageNode } = config; + const { children } = await agd.query(['vstorage', 'children', 'published']); + testIncludes(t, vstorageNode, children, 'published children'); +}); + test.serial(`agoricNames.instance is populated`, async t => { - const { config, agoric } = t.context; + const { config, agoric, agd } = t.context; const { instance: target } = config; - const { instance, brand } = await wellKnownIdentities({ agoric }); - const present = Object.keys(instance); - testIncludes(t, target, present, 'instance keys'); + + /** + * @param {() => Promise} check + */ + const poll = async (check, maxTries) => { + for (let tries = 0; tries < maxTries; tries += 1) { + const ok = await check(); + if (ok) return; + await waitForBlock(); + } + throw Error(`tried ${maxTries} times without success`); + }; + + const vstorageValueSize = async path => { + const { value } = await agd.query(['vstorage', 'data', path]); + return value.length; + }; + + const checkForInstance = async () => { + // eye candy while we wait for the contract to start + const progress = await vstorageValueSize(`published.kread.item`); + console.log('kread.item size', progress); + + const { instance } = await wellKnownIdentities({ agoric }); + const present = Object.keys(instance); + return present.includes(target); + }; + + // contract initialization took ~10min in mainnet + const minute = 60 / 1; // block time is ~1sec + poll(checkForInstance, 15 * minute); + t.pass(); }); // needs 2 brand names test.todo(`agoricNames.brand is populated`); test.todo('boardAux is populated'); -test.serial('vstorage published.CHILD is present', async t => { - const { agd, config } = t.context; - const { vstorageNode } = config; - const { children } = await agd.query(['vstorage', 'children', 'published']); - testIncludes(t, vstorageNode, children, 'published children'); -}); - // KREAd specific below here // TODO refactor this test for re-use across MN2 scripts From 67d38c6fef6bfcb24054bf93c82f9a7c9b183bfb Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 16:56:17 -0600 Subject: [PATCH 10/12] refactor testIncludes for conciseness Co-authored-by: Richard Gibson --- proposals/53:kread-start/core-eval-support.js | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/proposals/53:kread-start/core-eval-support.js b/proposals/53:kread-start/core-eval-support.js index 61910552..d27d76e5 100644 --- a/proposals/53:kread-start/core-eval-support.js +++ b/proposals/53:kread-start/core-eval-support.js @@ -36,21 +36,20 @@ export const getContractInfo = async (path, io = {}) => { return m.fromCapData({ body, slots }); }; -// not really core-eval related +/** + * Asserts that `haystack` includes `needle` (or when `sense` is false, that it + * does not), providing pretty output in the case of failure. + * + * @param {import('ava').ExecutionContext} t + * @param {unknown} needle + * @param {unknown[]} haystack + * @param {string} label + * @param {boolean} [sense] true to assert inclusion; false for exclusion + * @returns {void} + */ export const testIncludes = (t, needle, haystack, label, sense = true) => { - t.log(needle, sense ? 'in' : 'not in', haystack.length, label, '?'); - const check = sense ? t.deepEqual : t.notDeepEqual; - if (sense) { - t.deepEqual( - haystack.filter(c => c === needle), - [needle], - ); - } else { - t.deepEqual( - haystack.filter(c => c === needle), - [], - ); - } + const matches = haystack.filter(c => Object.is(c, needle)); + t.deepEqual(matches, sense ? [needle] : [], label); }; /** From 3b6ebce0efa006a602664bfb06ffbf761bd07314 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 17:00:47 -0600 Subject: [PATCH 11/12] chore: prune obsolete yarn installs Co-authored-by: Turadg Aleahmad --- proposals/53:kread-start/eval.sh | 8 -------- 1 file changed, 8 deletions(-) diff --git a/proposals/53:kread-start/eval.sh b/proposals/53:kread-start/eval.sh index b7917223..5cb07c4f 100644 --- a/proposals/53:kread-start/eval.sh +++ b/proposals/53:kread-start/eval.sh @@ -7,14 +7,6 @@ source /usr/src/upgrade-test-scripts/env_setup.sh ls -al -yarn install --frozen-lockfile - -# XXX to avoid rebuilding lower layers -# TODO clean up JS lib code so it's more independent -cp package.json yarn.lock /usr/src/upgrade-test-scripts/lib/ -cd /usr/src/upgrade-test-scripts/lib/ && yarn install --frozen-lockfile -cd - - # XXX using Ava serial to script the core-eval yarn ava mn2-start.test.js From d885d04ab64af44c6690f8a6eb99db1abceb3614 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 7 Nov 2023 17:03:25 -0600 Subject: [PATCH 12/12] docs: note justification for ava test() style --- proposals/53:kread-start/mn2-start.test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/proposals/53:kread-start/mn2-start.test.js b/proposals/53:kread-start/mn2-start.test.js index 7cf410b3..0432b585 100644 --- a/proposals/53:kread-start/mn2-start.test.js +++ b/proposals/53:kread-start/mn2-start.test.js @@ -1,5 +1,8 @@ // @ts-check +// NOTE: This ava test() style is based on earlier working code. +// TODO: consider ordinary script style. + /** * @file mainnet-2 contract start test for KREAd *