diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c0a2b1fc2f376163a2afc927571a1f2b5ad463e6..35cb2516469658c801ec71949c2b200198e68e41 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,6 +3,7 @@ "features": { "ghcr.io/devcontainers/features/node:1": {}, "ghcr.io/devcontainers-contrib/features/turborepo-npm:1": {}, - "ghcr.io/devcontainers-contrib/features/typescript:2": {} + "ghcr.io/devcontainers-contrib/features/typescript:2": {}, + "ghcr.io/devcontainers-contrib/features/pnpm:2": {} } } diff --git a/packages/core/package.json b/packages/core/package.json index 31b33979faad26d5fd32c87419f2694ca355e016..bd0debc64778c5e183a5394b3d1856115378c4fe 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,16 +3,19 @@ "dependencies": { "axios": "^0.26.1", "js-tiktoken": "^1.0.7", + "lodash": "^4.17.21", "openai": "^3.3.0", "uuid": "^9.0.0" }, - "devDependencies": { - "@types/node": "^18", - "@types/uuid": "^9.0.2" - }, "main": "src/index.ts", "types": "src/index.ts", "scripts": { "test": "jest" + }, + "devDependencies": { + "@types/lodash": "^4.14.195", + "@types/node": "^18", + "@types/uuid": "^9.0.2", + "node-stdlib-browser": "^1.2.0" } } diff --git a/packages/core/src/Document.ts b/packages/core/src/Document.ts index 3efdf46be9df3bb55c1619b2cfd7d0c8942d11bd..2b2fc3a872a740a8fabec06402e2d26360f081e0 100644 --- a/packages/core/src/Document.ts +++ b/packages/core/src/Document.ts @@ -1,4 +1,12 @@ import { v4 as uuidv4 } from "uuid"; + +export enum NodeType { + DOCUMENT, + TEXT, + IMAGE, + INDEX, +} + export abstract class BaseDocument { text: string; docId?: string; @@ -45,14 +53,20 @@ export abstract class BaseDocument { getDocHash() { return this.docHash; } + + abstract getType(): NodeType; } export class Document extends BaseDocument { - static getType() { - return "Document"; + getType() { + return NodeType.DOCUMENT; } } -export class ImageDocuemnt extends Document { +export class ImageDocument extends Document { image?: string; -} + + getType() { + return NodeType.IMAGE; + } +} \ No newline at end of file diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index f29e2fc43ca2d77bc2aa1a93c898ab518f167fa3..8247e104b7d63f8581c6fc92a8920368a8c03587 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -1,4 +1,4 @@ -import { BaseDocument } from "./Document"; +import { BaseDocument, NodeType } from "./Document"; export enum DocumentRelationship { SOURCE = "source", @@ -8,12 +8,6 @@ export enum DocumentRelationship { CHILD = "child", } -export enum NodeType { - TEXT, - IMAGE, - INDEX, -} - export class Node extends BaseDocument { relationships: { [key in DocumentRelationship]: string | string[] | null }; @@ -61,6 +55,10 @@ export class Node extends BaseDocument { childNodeIds(): string[] { return []; } + + getType() { + return NodeType.TEXT; + } } export interface NodeWithEmbedding { @@ -71,4 +69,4 @@ export interface NodeWithEmbedding { export interface NodeWithScore { node: Node; score: number; -} +} \ No newline at end of file diff --git a/packages/core/src/StorageContext.ts b/packages/core/src/StorageContext.ts deleted file mode 100644 index 7b07e9650f8044886ef0c1d46d39ab5c01ad676a..0000000000000000000000000000000000000000 --- a/packages/core/src/StorageContext.ts +++ /dev/null @@ -1,6 +0,0 @@ -interface StorageContext { - docStore?: any; - indexStore?: any; - vectorStore?: any; - graphStore?: any; -} diff --git a/packages/core/src/dataStructs.ts b/packages/core/src/dataStructs.ts new file mode 100644 index 0000000000000000000000000000000000000000..f561fbe4fcc7380afde6cc0db2560b834c5611d8 --- /dev/null +++ b/packages/core/src/dataStructs.ts @@ -0,0 +1,25 @@ +export enum IndexStructType { + SIMPLE_DICT = "simple_dict" +} + +export interface IndexStruct { + readonly indexId: string; + readonly summary?: string; + readonly type: IndexStructType; +} + +export function indexStructToJson(indexStruct: IndexStruct): {[key: string]: any} { + return { + indexId: indexStruct.indexId, + summary: indexStruct.summary, + type: indexStruct.type + }; +} + +export function jsonToIndexStruct(json: any): IndexStruct { + return { + indexId: json.indexId, + summary: json.summary, + type: json.type + }; +} diff --git a/packages/core/src/embeddingUtils.ts b/packages/core/src/embeddingUtils.ts new file mode 100644 index 0000000000000000000000000000000000000000..90e09e4876b0658bf111e972f1ee2084e6d7a5f9 --- /dev/null +++ b/packages/core/src/embeddingUtils.ts @@ -0,0 +1,35 @@ +import _ from 'lodash'; +import { VectorStoreQueryMode } from './storage/vectorStore/types'; + +export function getTopKEmbeddings( + queryEmbedding: number[], + embeddings: number[][], + similarityFn?: ((queryEmbedding: number[], emb: number[]) => number), + similarityTopK?: number, + embeddingIds?: number[], + similarityCutoff?: number, +): [number[], number[]] { + throw new Error('Not implemented'); +} + +export function getTopKEmbeddingsLearner( + queryEmbedding: number[], + embeddings: number[][], + similarityTopK?: number, + embeddingIds?: number[], + queryMode: VectorStoreQueryMode = VectorStoreQueryMode.SVM, +): [number[], number[]] { + throw new Error('Not implemented'); +} + +export function getTopKMMREmbeddings( + queryEmbedding: number[], + embeddings: number[][], + similarityFn?: ((queryEmbedding: number[], emb: number[]) => number), + similarityTopK?: number, + embeddingIds?: number[], + similarityCutoff?: number, + mmrThreshold?: number, +): [number[], number[]] { + throw new Error('Not implemented'); +} diff --git a/packages/core/src/storage/FileSystem.ts b/packages/core/src/storage/FileSystem.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b24e932954b51627395339d1e29c9b2484e10f0 --- /dev/null +++ b/packages/core/src/storage/FileSystem.ts @@ -0,0 +1,63 @@ +import _ from "lodash"; +/** + * A filesystem interface that is meant to be compatible with + * the 'fs' module from Node.js. + * Allows for the use of similar inteface implementation on + * browsers. + */ + +export interface GenericFileSystem { + writeFile(path: string, content: string, options?: any): Promise<void>; + readFile(path: string, options?: any): Promise<string>; + exists(path: string): Promise<boolean>; + mkdir(path: string, options?: any): Promise<void>; +} + +/** + * A filesystem implementation that stores files in memory. + */ +export class InMemoryFileSystem implements GenericFileSystem { + private files: {[filepath: string]: any} = {}; + + async writeFile(path: string, content: string, options?: any): Promise<void> { + this.files[path] = _.cloneDeep(content); + } + + async readFile(path: string, options?: any): Promise<string> { + if (!(path in this.files)) { + throw new Error(`File ${path} does not exist`); + } + return _.cloneDeep(this.files[path]); + } + + async exists(path: string): Promise<boolean> { + return path in this.files; + } + + async mkdir(path: string, options?: any): Promise<void> { + this.files[path] = _.get(this.files, path, null); + } +} + +export function getNodeFS(): GenericFileSystem { + const fs = require('fs/promises'); + return { + exists: async (path: string) => { + try { + await fs.access(path); + return true; + } catch { + return false; + } + }, + ...fs + } +} + +let fs = null; +try { + fs = getNodeFS(); +} catch (e) { + fs = new InMemoryFileSystem(); +} +export const DEFAULT_FS = fs as GenericFileSystem; diff --git a/packages/core/src/storage/StorageContext.ts b/packages/core/src/storage/StorageContext.ts new file mode 100644 index 0000000000000000000000000000000000000000..c39893e65ede0c37dea5cdba560f2205b13ea38e --- /dev/null +++ b/packages/core/src/storage/StorageContext.ts @@ -0,0 +1,40 @@ +import { BaseDocumentStore } from "./docStore/types"; +import { BaseIndexStore } from "./indexStore/types"; +import { VectorStore } from "./vectorStore/types"; +import { SimpleDocumentStore } from "./docStore/SimpleDocumentStore"; +import { SimpleIndexStore } from "./indexStore/SimpleIndexStore"; +import { SimpleVectorStore } from "./vectorStore/SimpleVectorStore"; +import { GenericFileSystem } from "./FileSystem"; +import { DEFAULT_PERSIST_DIR, DEFAULT_FS, DEFAULT_NAMESPACE } from "./constants"; + +export interface StorageContext { + docStore?: BaseDocumentStore; + indexStore?: BaseIndexStore; + vectorStore?: VectorStore; +} + +type BuilderParams = { + docStore?: BaseDocumentStore, + indexStore?: BaseIndexStore, + vectorStore?: VectorStore, + persistDir?: string, + fs?: GenericFileSystem, +}; + +export async function storageContextFromDefaults({ + docStore, indexStore, vectorStore, persistDir, fs +}: BuilderParams): StorageContext { + persistDir = persistDir || DEFAULT_PERSIST_DIR; + + fs = fs || DEFAULT_FS; + + docStore = docStore || await SimpleDocumentStore.fromPersistDir(persistDir, DEFAULT_NAMESPACE, fs); + indexStore = indexStore || await SimpleIndexStore.fromPersistDir(persistDir, fs); + vectorStore = vectorStore || await SimpleVectorStore.fromPersistDir(persistDir, fs); + + return { + docStore, + indexStore, + vectorStore, + }; +} diff --git a/packages/core/src/storage/constants.ts b/packages/core/src/storage/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0ded7c10f1218b27e5f9ebb88e069c35a83dc8c --- /dev/null +++ b/packages/core/src/storage/constants.ts @@ -0,0 +1,8 @@ +export const DEFAULT_COLLECTION = "data"; +export const DEFAULT_PERSIST_DIR = "./storage"; +export const DEFAULT_INDEX_STORE_PERSIST_FILENAME = "index_store.json"; +export const DEFAULT_DOC_STORE_PERSIST_FILENAME = "docstore.json"; +export const DEFAULT_VECTOR_STORE_PERSIST_FILENAME = "vector_store.json"; +export const DEFAULT_GRAPH_STORE_PERSIST_FILENAME = "graph_store.json"; +export const DEFAULT_NAMESPACE = "docstore"; +export { DEFAULT_FS } from "./FileSystem"; diff --git a/packages/core/src/storage/docStore/KVDocumentStore.ts b/packages/core/src/storage/docStore/KVDocumentStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f72bc2663b93c72a0087bab15d61ee3a9a253cd --- /dev/null +++ b/packages/core/src/storage/docStore/KVDocumentStore.ts @@ -0,0 +1,158 @@ +import { Node } from "../../Node"; +import { BaseDocument } from '../../Document'; +import { BaseDocumentStore, RefDocInfo } from './types'; +import { BaseKVStore } from '../kvStore/types'; +import _, * as lodash from 'lodash'; +import { docToJson, jsonToDoc } from './utils'; +import { DEFAULT_NAMESPACE } from '../constants'; + +type DocMetaData = { docHash: string, refDocId?: string }; + +export class KVDocumentStore extends BaseDocumentStore { + private kvstore: BaseKVStore; + private nodeCollection: string; + private refDocCollection: string; + private metadataCollection: string; + + constructor(kvstore: BaseKVStore, namespace: string = DEFAULT_NAMESPACE) { + super(); + this.kvstore = kvstore; + this.nodeCollection = `${namespace}/data`; + this.refDocCollection = `${namespace}/ref_doc_info`; + this.metadataCollection = `${namespace}/metadata`; + } + + async docs(): Promise<Record<string, BaseDocument>> { + let jsonDict = await this.kvstore.getAll(this.nodeCollection); + let docs: Record<string, BaseDocument> = {}; + for (let key in jsonDict) { + docs[key] = jsonToDoc(jsonDict[key] as Record<string, any>); + } + return docs; + } + + async addDocuments(docs: BaseDocument[], allowUpdate: boolean = true): Promise<void> { + for (var idx = 0; idx < docs.length; idx++) { + const doc = docs[idx]; + if (doc.getDocId() === null) { + throw new Error("doc_id not set"); + } + if (!allowUpdate && await this.documentExists(doc.getDocId())) { + throw new Error(`doc_id ${doc.getDocId()} already exists. Set allow_update to True to overwrite.`); + } + let nodeKey = doc.getDocId(); + let data = docToJson(doc); + await this.kvstore.put(nodeKey, data, this.nodeCollection); + let metadata: DocMetaData = { docHash: doc.getDocHash() }; + + if (doc instanceof Node && doc.refDocId() !== null) { + const nodeDoc = doc as Node; + let refDocInfo = await this.getRefDocInfo(nodeDoc.refDocId()!) || {docIds: [], extraInfo: {}}; + refDocInfo.docIds.push(nodeDoc.getDocId()); + if (_.isEmpty(refDocInfo.extraInfo)) { + refDocInfo.extraInfo = nodeDoc.getNodeInfo() || {}; + } + await this.kvstore.put(nodeDoc.refDocId()!, refDocInfo, this.refDocCollection); + metadata.refDocId = nodeDoc.refDocId()!; + } + + this.kvstore.put(nodeKey, metadata, this.metadataCollection); + } + } + + async getDocument(docId: string, raiseError: boolean = true): Promise<BaseDocument | undefined> { + let json = await this.kvstore.get(docId, this.nodeCollection); + if (_.isNil(json)) { + if (raiseError) { + throw new Error(`doc_id ${docId} not found.`); + } else { + return; + } + } + return jsonToDoc(json); + } + + async getRefDocInfo(refDocId: string): Promise<RefDocInfo | undefined> { + let refDocInfo = await this.kvstore.get(refDocId, this.refDocCollection); + return refDocInfo ? _.clone(refDocInfo) as RefDocInfo : undefined; + } + + async getAllRefDocInfo(): Promise<Record<string, RefDocInfo> | undefined> { + let refDocInfos = await this.kvstore.getAll(this.refDocCollection); + if (_.isNil(refDocInfos)) { + return; + } + return refDocInfos as Record<string, RefDocInfo>; + } + + async refDocExists(refDocId: string): Promise<boolean> { + return !_.isNil(await this.getRefDocInfo(refDocId)); + } + + async documentExists(docId: string): Promise<boolean> { + return !_.isNil(await this.kvstore.get(docId, this.nodeCollection)); + } + + private async removeRefDocNode(docId: string): Promise<void> { + let metadata = await this.kvstore.get(docId, this.metadataCollection); + if (metadata === null) { + return; + } + + let refDocId = metadata.refDocId; + if (_.isNil(refDocId)) { + return; + } + + const refDocInfo = await this.kvstore.get(refDocId, this.refDocCollection); + if (!_.isNil(refDocInfo)) { + lodash.pull(refDocInfo.docIds, docId); + + if (refDocInfo.docIds.length > 0) { + this.kvstore.put(refDocId, refDocInfo.toDict(), this.refDocCollection); + } + this.kvstore.delete(refDocId, this.metadataCollection); + } + } + + async deleteDocument(docId: string, raiseError: boolean = true, removeRefDocNode: boolean = true): Promise<void> { + if (removeRefDocNode) { + await this.removeRefDocNode(docId); + } + + let deleteSuccess = await this.kvstore.delete(docId, this.nodeCollection); + await this.kvstore.delete(docId, this.metadataCollection); + + if (!deleteSuccess && raiseError) { + throw new Error(`doc_id ${docId} not found.`); + } + } + + async deleteRefDoc(refDocId: string, raiseError: boolean = true): Promise<void> { + let refDocInfo = await this.getRefDocInfo(refDocId); + if (_.isNil(refDocInfo)) { + if (raiseError) { + throw new Error(`ref_doc_id ${refDocId} not found.`); + } else { + return; + } + } + + for (let docId of refDocInfo.docIds) { + await this.deleteDocument(docId, false, false); + } + + await this.kvstore.delete(refDocId, this.metadataCollection); + await this.kvstore.delete(refDocId, this.refDocCollection); + } + + async setDocumentHash(docId: string, docHash: string): Promise<void> { + let metadata = { docHash: docHash }; + await this.kvstore.put(docId, metadata, this.metadataCollection); + } + + async getDocumentHash(docId: string): Promise<string | undefined> { + let metadata = await this.kvstore.get(docId, this.metadataCollection); + return _.get(metadata, 'docHash'); + } +} diff --git a/packages/core/src/storage/docStore/SimpleDocumentStore.ts b/packages/core/src/storage/docStore/SimpleDocumentStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..968d6247f41fa8d746385a7f62136ef7bf1dab01 --- /dev/null +++ b/packages/core/src/storage/docStore/SimpleDocumentStore.ts @@ -0,0 +1,70 @@ +import * as path from 'path'; +import _ from 'lodash'; +import { KVDocumentStore } from './KVDocumentStore'; +import { SimpleKVStore } from '../kvStore/SimpleKVStore'; +import { BaseInMemoryKVStore } from '../kvStore/types'; +import { GenericFileSystem } from '../FileSystem'; +import { + DEFAULT_PERSIST_DIR, + DEFAULT_NAMESPACE, + DEFAULT_DOC_STORE_PERSIST_FILENAME, + DEFAULT_FS +} from '../constants'; + +type SaveDict = {[key: string]: any}; + +export class SimpleDocumentStore extends KVDocumentStore { + private kvStore: SimpleKVStore; + + constructor(kvStore?: SimpleKVStore , namespace?: string) { + kvStore = kvStore || new SimpleKVStore(); + namespace = namespace || DEFAULT_NAMESPACE; + super(kvStore, namespace); + this.kvStore = kvStore; + } + + static async fromPersistDir( + persistDir: string = DEFAULT_PERSIST_DIR, + namespace?: string, + fsModule?: GenericFileSystem + ): Promise<SimpleDocumentStore> { + const persistPath = path.join(persistDir, DEFAULT_DOC_STORE_PERSIST_FILENAME); + return await SimpleDocumentStore.fromPersistPath(persistPath, namespace, fsModule); + } + + static async fromPersistPath( + persistPath: string, + namespace?: string, + fs?: GenericFileSystem + ): Promise<SimpleDocumentStore> { + fs = fs || DEFAULT_FS; + const simpleKVStore = await SimpleKVStore.fromPersistPath(persistPath, fs); + return new SimpleDocumentStore(simpleKVStore, namespace); + } + + async persist( + persistPath: string = path.join(DEFAULT_PERSIST_DIR, DEFAULT_DOC_STORE_PERSIST_FILENAME), + fs?: GenericFileSystem + ): Promise<void> { + fs = fs || DEFAULT_FS; + if (_.isObject(this.kvStore) && this.kvStore instanceof BaseInMemoryKVStore) { + await this.kvStore.persist(persistPath, fs); + } + } + + static fromDict( + saveDict: SaveDict, + namespace?: string + ): SimpleDocumentStore { + const simpleKVStore = SimpleKVStore.fromDict(saveDict); + return new SimpleDocumentStore(simpleKVStore, namespace); + } + + toDict(): SaveDict { + if (_.isObject(this.kvStore) && this.kvStore instanceof SimpleKVStore) { + return this.kvStore.toDict(); + } + // If the kvstore is not a SimpleKVStore, you might want to throw an error or return a default value. + throw new Error("KVStore is not a SimpleKVStore"); + } +} diff --git a/packages/core/src/storage/docStore/types.ts b/packages/core/src/storage/docStore/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..9084e2d04ab63f0b7d39ce868ec3e1b78604a1ae --- /dev/null +++ b/packages/core/src/storage/docStore/types.ts @@ -0,0 +1,63 @@ +import { Node } from "../../Node"; +import { BaseDocument } from "../../Document"; +import { GenericFileSystem } from "../FileSystem"; +import { DEFAULT_PERSIST_DIR, DEFAULT_DOC_STORE_PERSIST_FILENAME } from "../constants"; + +const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_DOC_STORE_PERSIST_FILENAME}`; + + +export interface RefDocInfo { + docIds: string[]; + extraInfo: {[key: string]: any}; +} + +export abstract class BaseDocumentStore { + // Save/load + persist(persistPath: string = defaultPersistPath, fs?: GenericFileSystem): void { + // Persist the docstore to a file. + } + + // Main interface + abstract docs(): Promise<Record<string, BaseDocument>>; + + abstract addDocuments(docs: BaseDocument[], allowUpdate: boolean): void; + + abstract getDocument(docId: string, raiseError: boolean): Promise<BaseDocument | undefined>; + + abstract deleteDocument(docId: string, raiseError: boolean): void; + + abstract documentExists(docId: string): Promise<boolean>; + + // Hash + abstract setDocumentHash(docId: string, docHash: string): void; + + abstract getDocumentHash(docId: string): Promise<string | undefined>; + + // Ref Docs + abstract getAllRefDocInfo(): Promise<{[key: string]: RefDocInfo} | undefined>; + + abstract getRefDocInfo(refDocId: string): Promise<RefDocInfo | undefined>; + + abstract deleteRefDoc(refDocId: string, raiseError: boolean): Promise<void>; + + // Nodes + getNodes(nodeIds: string[], raiseError: boolean = true): Promise<Node[]> { + return Promise.all(nodeIds.map(nodeId => this.getNode(nodeId, raiseError))); + } + + async getNode(nodeId: string, raiseError: boolean = true): Promise<Node> { + let doc = await this.getDocument(nodeId, raiseError); + if (!(doc instanceof Node)) { + throw new Error(`Document ${nodeId} is not a Node.`); + } + return doc; + } + + async getNodeDict(nodeIdDict: {[index: number]: string}): Promise<{[index: number]: Node}> { + let result: {[index: number]: Node} = {}; + for (let index in nodeIdDict) { + result[index] = await this.getNode(nodeIdDict[index]); + } + return result; + } +} diff --git a/packages/core/src/storage/docStore/utils.ts b/packages/core/src/storage/docStore/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..059174429a12cb462fd898a5bce86cd5632bdaf9 --- /dev/null +++ b/packages/core/src/storage/docStore/utils.ts @@ -0,0 +1,31 @@ +import { Node } from "../../Node"; +import { BaseDocument, Document, NodeType } from '../../Document'; + +const TYPE_KEY = "__type__"; +const DATA_KEY = "__data__"; + + +export function docToJson(doc: BaseDocument): Record<string, any> { + return { + [DATA_KEY]: JSON.stringify(doc), + [TYPE_KEY]: doc.getType(), + }; +} + +export function jsonToDoc(docDict: Record<string, any>): BaseDocument { + let docType = docDict[TYPE_KEY]; + let dataDict = docDict[DATA_KEY]; + let doc: BaseDocument; + + if (docType === NodeType.DOCUMENT) { + doc = new Document(dataDict.text, dataDict.docId, dataDict.embedding, dataDict.docHash); + } else if (docType === NodeType.TEXT) { + const reslationships = dataDict.relationships; + doc = new Node(reslationships.text, reslationships.docId, + reslationships.embedding, reslationships.docHash); + } else { + throw new Error(`Unknown doc type: ${docType}`); + } + + return doc; +} diff --git a/packages/core/src/storage/indexStore/KVIndexStore.ts b/packages/core/src/storage/indexStore/KVIndexStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..7e2f5eed044d6143d3a5942b6b6a30258d62dd16 --- /dev/null +++ b/packages/core/src/storage/indexStore/KVIndexStore.ts @@ -0,0 +1,47 @@ +import { BaseKVStore } from '../kvStore/types'; +import { IndexStruct, indexStructToJson, jsonToIndexStruct } from '../../dataStructs'; +import _ from 'lodash'; +import { DEFAULT_NAMESPACE } from '../constants'; +import { BaseIndexStore } from './types'; + +export class KVIndexStore extends BaseIndexStore { + private _kvStore: BaseKVStore; + private _collection: string; + + constructor(kvStore: BaseKVStore, namespace: string = DEFAULT_NAMESPACE) { + super(); + this._kvStore = kvStore; + this._collection = `${namespace}/data`; + } + + async addIndexStruct(indexStruct: IndexStruct): Promise<void> { + let key = indexStruct.indexId; + let data = indexStructToJson(indexStruct); + await this._kvStore.put(key, data, this._collection); + } + + async deleteIndexStruct(key: string): Promise<void> { + await this._kvStore.delete(key, this._collection); + } + + async getIndexStruct(structId?: string): Promise<IndexStruct | undefined> { + if (_.isNil(structId)) { + let structs = await this.getIndexStructs(); + if (structs.length !== 1) { + throw new Error('More than one index struct found'); + } + return structs[0]; + } else { + let json = await this._kvStore.get(structId, this._collection); + if (_.isNil(json)) { + return; + } + return jsonToIndexStruct(json); + } + } + + async getIndexStructs(): Promise<IndexStruct[]> { + let jsons = await this._kvStore.getAll(this._collection) as {[key: string]: any}; + return _.values(jsons).map(json => jsonToIndexStruct(json)); + } +} diff --git a/packages/core/src/storage/indexStore/SimpleIndexStore.ts b/packages/core/src/storage/indexStore/SimpleIndexStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..82a006913d4f28adefd332827304682f067121c8 --- /dev/null +++ b/packages/core/src/storage/indexStore/SimpleIndexStore.ts @@ -0,0 +1,43 @@ +import * as path from 'path'; +import * as _ from 'lodash'; +import { BaseInMemoryKVStore } from "../kvStore/types"; +import { SimpleKVStore, DataType } from "../kvStore/SimpleKVStore"; +import { KVIndexStore } from "./KVIndexStore"; +import { DEFAULT_PERSIST_DIR, DEFAULT_INDEX_STORE_PERSIST_FILENAME, DEFAULT_FS } from '../constants'; +import { GenericFileSystem } from '../FileSystem'; + +export class SimpleIndexStore extends KVIndexStore { + private kvStore: BaseInMemoryKVStore; + + constructor(kvStore?: BaseInMemoryKVStore) { + kvStore = kvStore || new SimpleKVStore(); + super(kvStore); + this.kvStore = kvStore; + } + + static async fromPersistDir(persistDir: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleIndexStore> {; + const persistPath = path.join(persistDir, DEFAULT_INDEX_STORE_PERSIST_FILENAME); + return this.fromPersistPath(persistPath, fs); + } + + static async fromPersistPath(persistPath: string, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleIndexStore> { + let simpleKVStore = await SimpleKVStore.fromPersistPath(persistPath, fs); + return new SimpleIndexStore(simpleKVStore); + } + + async persist(persistPath: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<void> { + await this.kvStore.persist(persistPath, fs); + } + + static fromDict(saveDict: DataType): SimpleIndexStore { + let simpleKVStore = SimpleKVStore.fromDict(saveDict); + return new SimpleIndexStore(simpleKVStore); + } + + toDict(): Record<string, unknown> { + if (!(this.kvStore instanceof SimpleKVStore)) { + throw new Error("KVStore is not a SimpleKVStore"); + } + return this.kvStore.toDict(); + } +} diff --git a/packages/core/src/storage/indexStore/types.ts b/packages/core/src/storage/indexStore/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2809863ba5470ab13591bc69d4eaa2a9030e503 --- /dev/null +++ b/packages/core/src/storage/indexStore/types.ts @@ -0,0 +1,19 @@ +import { IndexStruct } from "llama_index/data_structs/data_structs"; +import { GenericFileSystem } from "../FileSystem"; +import { DEFAULT_PERSIST_DIR, DEFAULT_INDEX_STORE_PERSIST_FILENAME } from "../constants"; + +const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_INDEX_STORE_PERSIST_FILENAME}`; + +export abstract class BaseIndexStore { + abstract getIndexStructs(): Promise<IndexStruct[]>; + + abstract addIndexStruct(indexStruct: IndexStruct): Promise<void>; + + abstract deleteIndexStruct(key: string): Promise<void>; + + abstract getIndexStruct(structId?: string): Promise<IndexStruct | undefined>; + + async persist(persistPath: string = defaultPersistPath, fs?: GenericFileSystem): Promise<void> { + // Persist the index store to disk. + } +} diff --git a/packages/core/src/storage/kvStore/SimpleKVStore.ts b/packages/core/src/storage/kvStore/SimpleKVStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..3cc2f4df4e3d266c1b0fb7bd7bc76026d131d904 --- /dev/null +++ b/packages/core/src/storage/kvStore/SimpleKVStore.ts @@ -0,0 +1,73 @@ +import * as path from 'path'; +import { GenericFileSystem } from '../FileSystem'; +import { DEFAULT_COLLECTION, DEFAULT_FS } from '../constants'; +import * as _ from "lodash"; +import { BaseKVStore } from "./types"; + +export interface DataType { + [key: string]: { [key: string]: any }; +} + + +export class SimpleKVStore extends BaseKVStore { + private data: DataType; + + constructor(data?: DataType) { + super(); + this.data = data || {}; + } + + async put(key: string, val: any, collection: string = DEFAULT_COLLECTION): Promise<void> { + if (!(collection in this.data)) { + this.data[collection] = {}; + } + this.data[collection][key] = _.clone(val); // Creating a shallow copy of the object + } + + async get(key: string, collection: string = DEFAULT_COLLECTION): Promise<any> { + let collectionData = this.data[collection]; + if (_.isNil(collectionData)) { + return null; + } + if (!(key in collectionData)) { + return null; + } + return _.clone(collectionData[key]); // Creating a shallow copy of the object + } + + async getAll(collection: string = DEFAULT_COLLECTION): Promise<DataType> { + return _.clone(this.data[collection]); // Creating a shallow copy of the object + } + + async delete(key: string, collection: string = DEFAULT_COLLECTION): Promise<boolean> { + if (key in this.data[collection]) { + delete this.data[collection][key]; + return true; + } + return false; + } + + async persist(persistPath: string, fs?: GenericFileSystem): Promise<void> { + fs = fs || DEFAULT_FS; + // TODO: decide on a way to polyfill path + let dirPath = path.dirname(persistPath); + if (!(await fs.exists(dirPath))) { + await fs.mkdir(dirPath); + } + await fs.writeFile(persistPath, JSON.stringify(this.data)); + } + + static async fromPersistPath(persistPath: string, fs?: GenericFileSystem ): Promise<SimpleKVStore> { + fs = fs || DEFAULT_FS; + let data = JSON.parse(await fs.readFile(persistPath, { encoding: 'utf-8' })); + return new SimpleKVStore(data); + } + + toDict(): DataType { + return this.data; + } + + static fromDict(saveDict: DataType): SimpleKVStore { + return new SimpleKVStore(saveDict); + } +} diff --git a/packages/core/src/storage/kvStore/types.ts b/packages/core/src/storage/kvStore/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..333c22e6eaad5c758c5e9ec41432a990bafba9a3 --- /dev/null +++ b/packages/core/src/storage/kvStore/types.ts @@ -0,0 +1,18 @@ +import { GenericFileSystem } from "../FileSystem"; +const defaultCollection = "data"; + +type StoredValue = {[key: string]: any} | null; + +export abstract class BaseKVStore { + abstract put(key: string, val: {[key: string]: any}, collection?: string): Promise<void>; + abstract get(key: string, collection?: string): Promise<StoredValue>; + abstract getAll(collection?: string): Promise<{[key: string]: StoredValue}>; + abstract delete(key: string, collection?: string): Promise<boolean>; +} + +export abstract class BaseInMemoryKVStore extends BaseKVStore { + abstract persist(persistPath: string, fs?: GenericFileSystem): void; + static fromPersistPath(persistPath: string): BaseInMemoryKVStore { + throw new Error("Method not implemented."); + } +} diff --git a/packages/core/src/storage/vectorStore/SimpleVectorStore.ts b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..c2ef189eb758e6abfa5f6a47f078f93fc5d16797 --- /dev/null +++ b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts @@ -0,0 +1,134 @@ +import _ from "lodash"; +import { GenericFileSystem } from "../FileSystem"; +import { NodeWithEmbedding, VectorStore, VectorStoreQuery, VectorStoreQueryMode, VectorStoreQueryResult } from "./types"; +import { getTopKEmbeddings, getTopKEmbeddingsLearner, getTopKMMREmbeddings } from '../../Embedding'; +import { DEFAULT_PERSIST_DIR, DEFAULT_FS } from '../constants'; + +const LEARNER_MODES = new Set<VectorStoreQueryMode>([ + VectorStoreQueryMode.SVM, + VectorStoreQueryMode.LINEAR_REGRESSION, + VectorStoreQueryMode.LOGISTIC_REGRESSION +]); + +const MMR_MODE = VectorStoreQueryMode.MMR; + +class SimpleVectorStoreData { + embeddingDict: {[key: string]: number[]} = {}; + textIdToRefDocId: {[key: string]: string} = {}; +} + +export class SimpleVectorStore implements VectorStore { + storesText: boolean = false; + private data: SimpleVectorStoreData = new SimpleVectorStoreData(); + private fs: GenericFileSystem = DEFAULT_FS; + + constructor(data?: SimpleVectorStoreData, fs?: GenericFileSystem) { + this.data = data || new SimpleVectorStoreData(); + this.fs = fs || DEFAULT_FS; + } + + static async fromPersistDir(persistDir: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleVectorStore> { + let persistPath = `${persistDir}/vector_store.json`; + return await SimpleVectorStore.fromPersistPath(persistPath, fs); + } + + get client(): any { + return null; + } + + get(textId: string): number[] { + return this.data.embeddingDict[textId]; + } + + add(embeddingResults: NodeWithEmbedding[]): string[] { + for (let result of embeddingResults) { + this.data.embeddingDict[result.id()] = result.embedding; + this.data.textIdToRefDocId[result.id()] = result.refDocId(); + } + return embeddingResults.map(result => result.id()); + } + + delete(refDocId: string): void { + let textIdsToDelete = Object.keys(this.data.textIdToRefDocId).filter(textId => this.data.textIdToRefDocId[textId] === refDocId); + for (let textId of textIdsToDelete) { + delete this.data.embeddingDict[textId]; + delete this.data.textIdToRefDocId[textId]; + } + } + + query(query: VectorStoreQuery): VectorStoreQueryResult { + if (!_.isNil(query.filters)) { + throw new Error("Metadata filters not implemented for SimpleVectorStore yet."); + } + + let items = Object.entries(this.data.embeddingDict); + + let nodeIds: string[], embeddings: number[][]; + if (query.docIds) { + let availableIds = new Set(query.docIds); + const queriedItems = items.filter(item => availableIds.has(item[0])); + nodeIds = queriedItems.map(item => item[0]); + embeddings = queriedItems.map(item => item[1]); + } else { + // No docIds specified, so use all available items + nodeIds = items.map(item => item[0]); + embeddings = items.map(item => item[1]); + } + + let queryEmbedding = query.queryEmbedding!; + + let topSimilarities: number[], topIds: string[]; + if (LEARNER_MODES.has(query.mode)) { + [topSimilarities, topIds] = getTopKEmbeddingsLearner(queryEmbedding, embeddings, query.similarityTopK, nodeIds); + } else if (query.mode === MMR_MODE) { + let mmrThreshold = query.mmrThreshold; + [topSimilarities, topIds] = getTopKMMREmbeddings(queryEmbedding, embeddings, query.similarityTopK, nodeIds, mmrThreshold); + } else if (query.mode === VectorStoreQueryMode.DEFAULT) { + [topSimilarities, topIds] = getTopKEmbeddings(queryEmbedding, embeddings, query.similarityTopK, nodeIds); + } else { + throw new Error(`Invalid query mode: ${query.mode}`); + } + + return { + similarities: topSimilarities, + ids: topIds + } + } + + async persist(persistPath: string = `${DEFAULT_PERSIST_DIR}/vector_store.json`, fs?: GenericFileSystem): Promise<void> { + fs = fs || this.fs; + if (!(await fs.exists(persistPath))) { + await fs.mkdir(persistPath); + } + + await fs.writeFile(persistPath, JSON.stringify(this.data)); + } + + static async fromPersistPath(persistPath: string, fs?: GenericFileSystem): Promise<SimpleVectorStore> { + fs = fs || DEFAULT_FS; + if (!(await fs.exists(persistPath))) { + throw new Error(`No existing SimpleVectorStore found at ${persistPath}, skipping load.`); + } + + console.debug(`Loading SimpleVectorStore from ${persistPath}.`); + let dataDict = JSON.parse(await fs.readFile(persistPath, 'utf-8')); + let data = new SimpleVectorStoreData(); + data.embeddingDict = dataDict.embeddingDict; + data.textIdToRefDocId = dataDict.textIdToRefDocId; + return new SimpleVectorStore(data); + } + + static fromDict(saveDict: SimpleVectorStoreData): SimpleVectorStore { + let data = new SimpleVectorStoreData(); + data.embeddingDict = saveDict.embeddingDict; + data.textIdToRefDocId = saveDict.textIdToRefDocId; + return new SimpleVectorStore(data); + } + + toDict(): SimpleVectorStoreData { + return { + embeddingDict: this.data.embeddingDict, + textIdToRefDocId: this.data.textIdToRefDocId + }; + } +} diff --git a/packages/core/src/storage/vectorStore/types.ts b/packages/core/src/storage/vectorStore/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..033301802d6fe05ffab12a5f93a2f45f3c4f9d19 --- /dev/null +++ b/packages/core/src/storage/vectorStore/types.ts @@ -0,0 +1,75 @@ +import { Node } from "../../Node"; +import { GenericFileSystem } from "../FileSystem"; + +export interface NodeWithEmbedding { + node: Node; + embedding: number[]; + + id(): string; + refDocId(): string; +} + +export interface VectorStoreQueryResult { + nodes?: Node[]; + similarities?: number[]; + ids?: string[]; +} + +export enum VectorStoreQueryMode { + DEFAULT = "default", + SPARSE = "sparse", + HYBRID = "hybrid", + // fit learners + SVM = "svm", + LOGISTIC_REGRESSION = "logistic_regression", + LINEAR_REGRESSION = "linear_regression", + // maximum marginal relevance + MMR = "mmr" +} + +export interface ExactMatchFilter { + key: string; + value: string | number; +} + +export interface MetadataFilters { + filters: ExactMatchFilter[]; +} + +export interface VectorStoreQuerySpec { + query: string; + filters: ExactMatchFilter[]; + topK?: number; +} + +export interface MetadataInfo { + name: string; + type: string; + description: string; +} + +export interface VectorStoreInfo { + metadataInfo: MetadataInfo[]; + contentInfo: string; +} + +export interface VectorStoreQuery { + queryEmbedding?: number[]; + similarityTopK: number; + docIds?: string[]; + queryStr?: string; + mode: VectorStoreQueryMode; + alpha?: number; + filters?: MetadataFilters; + mmrThreshold?: number; +} + +export interface VectorStore { + storesText: boolean; + isEmbeddingQuery?: boolean; + client(): any; + add(embeddingResults: NodeWithEmbedding[]): string[]; + delete(refDocId: string, deleteKwargs?: any): void; + query(query: VectorStoreQuery, kwargs?: any): VectorStoreQueryResult; + persist(persistPath: string, fs?: GenericFileSystem): void; +} diff --git a/packages/core/src/tests/InMemoryFileSystem.test.ts b/packages/core/src/tests/InMemoryFileSystem.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac09d816448810567dc880a3e8997f88dae7a442 --- /dev/null +++ b/packages/core/src/tests/InMemoryFileSystem.test.ts @@ -0,0 +1,90 @@ +import { GenericFileSystem, getNodeFS, InMemoryFileSystem } from "../storage/FileSystem"; +import os from 'os'; +import path from 'path'; + +type FileSystemUnderTest = { + name: string, + prepare: () => Promise<any>, + cleanup: () => Promise<any>, + implementation: GenericFileSystem, + tempDir: string +}; + +const nodeFS = getNodeFS() as GenericFileSystem & any; + +describe.each<FileSystemUnderTest>([ + { + name: 'InMemoryFileSystem', + prepare: async () => {}, + cleanup: async function() { + this.implementation = new InMemoryFileSystem(); + }, + implementation: new InMemoryFileSystem(), + tempDir: './' + }, + { + name: 'Node.js fs', + prepare: async function() { + this.tempDir = await nodeFS.mkdtemp(path.join(os.tmpdir(), 'jest-')); + }, + cleanup: async function() { + await nodeFS.rm(this.tempDir, { recursive: true }); + }, + implementation: nodeFS, + tempDir: './' + } +])("Test %s", (testParams) => { + let testFS: GenericFileSystem; + let tempDir: string; + + beforeEach(async () => { + await testParams.prepare(); + testFS = testParams.implementation; + tempDir = testParams.tempDir; + }); + + afterEach(async () => { + await testParams.cleanup(); + }); + + test("initializes", () => { + expect(testFS).toBeTruthy(); + }); + + describe("writeFile", () => { + it("writes file to memory", async () => { + await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!"); + expect(await testFS.readFile(`${tempDir}/test.txt`, "utf-8")).toBe("Hello, world!"); + }); + + it("overwrites existing file", async () => { + await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!"); + await testFS.writeFile(`${tempDir}/test.txt`, "Hello, again!"); + expect(await testFS.readFile(`${tempDir}/test.txt`, "utf-8")).toBe("Hello, again!"); + }); + }); + + describe("readFile", () => { + it("throws error for non-existing file", async () => { + await expect(testFS.readFile(`${tempDir}/not_exist.txt`, "utf-8")).rejects.toThrow(); + }); + }); + + describe("exists", () => { + it("returns true for existing file", async () => { + await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!"); + expect(await testFS.exists(`${tempDir}/test.txt`)).toBe(true); + }); + + it("returns false for non-existing file", async () => { + expect(await testFS.exists(`${tempDir}/not_exist.txt`)).toBe(false); + }); + }); + + describe("mkdir", () => { + it("creates directory if it doesn't exist", async () => { + await testFS.mkdir(`${tempDir}/testDir`); + expect(await testFS.exists(`${tempDir}/testDir`)).toBe(true); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6e071e7b3017bc62858d239eb872d9ef9b14ec3..508749e672d5c9817cdb3b4f77dfe658c840ecad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,6 +128,9 @@ importers: js-tiktoken: specifier: ^1.0.7 version: 1.0.7 + lodash: + specifier: ^4.17.21 + version: 4.17.21 openai: specifier: ^3.3.0 version: 3.3.0 @@ -135,12 +138,18 @@ importers: specifier: ^9.0.0 version: 9.0.0 devDependencies: + '@types/lodash': + specifier: ^4.14.195 + version: 4.14.195 '@types/node': specifier: ^18 version: 18.6.0 '@types/uuid': specifier: ^9.0.2 version: 9.0.2 + node-stdlib-browser: + specifier: ^1.2.0 + version: 1.2.0 packages/eslint-config-custom: dependencies: @@ -1100,6 +1109,10 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: true + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true @@ -1376,6 +1389,24 @@ packages: get-intrinsic: 1.2.0 dev: false + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + + /assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.5 + util: 0.12.5 + dev: true + /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false @@ -1391,7 +1422,6 @@ packages: /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dev: false /axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} @@ -1503,6 +1533,14 @@ packages: readable-stream: 3.6.2 dev: true + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -1528,6 +1566,71 @@ packages: dependencies: fill-range: 7.0.1 + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + dependencies: + resolve: 1.22.2 + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + /browserslist@4.21.9: resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1555,6 +1658,10 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -1562,6 +1669,10 @@ packages: ieee754: 1.2.1 dev: true + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -1587,7 +1698,6 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1669,6 +1779,13 @@ packages: engines: {node: '>=8'} dev: true + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true @@ -1754,6 +1871,10 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + /constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} dependencies: @@ -1761,6 +1882,10 @@ packages: upper-case: 1.1.3 dev: true + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -1773,6 +1898,34 @@ packages: requiresBuild: true dev: true + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -1785,6 +1938,22 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true @@ -1890,7 +2059,6 @@ packages: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - dev: false /del@5.1.0: resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} @@ -1911,6 +2079,13 @@ packages: engines: {node: '>=0.4.0'} dev: false + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1926,6 +2101,14 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1945,6 +2128,11 @@ packages: dependencies: esutils: 2.0.3 + /domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + dev: true + /dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} dependencies: @@ -1954,6 +2142,18 @@ packages: /electron-to-chromium@1.4.432: resolution: {integrity: sha512-yz3U/khQgAFT2HURJA3/F4fKIyO2r5eK09BQzBZFd6BvBSSaRuzKc2ZNBHtJcO75/EKiRYbVYJZ2RB0P4BuD2g==} + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -2064,6 +2264,10 @@ packages: is-symbol: 1.0.4 dev: false + /es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -2419,6 +2623,18 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2530,6 +2746,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2554,7 +2778,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: false /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -2620,7 +2843,6 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: false /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -2728,7 +2950,6 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 - dev: false /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2761,7 +2982,6 @@ packages: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 - dev: false /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -2771,14 +2991,12 @@ packages: /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: false /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: false /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} @@ -2786,6 +3004,22 @@ packages: dependencies: function-bind: 1.1.1 + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} dependencies: @@ -2793,10 +3027,22 @@ packages: upper-case: 1.1.3 dev: true + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2918,7 +3164,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: false /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -2949,7 +3194,6 @@ packages: /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: false /is-core-module@2.12.0: resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} @@ -2986,6 +3230,13 @@ packages: engines: {node: '>=6'} dev: true + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -3014,6 +3265,14 @@ packages: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: false + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -3090,7 +3349,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: false /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -3139,6 +3397,11 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + dev: true + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -3693,6 +3956,13 @@ packages: p-locate: 4.1.0 dev: true + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true @@ -3709,7 +3979,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -3762,6 +4031,14 @@ packages: tmpl: 1.0.5 dev: true + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3776,6 +4053,14 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3797,6 +4082,14 @@ packages: engines: {node: '>=12'} dev: false + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3916,6 +4209,39 @@ packages: /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-stdlib-browser@1.2.0: + resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} + engines: {node: '>=10'} + dependencies: + assert: 2.0.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.1 + util: 0.12.5 + vm-browserify: 1.1.2 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3940,7 +4266,6 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: false /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -3948,12 +4273,10 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - dev: false /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - dev: false /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} @@ -4062,6 +4385,10 @@ packages: wcwidth: 1.0.1 dev: true + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -4088,6 +4415,13 @@ packages: p-limit: 2.3.0 dev: true + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + /p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} @@ -4100,6 +4434,10 @@ packages: engines: {node: '>=6'} dev: true + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} dependencies: @@ -4112,6 +4450,16 @@ packages: dependencies: callsites: 3.1.0 + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -4129,6 +4477,10 @@ packages: upper-case-first: 1.1.2 dev: true + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-case@2.1.1: resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} dependencies: @@ -4160,6 +4512,17 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -4179,6 +4542,13 @@ packages: find-up: 4.1.0 dev: true + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + /postcss@8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} @@ -4261,6 +4631,11 @@ packages: react-is: 18.2.0 dev: true + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -4281,6 +4656,21 @@ packages: react-is: 16.13.1 dev: false + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -4289,9 +4679,34 @@ packages: resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} dev: true + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} dependencies: @@ -4405,6 +4820,7 @@ packages: /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true dependencies: is-core-module: 2.12.0 path-parse: 1.0.7 @@ -4412,6 +4828,7 @@ packages: /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true dependencies: is-core-module: 2.12.0 path-parse: 1.0.7 @@ -4435,6 +4852,13 @@ packages: dependencies: glob: 7.2.3 + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} @@ -4504,6 +4928,18 @@ packages: upper-case-first: 1.1.2 dev: true + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4520,7 +4956,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.0 object-inspect: 1.12.3 - dev: false /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4586,6 +5021,22 @@ packages: internal-slot: 1.0.5 dev: false + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4777,6 +5228,13 @@ packages: engines: {node: '>= 14'} dev: true + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + /title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} dependencies: @@ -4900,6 +5358,10 @@ packages: typescript: 4.9.5 dev: false + /tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + dev: true + /turbo-darwin-64@1.10.3: resolution: {integrity: sha512-IIB9IomJGyD3EdpSscm7Ip1xVWtYb7D0x7oH3vad3gjFcjHJzDz9xZ/iw/qItFEW+wGFcLSRPd+1BNnuLM8AsA==} cpu: [x64] @@ -5052,10 +5514,27 @@ packages: dependencies: punycode: 2.3.0 + /url@0.11.1: + resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==} + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.10 + which-typed-array: 1.1.9 + dev: true + /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true @@ -5084,6 +5563,10 @@ packages: builtins: 5.0.1 dev: true + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -5125,7 +5608,6 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - dev: false /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -5165,6 +5647,11 @@ packages: signal-exit: 3.0.7 dev: true + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'}