From c653128c22376eee93eba06de6db657f77b3a116 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 3 Sep 2025 18:32:00 -0300 Subject: [PATCH 01/48] refactor: Migrate CreateSingleItemModal class component to a function component --- .../CreateSingleItemModal.container.ts | 9 +- .../CreateSingleItemModal.tsx | 1636 +++++++++-------- .../CreateSingleItemModal.types.ts | 13 +- 3 files changed, 853 insertions(+), 805 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.container.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.container.ts index eb7c28616..cad210223 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.container.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.container.ts @@ -4,7 +4,7 @@ import { isLoadingType } from 'decentraland-dapps/dist/modules/loading/selectors import { RootState } from 'modules/common/types' import { getCollection } from 'modules/collection/selectors' import { Collection } from 'modules/collection/types' -import { getIsLinkedWearablesV2Enabled, getIsOffchainPublicItemOrdersEnabled } from 'modules/features/selectors' +import { getIsLinkedWearablesV2Enabled } from 'modules/features/selectors' import { saveItemRequest, SAVE_ITEM_REQUEST } from 'modules/item/actions' import { getLoading, getError, getStatusByItemId } from 'modules/item/selectors' import { MapStateProps, MapDispatchProps, MapDispatch, OwnProps } from './CreateSingleItemModal.types' @@ -18,12 +18,11 @@ const mapState = (state: RootState, ownProps: OwnProps): MapStateProps => { return { collection, + itemStatus, address: getAddress(state), error: getError(state), - isThirdPartyV2Enabled: getIsLinkedWearablesV2Enabled(state), - isOffchainPublicItemOrdersEnabled: getIsOffchainPublicItemOrdersEnabled(state), - itemStatus, - isLoading: isLoadingType(getLoading(state), SAVE_ITEM_REQUEST) + isLoading: isLoadingType(getLoading(state), SAVE_ITEM_REQUEST), + isThirdPartyV2Enabled: getIsLinkedWearablesV2Enabled(state) } } diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 9a2472a36..7adfd55ea 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import React, { useState, useRef, useCallback, useMemo } from 'react' import { ethers } from 'ethers' import { BodyPartCategory, @@ -108,37 +108,200 @@ import { CreateSingleItemModalMetadata, StateData, SortedContent, - AcceptedFileProps, - ITEM_LOADED_CHECK_DELAY + AcceptedFileProps + // ITEM_LOADED_CHECK_DELAY } from './CreateSingleItemModal.types' import './CreateSingleItemModal.css' const defaultMapping: Mapping = { type: MappingType.ANY } -export default class CreateSingleItemModal extends React.PureComponent { - state: State = this.getInitialState() - thumbnailInput = React.createRef() - videoInput = React.createRef() - modalContainer = React.createRef() - timer: ReturnType | undefined - - getDefaultMappings( - contract: LinkedContract | undefined, - isThirdPartyV2Enabled: boolean - ): Partial>> | undefined { - if (!isThirdPartyV2Enabled || !contract) { - return undefined + +/** + * Prefixes the content name by adding the adding the body shape name to it. + * + * @param bodyShape - The body shaped used to prefix the content name. + * @param contentKey - The content key or name to be prefixed. + */ +const prefixContentName = (bodyShape: BodyShapeType, contentKey: string): string => { + return `${bodyShape}/${contentKey}` +} + +/** + * Creates a new contents record with the names of the contents blobs record prefixed. + * The names need to be prefixed so they won't collide with other + * pre-uploaded models. The name of the content is the name of the uploaded file. + * + * @param bodyShape - The body shaped used to prefix the content names. + * @param contents - The contents which keys are going to be prefixed. + */ +const prefixContents = (bodyShape: BodyShapeType, contents: Record): Record => { + return Object.keys(contents).reduce((newContents: Record, key: string) => { + // Do not include the thumbnail, scenes, and video in each of the body shapes + if ([THUMBNAIL_PATH, VIDEO_PATH].includes(key)) { + return newContents } + newContents[prefixContentName(bodyShape, key)] = contents[key] + return newContents + }, {}) +} - return { - [contract.network]: { - [contract.address]: [defaultMapping] - } +/** + * Sorts the content into "male", "female" and "all" taking into consideration the body shape. + * All contains the item thumbnail and both male and female representations according to the shape. + * If the body representation is male, "female" will be an empty object and viceversa. + * + * @param bodyShape - The body shaped used to sort the content. + * @param contents - The contents to be sorted. + */ +const sortContent = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + const male = bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, contents) : {} + const female = + bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, contents) : {} + + const all: Record = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + if (contents[VIDEO_PATH]) { + all[VIDEO_PATH] = contents[VIDEO_PATH] + } + + return { male, female, all } +} + +const sortContentZipBothBodyShape = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + let male: Record = {} + let female: Record = {} + const both: Record = {} + + for (const [key, value] of Object.entries(contents)) { + if (key.startsWith('male/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE)) { + male[key] = value + } else if (key.startsWith('female/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE)) { + female[key] = value + } else { + both[key] = value + } + } + + male = { + ...male, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, both) : {}) + } + + female = { + ...female, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, both) : {}) + } + + const all = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + return { male, female, all } +} + +const buildRepresentations = (bodyShape: BodyShapeType, model: string, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: prefixContentName(BodyShapeType.MALE, model), + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: prefixContentName(BodyShapeType.FEMALE, model), + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +const buildRepresentationsZipBothBodyshape = (bodyShape: BodyShapeType, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: Object.keys(contents.male).find(content => content.includes('glb'))!, + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: Object.keys(contents.female).find(content => content.includes('glb'))!, + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +const getDefaultMappings = ( + contract: LinkedContract | undefined, + isThirdPartyV2Enabled: boolean +): Partial>> | undefined => { + if (!isThirdPartyV2Enabled || !contract) { + return undefined + } + + return { + [contract.network]: { + [contract.address]: [defaultMapping] } } +} + +const getLinkedContract = (collection: Collection | undefined | null): LinkedContract | undefined => { + if (!collection?.linkedContractAddress || !collection?.linkedContractNetwork) { + return undefined + } + + return { + address: collection.linkedContractAddress, + network: collection.linkedContractNetwork + } +} + +const getPlayModeOptions = () => { + const playModes: string[] = getEmotePlayModes() + + return playModes.map(value => ({ + value, + text: t(`emote.play_mode.${value}.text`), + description: t(`emote.play_mode.${value}.description`) + })) +} - getInitialState() { - const { metadata, collection, isThirdPartyV2Enabled } = this.props +export const CreateSingleItemModal: React.FC = props => { + const { address, collection, error, itemStatus, metadata, name, onClose, onSave, isLoading, isThirdPartyV2Enabled } = props + const thumbnailInput = useRef(null) + const modalContainer = useRef(null) + const getInitialState = useCallback((): State => { const state: State = { view: CreateItemView.IMPORT, playMode: EmotePlayMode.SIMPLE, @@ -152,7 +315,7 @@ export default class CreateSingleItemModal extends React.PureComponent(() => getInitialState()) - /** - * Creates a new contents record with the names of the contents blobs record prefixed. - * The names need to be prefixed so they won't collide with other - * pre-uploaded models. The name of the content is the name of the uploaded file. - * - * @param bodyShape - The body shaped used to prefix the content names. - * @param contents - The contents which keys are going to be prefixed. - */ - prefixContents(bodyShape: BodyShapeType, contents: Record): Record { - return Object.keys(contents).reduce((newContents: Record, key: string) => { - // Do not include the thumbnail, scenes, and video in each of the body shapes - if ([THUMBNAIL_PATH, VIDEO_PATH].includes(key)) { - return newContents + const createItem = useCallback( + async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { + id, + name, + description, + type, + metrics, + collectionId, + category, + playMode, + rarity, + hasScreenshotTaken, + requiredPermissions, + tags, + blockVrmExport, + mappings + } = state as StateData + + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection?.urn) + // If it's a third party item, we need to automatically create an URN for it by generating a random uuid different from the id + const decodedCollectionUrn: DecodedURN | null = collection?.urn ? decodeURN(collection.urn) : null + let urn: string | undefined + if (decodedCollectionUrn && isThirdPartyCollectionDecodedUrn(decodedCollectionUrn)) { + urn = buildThirdPartyURN( + decodedCollectionUrn.thirdPartyName, + decodedCollectionUrn.thirdPartyCollectionId, + getDefaultThirdPartyUrnSuffix(name) + ) } - newContents[this.prefixContentName(bodyShape, key)] = contents[key] - return newContents - }, {}) - } - /** - * Sorts the content into "male", "female" and "all" taking into consideration the body shape. - * All contains the item thumbnail and both male and female representations according to the shape. - * If the body representation is male, "female" will be an empty object and viceversa. - * - * @param bodyShape - The body shaped used to sort the content. - * @param contents - The contents to be sorted. - */ - sortContent = (bodyShape: BodyShapeType, contents: Record): SortedContent => { - const male = - bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? this.prefixContents(BodyShapeType.MALE, contents) : {} - const female = - bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? this.prefixContents(BodyShapeType.FEMALE, contents) : {} - - const all: Record = { - [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], - ...male, - ...female - } + // create item to save + let data: WearableData | EmoteDataADR74 + + if (type === ItemType.WEARABLE) { + const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] + data = { + category: category as WearableCategory, + replaces: [], + hides: [], + removesDefaultHiding, + tags: tags || [], + representations: [...representations], + requiredPermissions: requiredPermissions || [], + blockVrmExport: blockVrmExport ?? false, + outlineCompatible: true // it's going to be true for all the items. It can be deactivated later in the editor view + } as WearableData + } else { + data = { + category: category as EmoteCategory, + loop: playMode === EmotePlayMode.LOOP, + tags: tags || [], + representations: [...representations] + } as EmoteDataADR74 + } - if (contents[VIDEO_PATH]) { - all[VIDEO_PATH] = contents[VIDEO_PATH] - } + const contents = await computeHashes(sortedContents.all) - return { male, female, all } - } + const item: Item = { + id, + name, + urn, + description: description || '', + thumbnail: THUMBNAIL_PATH, + video: contents[VIDEO_PATH], + type, + collectionId, + totalSupply: 0, + isPublished: false, + isApproved: false, + inCatalyst: false, + blockchainContentHash: null, + currentContentHash: null, + catalystContentHash: null, + rarity: belongsToAThirdPartyCollection ? Rarity.UNIQUE : rarity, + data, + owner: address!, + metrics, + contents, + mappings: belongsToAThirdPartyCollection && mappings ? mappings : null, + createdAt: +new Date(), + updatedAt: +new Date() + } + + // If it's a Third Party Item, don't prompt the user with the SET PRICE view + if ((hasScreenshotTaken || type !== ItemType.EMOTE) && belongsToAThirdPartyCollection) { + item.price = '0' + item.beneficiary = ethers.constants.AddressZero + return onSave(item as Item, sortedContents.all) + } - sortContentZipBothBodyShape = (bodyShape: BodyShapeType, contents: Record): SortedContent => { - let male: Record = {} - let female: Record = {} - const both: Record = {} + if (hasScreenshotTaken || type !== ItemType.EMOTE) { + item.price = ethers.constants.MaxUint256.toString() + item.beneficiary = item.beneficiary || address + return onSave(item as Item, sortedContents.all) + } + + setState(prev => ({ + ...prev, + item, + itemSortedContents: sortedContents.all, + view: CreateItemView.THUMBNAIL, + fromView: CreateItemView.THUMBNAIL + })) + }, + [address, collection, state, onSave, setState] + ) + + const addItemRepresentation = useCallback( + async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { bodyShape, item: editedItem, requiredPermissions } = state as StateData + const hashedContents = await computeHashes(bodyShape === BodyShapeType.MALE ? sortedContents.male : sortedContents.female) + if (isWearable(editedItem)) { + const removesDefaultHiding = + editedItem.data.category === WearableCategory.UPPER_BODY || editedItem.data.hides.includes(WearableCategory.UPPER_BODY) + ? [BodyPartCategory.HANDS] + : [] + const item = { + ...editedItem, + data: { + ...editedItem.data, + representations: [ + ...editedItem.data.representations, + // add new representation + ...representations + ], + replaces: [...editedItem.data.replaces], + hides: [...editedItem.data.hides], + removesDefaultHiding: removesDefaultHiding, + tags: [...editedItem.data.tags], + requiredPermissions: requiredPermissions || [], + blockVrmExport: editedItem.data.blockVrmExport, + outlineCompatible: editedItem.data.outlineCompatible || true // it's going to be true for all the items. It can be deactivated later in the editor view + }, + contents: { + ...editedItem.contents, + ...hashedContents + }, + updatedAt: +new Date() + } - for (const [key, value] of Object.entries(contents)) { - if (key.startsWith('male/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE)) { - male[key] = value - } else if (key.startsWith('female/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE)) { - female[key] = value + // Do not change the thumbnail when adding a new representation + delete sortedContents.all[THUMBNAIL_PATH] + onSave(item, sortedContents.all) + } + }, + [state, onSave] + ) + + const modifyItem = useCallback( + async (pristineItem: Item, sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { name, bodyShape, type, mappings, metrics, category, playMode, requiredPermissions } = state as StateData + + let data: WearableData | EmoteDataADR74 + + if (type === ItemType.WEARABLE) { + const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] + data = { + ...pristineItem.data, + removesDefaultHiding, + category: category as WearableCategory, + requiredPermissions: requiredPermissions || [] + } as WearableData } else { - both[key] = value + data = { + ...pristineItem.data, + loop: playMode === EmotePlayMode.LOOP, + category: category as EmoteCategory + } as EmoteDataADR74 } - } - male = { - ...male, - ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? this.prefixContents(BodyShapeType.MALE, both) : {}) - } + const contents = await computeHashes(sortedContents.all) - female = { - ...female, - ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? this.prefixContents(BodyShapeType.FEMALE, both) : {}) - } + const item = { + ...pristineItem, + data, + name, + metrics, + contents, + mappings, + updatedAt: +new Date() + } - const all = { - [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], - ...male, - ...female - } + const wearableBodyShape = bodyShape === BodyShapeType.MALE ? BodyShape.MALE : BodyShape.FEMALE + const representationIndex = pristineItem.data.representations.findIndex( + (representation: WearableRepresentation) => representation.bodyShapes[0] === wearableBodyShape + ) + const pristineBodyShape = getBodyShapeType(pristineItem) + if (representations.length === 2 || representationIndex === -1 || pristineBodyShape === BodyShapeType.BOTH) { + // Unisex or Representation changed + item.data.representations = representations + } else { + // Edited representation + item.data.representations[representationIndex] = representations[0] + } - return { male, female, all } - } + if (itemStatus && [SyncStatus.UNPUBLISHED, SyncStatus.UNDER_REVIEW].includes(itemStatus) && isSmart(item) && VIDEO_PATH in contents) { + item.video = contents[VIDEO_PATH] + } + + onSave(item as Item, sortedContents.all) + }, + [itemStatus, state, onSave] + ) - createItem = async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { address, collection, onSave } = this.props + const isValid = useCallback((): boolean => { const { - id, name, - description, - type, + thumbnail, metrics, - collectionId, + bodyShape, category, playMode, rarity, - hasScreenshotTaken, - requiredPermissions, - tags, - blockVrmExport, - mappings - } = this.state as StateData - - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection?.urn) - // If it's a third party item, we need to automatically create an URN for it by generating a random uuid different from the id - const decodedCollectionUrn: DecodedURN | null = collection?.urn ? decodeURN(collection.urn) : null - let urn: string | undefined - if (decodedCollectionUrn && isThirdPartyCollectionDecodedUrn(decodedCollectionUrn)) { - urn = buildThirdPartyURN( - decodedCollectionUrn.thirdPartyName, - decodedCollectionUrn.thirdPartyCollectionId, - getDefaultThirdPartyUrnSuffix(name) - ) - } - - // create item to save - let data: WearableData | EmoteDataADR74 - - if (type === ItemType.WEARABLE) { - const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] - data = { - category: category as WearableCategory, - replaces: [], - hides: [], - removesDefaultHiding, - tags: tags || [], - representations: [...representations], - requiredPermissions: requiredPermissions || [], - blockVrmExport: blockVrmExport ?? false, - outlineCompatible: true // it's going to be true for all the items. It can be deactivated later in the editor view - } as WearableData - } else { - data = { - category: category as EmoteCategory, - loop: playMode === EmotePlayMode.LOOP, - tags: tags || [], - representations: [...representations] - } as EmoteDataADR74 - } - - const contents = await computeHashes(sortedContents.all) - - const item: Item = { - id, - name, - urn, - description: description || '', - thumbnail: THUMBNAIL_PATH, - video: contents[VIDEO_PATH], + item, + isRepresentation, type, - collectionId, - totalSupply: 0, - isPublished: false, - isApproved: false, - inCatalyst: false, - blockchainContentHash: null, - currentContentHash: null, - catalystContentHash: null, - rarity: belongsToAThirdPartyCollection ? Rarity.UNIQUE : rarity, - data, - owner: address!, - metrics, - contents, - mappings: belongsToAThirdPartyCollection && mappings ? mappings : null, - createdAt: +new Date(), - updatedAt: +new Date() - } + modelSize, + mappings, + error: stateError + } = state + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) + const linkedContract = collection ? getLinkedContract(collection) : undefined - // If it's a Third Party Item, don't prompt the user with the SET PRICE view - if ((hasScreenshotTaken || type !== ItemType.EMOTE) && belongsToAThirdPartyCollection) { - item.price = '0' - item.beneficiary = ethers.constants.AddressZero - return onSave(item as Item, sortedContents.all) + if (stateError) { + setState(prev => ({ ...prev, error: undefined })) } - if (hasScreenshotTaken || type !== ItemType.EMOTE) { - item.price = ethers.constants.MaxUint256.toString() - item.beneficiary = item.beneficiary || address - return onSave(item as Item, sortedContents.all) + let required: (string | Metrics | Item | undefined)[] + if (isRepresentation) { + required = [item as Item] + } else if (belongsToAThirdPartyCollection) { + required = [name, thumbnail, metrics, bodyShape, category] + } else if (type === ItemType.EMOTE) { + required = [name, thumbnail, metrics, category, playMode, rarity, type] + } else { + required = [name, thumbnail, metrics, bodyShape, category, rarity, type] } - this.setState({ - item, - itemSortedContents: sortedContents.all, - view: CreateItemView.THUMBNAIL, - fromView: CreateItemView.THUMBNAIL - }) - } - - addItemRepresentation = async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { onSave } = this.props - const { bodyShape, item: editedItem, requiredPermissions } = this.state as StateData - const hashedContents = await computeHashes(bodyShape === BodyShapeType.MALE ? sortedContents.male : sortedContents.female) - if (isWearable(editedItem)) { - const removesDefaultHiding = - editedItem.data.category === WearableCategory.UPPER_BODY || editedItem.data.hides.includes(WearableCategory.UPPER_BODY) - ? [BodyPartCategory.HANDS] - : [] - const item = { - ...editedItem, - data: { - ...editedItem.data, - representations: [ - ...editedItem.data.representations, - // add new representation - ...representations - ], - replaces: [...editedItem.data.replaces], - hides: [...editedItem.data.hides], - removesDefaultHiding: removesDefaultHiding, - tags: [...editedItem.data.tags], - requiredPermissions: requiredPermissions || [], - blockVrmExport: editedItem.data.blockVrmExport, - outlineCompatible: editedItem.data.outlineCompatible || true // it's going to be true for all the items. It can be deactivated later in the editor view - }, - contents: { - ...editedItem.contents, - ...hashedContents - }, - updatedAt: +new Date() - } + const thumbnailBlob = thumbnail ? dataURLToBlob(thumbnail) : undefined + const thumbnailSize = thumbnailBlob ? calculateFileSize(thumbnailBlob) : 0 - // Do not change the thumbnail when adding a new representation - delete sortedContents.all[THUMBNAIL_PATH] - onSave(item, sortedContents.all) + if (thumbnailSize && thumbnailSize > MAX_THUMBNAIL_SIZE) { + setState(prev => ({ + ...prev, + error: t('create_single_item_modal.error.thumbnail_file_too_big', { maxSize: `${toMB(MAX_THUMBNAIL_FILE_SIZE)}MB` }) + })) + return false } - } - - modifyItem = async (pristineItem: Item, sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { itemStatus, onSave } = this.props - const { name, bodyShape, type, mappings, metrics, category, playMode, requiredPermissions } = this.state as StateData - - let data: WearableData | EmoteDataADR74 + const isSkin = category === WearableCategory.SKIN + const isEmote = type === ItemType.EMOTE + const isSmartWearable = isSmart({ type, contents: state.contents }) + const isRequirementMet = required.every(prop => prop !== undefined) + const finalSize = modelSize ? modelSize + thumbnailSize : undefined - if (type === ItemType.WEARABLE) { - const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] - data = { - ...pristineItem.data, - removesDefaultHiding, - category: category as WearableCategory, - requiredPermissions: requiredPermissions || [] - } as WearableData - } else { - data = { - ...pristineItem.data, - loop: playMode === EmotePlayMode.LOOP, - category: category as EmoteCategory - } as EmoteDataADR74 + if (isThirdPartyV2Enabled && ((!mappings && linkedContract) || (mappings && !areMappingsValid(mappings)))) { + return false } - const contents = await computeHashes(sortedContents.all) - - const item = { - ...pristineItem, - data, - name, - metrics, - contents, - mappings, - updatedAt: +new Date() + if (isRequirementMet && isEmote && finalSize && !isEmoteFileSizeValid(finalSize)) { + setState(prev => ({ + ...prev, + error: t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_EMOTE_FILE_SIZE)}MB`, + type: `emote` + }) + })) + return false } - const wearableBodyShape = bodyShape === BodyShapeType.MALE ? BodyShape.MALE : BodyShape.FEMALE - const representationIndex = pristineItem.data.representations.findIndex( - (representation: WearableRepresentation) => representation.bodyShapes[0] === wearableBodyShape - ) - const pristineBodyShape = getBodyShapeType(pristineItem) - if (representations.length === 2 || representationIndex === -1 || pristineBodyShape === BodyShapeType.BOTH) { - // Unisex or Representation changed - item.data.representations = representations - } else { - // Edited representation - item.data.representations[representationIndex] = representations[0] + if (isRequirementMet && isSkin && finalSize && !isSkinFileSizeValid(finalSize)) { + setState(prev => ({ + ...prev, + error: t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_SKIN_FILE_SIZE)}MB`, + type: `skin` + }) + })) + return false } - if (itemStatus && [SyncStatus.UNPUBLISHED, SyncStatus.UNDER_REVIEW].includes(itemStatus) && isSmart(item) && VIDEO_PATH in contents) { - item.video = contents[VIDEO_PATH] + if (isRequirementMet && !isSkin && isSmartWearable && finalSize && !isSmartWearableFileSizeValid(finalSize)) { + setState(prev => ({ + ...prev, + error: t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_SMART_WEARABLE_FILE_SIZE)}MB`, + type: `smart wearable` + }) + })) + return false } - onSave(item as Item, sortedContents.all) - } + if (isRequirementMet && !isSkin && !isSmartWearable && finalSize && !isWearableFileSizeValid(finalSize)) { + setState(prev => ({ + ...prev, + error: t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_WEARABLE_FILE_SIZE)}MB`, + type: `wearable` + }) + })) + return false + } + return isRequirementMet + }, [collection, state, isThirdPartyV2Enabled]) - handleSubmit = async () => { - const { metadata } = this.props - const { id } = this.state + const handleSubmit = useCallback(async () => { + const { id } = state let changeItemFile = false let addRepresentation = false @@ -483,9 +664,9 @@ export default class CreateSingleItemModal extends React.PureComponent ({ ...prev, error: isErrorWithMessage(error) ? error.message : 'Unknown error' })) } - } else if (!!this.state.item && !!this.state.itemSortedContents) { + } else if (!!state.item && !!state.itemSortedContents) { const sortedContents = { - male: this.state.itemSortedContents, - female: this.state.itemSortedContents, - all: this.state.itemSortedContents + male: state.itemSortedContents, + female: state.itemSortedContents, + all: state.itemSortedContents } - const representations = this.buildRepresentations(this.state.bodyShape!, this.state.model!, sortedContents) - await this.createItem(sortedContents, representations) + const representations = buildRepresentations(state.bodyShape!, state.model!, sortedContents) + await createItem(sortedContents, representations) } } - } + }, [metadata, state, addItemRepresentation, createItem, modifyItem, setState, isValid]) - getMetricsAndScreenshot = async () => { - const { type, previewController, model, contents, category, thumbnail } = this.state + const getMetricsAndScreenshot = useCallback(async () => { + const { type, previewController, model, contents, category, thumbnail } = state if (type && model && contents) { const data = await getItemData({ wearablePreviewController: previewController, @@ -543,262 +724,222 @@ export default class CreateSingleItemModal extends React.PureComponent { + setState(prev => { + let view = CreateItemView.DETAILS if (isSmart({ type, contents })) { - this.timer = setTimeout(() => this.setState({ view: CreateItemView.UPLOAD_VIDEO }), ITEM_LOADED_CHECK_DELAY) - return + // TODO: await setTimeout(() => {}, ITEM_LOADED_CHECK_DELAY) + view = CreateItemView.UPLOAD_VIDEO } - - this.setState({ view: CreateItemView.DETAILS }) + return { ...prev, metrics: data.info, thumbnail: thumbnail ?? data.image, view, isLoading: false } }) } - } - - handleDropAccepted = (acceptedFileProps: AcceptedFileProps) => { - const { bodyShape, ...acceptedProps } = acceptedFileProps - this.setState(prevState => ({ - isLoading: true, - bodyShape: bodyShape || prevState.bodyShape, - ...acceptedProps - })) - } - - handleVideoDropAccepted = (acceptedFileProps: AcceptedFileProps) => { - this.setState({ - isLoading: true, - ...acceptedFileProps - }) - } - - handleSaveVideo = () => { - this.setState({ + }, [state, setState]) + + const handleDropAccepted = useCallback( + (acceptedFileProps: AcceptedFileProps) => { + const { bodyShape, ...acceptedProps } = acceptedFileProps + setState(prev => ({ + ...prev, + isLoading: true, + bodyShape: bodyShape || prev.bodyShape, + ...acceptedProps + })) + }, + [setState] + ) + + const handleVideoDropAccepted = useCallback( + (acceptedFileProps: AcceptedFileProps) => { + setState(prev => ({ + ...prev, + isLoading: true, + ...acceptedFileProps + })) + }, + [setState] + ) + + const handleSaveVideo = useCallback(() => { + setState({ fromView: undefined, isLoading: false, view: CreateItemView.DETAILS }) - } - - getLinkedContract(collection: Collection | undefined | null): LinkedContract | undefined { - if (!collection?.linkedContractAddress || !collection?.linkedContractNetwork) { - return undefined - } - - return { - address: collection.linkedContractAddress, - network: collection.linkedContractNetwork - } - } + }, [setState]) - getMapping = (): Mapping => { - const { isThirdPartyV2Enabled, collection } = this.props - const { mappings } = this.state - const contract = this.getLinkedContract(collection) + const getMapping = useCallback((): Mapping => { + const { mappings } = state + const contract = getLinkedContract(collection) if (!contract) { return defaultMapping } - // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents let mapping: Mapping | undefined if (mappings) { mapping = mappings[contract.network]?.[contract.address][0] } else { - mapping = this.getDefaultMappings(contract, isThirdPartyV2Enabled)?.[contract.network]?.[contract.address][0] + mapping = getDefaultMappings(contract, isThirdPartyV2Enabled)?.[contract.network]?.[contract.address][0] } return mapping ?? defaultMapping - } - - handleMappingChange = (mapping: Mapping) => { - const { collection } = this.props - const contract = this.getLinkedContract(collection) - if (!contract) { - return - } - - this.setState({ - mappings: buildItemMappings(mapping, contract) - }) - } - - handleOpenDocs = () => window.open('https://docs.decentraland.org/3d-modeling/3d-models/', '_blank') - - handleNameChange = (_event: React.ChangeEvent, props: InputOnChangeData) => - this.setState({ name: props.value.slice(0, ITEM_NAME_MAX_LENGTH) }) - - handleItemChange = (item: Item) => { - this.setState({ item: item, category: item.data.category, rarity: item.rarity }) - } + }, [collection, state, isThirdPartyV2Enabled]) - handleCategoryChange = (_event: React.SyntheticEvent, { value }: DropdownProps) => { - const category = value as WearableCategory - const hasChangedThumbnailType = - (this.state.category && getThumbnailType(category) !== getThumbnailType(this.state.category as WearableCategory)) || - !this.state.category - - if (this.state.category !== category) { - this.setState({ category }) - if (this.state.type === ItemType.WEARABLE && hasChangedThumbnailType) { - // As it's not required to wait for the promise, use the void operator to return undefined - void this.updateThumbnailByCategory(category) + const handleMappingChange = useCallback( + (mapping: Mapping) => { + const contract = getLinkedContract(collection) + if (!contract) { + return } - } - } - - handleRarityChange = (_event: React.SyntheticEvent, { value }: DropdownProps) => { - const rarity = value as Rarity - this.setState({ rarity }) - } - - handlePlayModeChange = (_event: React.SyntheticEvent, { value }: DropdownProps) => { - const playMode = value as EmotePlayMode - this.setState({ playMode }) - } - handleOpenThumbnailDialog = () => { - const { type } = this.state + setState(prev => ({ + ...prev, + mappings: buildItemMappings(mapping, contract) + })) + }, + [collection, setState] + ) + + const handleNameChange = useCallback( + (_event: React.ChangeEvent, props: InputOnChangeData) => + setState(prev => ({ ...prev, name: props.value.slice(0, ITEM_NAME_MAX_LENGTH) })), + [setState] + ) + + const handleItemChange = useCallback( + (item: Item) => { + setState(prev => ({ ...prev, item: item, category: item.data.category, rarity: item.rarity })) + }, + [setState] + ) + + const handleCategoryChange = useCallback( + (_event: React.SyntheticEvent, { value }: DropdownProps) => { + const category = value as WearableCategory + const hasChangedThumbnailType = + (state.category && getThumbnailType(category) !== getThumbnailType(state.category as WearableCategory)) || !state.category + + if (state.category !== category) { + setState(prev => ({ ...prev, category })) + if (state.type === ItemType.WEARABLE && hasChangedThumbnailType) { + // As it's not required to wait for the promise, use the void operator to return undefined + void updateThumbnailByCategory(category) + } + } + }, + [state, setState] + ) + + const handleRarityChange = useCallback( + (_event: React.SyntheticEvent, { value }: DropdownProps) => { + const rarity = value as Rarity + setState(prev => ({ ...prev, rarity })) + }, + [setState] + ) + + const handlePlayModeChange = useCallback( + (_event: React.SyntheticEvent, { value }: DropdownProps) => { + const playMode = value as EmotePlayMode + setState(prev => ({ ...prev, playMode })) + }, + [setState] + ) + + const handleOpenThumbnailDialog = useCallback(() => { + const { type } = state if (type === ItemType.EMOTE) { - this.setState({ fromView: CreateItemView.DETAILS, view: CreateItemView.THUMBNAIL }) - } else if (this.thumbnailInput.current) { - this.thumbnailInput.current.click() + setState(prev => ({ ...prev, fromView: CreateItemView.DETAILS, view: CreateItemView.THUMBNAIL })) + } else if (thumbnailInput.current) { + thumbnailInput.current.click() } - } - - handleThumbnailChange = async (event: React.ChangeEvent) => { - const { contents } = this.state - const { files } = event.target - if (files && files.length > 0) { - const file = files[0] - const imageType = await getImageType(file) - if (imageType !== ImageType.PNG) { - this.setState({ error: t('create_single_item_modal.wrong_thumbnail_format') }) - return - } - this.setState({ error: undefined }) + }, [state, thumbnailInput, setState]) + + const handleThumbnailChange = useCallback( + async (event: React.ChangeEvent) => { + const { contents } = state + const { files } = event.target + if (files && files.length > 0) { + const file = files[0] + const imageType = await getImageType(file) + if (imageType !== ImageType.PNG) { + setState(prev => ({ ...prev, error: t('create_single_item_modal.wrong_thumbnail_format') })) + return + } + setState(prev => ({ ...prev, error: undefined })) - const smallThumbnailBlob = await resizeImage(file) - const bigThumbnailBlob = await resizeImage(file, 1024, 1024) + const smallThumbnailBlob = await resizeImage(file) + const bigThumbnailBlob = await resizeImage(file, 1024, 1024) - const thumbnail = URL.createObjectURL(smallThumbnailBlob) + const thumbnail = URL.createObjectURL(smallThumbnailBlob) - this.setState({ - thumbnail, - contents: { - ...contents, - [THUMBNAIL_PATH]: bigThumbnailBlob - } - }) - } - } + setState(prev => ({ + ...prev, + thumbnail, + contents: { + ...contents, + [THUMBNAIL_PATH]: bigThumbnailBlob + } + })) + } + }, + [state, setState] + ) - handleOpenVideoDialog = () => { - this.setState({ view: CreateItemView.UPLOAD_VIDEO, fromView: CreateItemView.DETAILS }) - } + const handleOpenVideoDialog = useCallback(() => { + setState(prev => ({ ...prev, view: CreateItemView.UPLOAD_VIDEO, fromView: CreateItemView.DETAILS })) + }, [setState]) - handleYes = () => this.setState({ isRepresentation: true }) + const handleYes = useCallback(() => setState(prev => ({ ...prev, isRepresentation: true })), [setState]) - handleNo = () => this.setState({ isRepresentation: false }) + const handleNo = useCallback(() => setState(prev => ({ ...prev, isRepresentation: false })), [setState]) - isAddingRepresentation = () => { - const { metadata } = this.props + const isAddingRepresentation = useMemo(() => { return !!(metadata && metadata.item && !metadata.changeItemFile) - } + }, [metadata]) - filterItemsByBodyShape = (item: Item) => { - const { bodyShape } = this.state - const { metadata } = this.props - return getMissingBodyShapeType(item) === bodyShape && metadata.collectionId === item.collectionId - } + const filterItemsByBodyShape = useCallback( + (item: Item) => { + const { bodyShape } = state + return getMissingBodyShapeType(item) === bodyShape && metadata.collectionId === item.collectionId + }, + [metadata, state] + ) /** * Updates the item's thumbnail if the user changes the category of the item. * * @param category - The category of the wearable. */ - async updateThumbnailByCategory(category: WearableCategory) { - const { model, contents } = this.state - - const isCustom = !!contents && THUMBNAIL_PATH in contents - if (!isCustom) { - this.setState({ isLoading: true }) - let thumbnail - if (contents && isImageFile(model!)) { - thumbnail = await convertImageIntoWearableThumbnail(contents[THUMBNAIL_PATH] || contents[model!], category) - } else { - const url = URL.createObjectURL(contents![model!]) - const { image } = await getModelData(url, { - width: 1024, - height: 1024, - thumbnailType: getThumbnailType(category), - extension: (model && getExtension(model)) || undefined, - engine: EngineType.BABYLON - }) - thumbnail = image - URL.revokeObjectURL(url) + const updateThumbnailByCategory = useCallback( + async (category: WearableCategory) => { + const { model, contents } = state + + const isCustom = !!contents && THUMBNAIL_PATH in contents + if (!isCustom) { + setState(prev => ({ ...prev, isLoading: true })) + let thumbnail + if (contents && isImageFile(model!)) { + thumbnail = await convertImageIntoWearableThumbnail(contents[THUMBNAIL_PATH] || contents[model!], category) + } else { + const url = URL.createObjectURL(contents![model!]) + const { image } = await getModelData(url, { + width: 1024, + height: 1024, + thumbnailType: getThumbnailType(category), + extension: (model && getExtension(model)) || undefined, + engine: EngineType.BABYLON + }) + thumbnail = image + URL.revokeObjectURL(url) + } + setState(prev => ({ ...prev, thumbnail, isLoading: false })) } - this.setState({ thumbnail, isLoading: false }) - } - } + }, + [state, setState] + ) - buildRepresentations(bodyShape: BodyShapeType, model: string, contents: SortedContent): WearableRepresentation[] { - const representations: WearableRepresentation[] = [] - - // add male representation - if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.MALE], - mainFile: this.prefixContentName(BodyShapeType.MALE, model), - contents: Object.keys(contents.male), - overrideHides: [], - overrideReplaces: [] - }) - } - - // add female representation - if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.FEMALE], - mainFile: this.prefixContentName(BodyShapeType.FEMALE, model), - contents: Object.keys(contents.female), - overrideHides: [], - overrideReplaces: [] - }) - } - - return representations - } - - buildRepresentationsZipBothBodyshape(bodyShape: BodyShapeType, contents: SortedContent): WearableRepresentation[] { - const representations: WearableRepresentation[] = [] - - // add male representation - if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.MALE], - mainFile: Object.keys(contents.male).find(content => content.includes('glb'))!, - contents: Object.keys(contents.male), - overrideHides: [], - overrideReplaces: [] - }) - } - - // add female representation - if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.FEMALE], - mainFile: Object.keys(contents.female).find(content => content.includes('glb'))!, - contents: Object.keys(contents.female), - overrideHides: [], - overrideReplaces: [] - }) - } - - return representations - } - - renderModalTitle = () => { - const isAddingRepresentation = this.isAddingRepresentation() - const { bodyShape, type, view, contents } = this.state - const { metadata } = this.props + const renderModalTitle = useCallback(() => { + const { bodyShape, type, view, contents } = state if (isAddingRepresentation) { return t('create_single_item_modal.add_representation', { bodyShape: t(`body_shapes.${bodyShape!}`) }) @@ -826,39 +967,39 @@ export default class CreateSingleItemModal extends React.PureComponent { - const { weareblePreviewUpdated, type, model, item, contents } = this.state + const handleFileLoad = useCallback(async () => { + const { weareblePreviewUpdated, type, model, item, contents } = state const modelSize = await calculateModelFinalSize( item?.contents ?? {}, contents ?? {}, type ?? ItemType.WEARABLE, - new BuilderAPI(BUILDER_SERVER_URL, new Authorization(() => this.props.address)) + new BuilderAPI(BUILDER_SERVER_URL, new Authorization(() => props.address)) ) - this.setState({ modelSize }) + setState(prev => ({ ...prev, modelSize })) // if model is an image, the wearable preview won't be needed if (model && isImageFile(model)) { - return this.getMetricsAndScreenshot() + return getMetricsAndScreenshot() } const controller = WearablePreview.createController('thumbnail-picker') - this.setState({ previewController: controller }) + setState(prev => ({ ...prev, previewController: controller })) if (weareblePreviewUpdated) { if (type === ItemType.EMOTE) { const length = await controller.emote.getLength() await controller.emote.goTo(Math.floor(Math.random() * length)) } - return this.getMetricsAndScreenshot() + return getMetricsAndScreenshot() } - } + }, [state, getMetricsAndScreenshot, setState]) - renderWearablePreview = () => { - const { type, contents } = this.state + const renderWearablePreview = useCallback(() => { + const { type, contents } = state const isEmote = type === ItemType.EMOTE const blob = contents ? (isEmote ? toEmoteWithBlobs({ contents }) : toWearableWithBlobs({ contents })) : undefined @@ -884,29 +1025,28 @@ export default class CreateSingleItemModal extends React.PureComponent this.setState({ weareblePreviewUpdated: true })} - onLoad={this.handleFileLoad} + onUpdate={() => setState(prev => ({ ...prev, weareblePreviewUpdated: true }))} + onLoad={handleFileLoad} /> ) - } + }, [state, handleFileLoad]) - handleUploadVideoGoBack = () => { - const keys = Object.keys(this.state) - const { fromView } = this.state + const handleUploadVideoGoBack = useCallback(() => { + const { fromView } = state + const keys = Object.keys(state) if (fromView) { - this.setState({ view: fromView }) + setState(prev => ({ ...prev, view: fromView })) return } const stateReset = keys.reduce((acc, v) => ({ ...acc, [v]: undefined }), {}) - this.setState({ ...stateReset, ...this.getInitialState() }) - } + setState(prev => ({ ...prev, ...stateReset, ...getInitialState() })) + }, [state, setState]) - renderImportView() { - const { collection, metadata, onClose } = this.props - const { category, isLoading, isRepresentation } = this.state - const title = this.renderModalTitle() + const renderImportView = useCallback(() => { + const { category, isLoading, isRepresentation } = state + const title = renderModalTitle() return ( {this.renderWearablePreview()}} + wearablePreviewComponent={
{renderWearablePreview()}
} isLoading={!!isLoading} isRepresentation={!!isRepresentation} - onDropAccepted={this.handleDropAccepted} + onDropAccepted={handleDropAccepted} onClose={onClose} /> ) - } + }, [collection, metadata, state, handleDropAccepted, renderModalTitle, renderWearablePreview, onClose]) - renderUploadVideoView() { - const { itemStatus, onClose } = this.props - const { contents } = this.state - const title = this.renderModalTitle() + const renderUploadVideoView = useCallback(() => { + const { contents } = state + const title = renderModalTitle() return ( ) - } + }, [itemStatus, state, renderModalTitle, handleVideoDropAccepted, handleSaveVideo, handleUploadVideoGoBack, onClose]) - renderFields() { - const { collection, isThirdPartyV2Enabled } = this.props - const { name, category, rarity, contents, item, type, isLoading } = this.state + const renderFields = useCallback(() => { + const { name, category, rarity, contents, item, type, isLoading } = state const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) const rarities = Rarity.getRarities() const categories: string[] = type === ItemType.WEARABLE ? getWearableCategories(contents) : getEmoteCategories() - const linkedContract = this.getLinkedContract(collection) + const linkedContract = getLinkedContract(collection) const raritiesLink = 'https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections' + @@ -965,7 +1103,7 @@ export default class CreateSingleItemModal extends React.PureComponent {(!item || !item.isPublished) && !belongsToAThirdPartyCollection ? ( <> @@ -989,7 +1127,7 @@ export default class CreateSingleItemModal extends React.PureComponent ) : null} @@ -1000,128 +1138,54 @@ export default class CreateSingleItemModal extends React.PureComponent ({ value, text: t(`${type!}.category.${value}`) }))} - onChange={this.handleCategoryChange} + onChange={handleCategoryChange} /> - {isThirdPartyV2Enabled && linkedContract && } + {isThirdPartyV2Enabled && linkedContract && } ) - } - - getPlayModeOptions() { - const playModes: string[] = getEmotePlayModes() + }, [collection, getMapping, handleCategoryChange, handleMappingChange, handleNameChange, handleRarityChange, isThirdPartyV2Enabled]) - return playModes.map(value => ({ - value, - text: t(`emote.play_mode.${value}.text`), - description: t(`emote.play_mode.${value}.description`) - })) - } - - renderMetrics() { - const { metrics, contents } = this.state + const renderMetrics = useCallback(() => { + const { metrics, contents } = state if (metrics) { return } else { return null } - } - - isDisabled(): boolean { - const { isLoading } = this.props - const { isLoading: isStateLoading } = this.state - - return !this.isValid() || isLoading || Boolean(isStateLoading) - } - - isValid(): boolean { - const { name, thumbnail, metrics, bodyShape, category, playMode, rarity, item, isRepresentation, type, modelSize, mappings } = - this.state - const { collection, isThirdPartyV2Enabled } = this.props - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) - const linkedContract = collection ? this.getLinkedContract(collection) : undefined - - if (this.state.error) { - this.setState({ error: undefined }) - } - - let required: (string | Metrics | Item | undefined)[] - if (isRepresentation) { - required = [item as Item] - } else if (belongsToAThirdPartyCollection) { - required = [name, thumbnail, metrics, bodyShape, category] - } else if (type === ItemType.EMOTE) { - required = [name, thumbnail, metrics, category, playMode, rarity, type] - } else { - required = [name, thumbnail, metrics, bodyShape, category, rarity, type] - } - - const thumbnailBlob = thumbnail ? dataURLToBlob(thumbnail) : undefined - const thumbnailSize = thumbnailBlob ? calculateFileSize(thumbnailBlob) : 0 - - if (thumbnailSize && thumbnailSize > MAX_THUMBNAIL_SIZE) { - this.setState({ - error: t('create_single_item_modal.error.thumbnail_file_too_big', { maxSize: `${toMB(MAX_THUMBNAIL_FILE_SIZE)}MB` }) - }) - return false - } - const isSkin = category === WearableCategory.SKIN - const isEmote = type === ItemType.EMOTE - const isSmartWearable = isSmart({ type, contents: this.state.contents }) - const isRequirementMet = required.every(prop => prop !== undefined) - const finalSize = modelSize ? modelSize + thumbnailSize : undefined - - if (isThirdPartyV2Enabled && ((!mappings && linkedContract) || (mappings && !areMappingsValid(mappings)))) { - return false - } - - if (isRequirementMet && isEmote && finalSize && !isEmoteFileSizeValid(finalSize)) { - this.setState({ - error: t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_EMOTE_FILE_SIZE)}MB`, - type: `emote` - }) - }) - return false - } - - if (isRequirementMet && isSkin && finalSize && !isSkinFileSizeValid(finalSize)) { - this.setState({ - error: t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_SKIN_FILE_SIZE)}MB`, - type: `skin` - }) - }) - return false - } - - if (isRequirementMet && !isSkin && isSmartWearable && finalSize && !isSmartWearableFileSizeValid(finalSize)) { - this.setState({ - error: t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_SMART_WEARABLE_FILE_SIZE)}MB`, - type: `smart wearable` - }) - }) - return false - } - - if (isRequirementMet && !isSkin && !isSmartWearable && finalSize && !isWearableFileSizeValid(finalSize)) { - this.setState({ - error: t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_WEARABLE_FILE_SIZE)}MB`, - type: `wearable` - }) - }) - return false - } - return isRequirementMet - } + }, [state]) + + const isDisabled = useCallback((): boolean => { + const { isLoading: isStateLoading } = state + + return !isValid() || isLoading || Boolean(isStateLoading) + }, [state, isLoading, isValid]) + + const renderRepresentation = useCallback( + (type: BodyShapeType) => { + const { bodyShape } = state + return ( +
+ setState(prev => ({ + ...prev, + bodyShape: type, + isRepresentation: metadata && metadata.changeItemFile ? false : undefined, + item: undefined + })) + } + > + {t('body_shapes.' + type)} +
+ ) + }, + [metadata, state, setState] + ) - renderWearableDetails() { - const { metadata } = this.props - const { bodyShape, thumbnail, isRepresentation, rarity, item } = this.state - const title = this.renderModalTitle() + const renderWearableDetails = useCallback(() => { + const { bodyShape, thumbnail, isRepresentation, rarity, item } = state + const title = renderModalTitle() const thumbnailStyle = getBackgroundStyle(rarity) - const isAddingRepresentation = this.isAddingRepresentation() return ( <> @@ -1130,38 +1194,38 @@ export default class CreateSingleItemModal extends React.PureComponent {isRepresentation ? null : ( <> - - + + )} - {this.renderMetrics()} + {renderMetrics()} {isAddingRepresentation ? null : (
{t('create_single_item_modal.representation_label')}
- {this.renderRepresentation(BodyShapeType.BOTH)} - {this.renderRepresentation(BodyShapeType.MALE)} - {this.renderRepresentation(BodyShapeType.FEMALE)} + {renderRepresentation(BodyShapeType.BOTH)} + {renderRepresentation(BodyShapeType.MALE)} + {renderRepresentation(BodyShapeType.FEMALE)}
)} {bodyShape && (!metadata || !metadata.changeItemFile) ? ( <> {bodyShape === BodyShapeType.BOTH ? ( - this.renderFields() + renderFields() ) : ( <> {isAddingRepresentation ? null : (
{t('create_single_item_modal.existing_item')}
-
+
{t('global.yes')}
-
+
{t('global.no')}
@@ -1176,28 +1240,28 @@ export default class CreateSingleItemModal extends React.PureComponent } - filter={this.filterItemsByBodyShape} - onChange={this.handleItemChange} + filter={filterItemsByBodyShape} + onChange={handleItemChange} isDisabled={isAddingRepresentation} />
) : ( - this.renderFields() + renderFields() )} )} ) : ( - this.renderFields() + renderFields() )}
) - } + }, [metadata, state, renderFields, renderMetrics, renderModalTitle, renderRepresentation, isAddingRepresentation]) - renderEmoteDetails() { - const { thumbnail, rarity, playMode = '' } = this.state - const title = this.renderModalTitle() + const renderEmoteDetails = useCallback(() => { + const { thumbnail, rarity, playMode = '' } = state + const title = renderModalTitle() const thumbnailStyle = getBackgroundStyle(rarity) return ( @@ -1206,13 +1270,13 @@ export default class CreateSingleItemModal extends React.PureComponent
{title} - - + +
- {this.renderMetrics()} + {renderMetrics()} - {this.renderFields()} + {renderFields()} @@ -1230,16 +1294,16 @@ export default class CreateSingleItemModal extends React.PureComponent ) - } + }, [state, renderFields, renderMetrics, renderModalTitle, handlePlayModeChange, handleThumbnailChange]) - renderSmartWearableDetails() { - const { thumbnail, rarity, requiredPermissions, video } = this.state - const title = this.renderModalTitle() + const renderSmartWearableDetails = useCallback(() => { + const { thumbnail, rarity, requiredPermissions, video } = state + const title = renderModalTitle() const thumbnailStyle = getBackgroundStyle(rarity) return (
- {this.renderFields()} + {renderFields()} {requiredPermissions?.length ? (
@@ -1262,10 +1326,10 @@ export default class CreateSingleItemModal extends React.PureComponent
{title} - - + +
-
{this.renderMetrics()}
+
{renderMetrics()}
@@ -1275,8 +1339,8 @@ export default class CreateSingleItemModal extends React.PureComponent} - onClick={this.handleOpenVideoDialog} + previewIcon={} + onClick={handleOpenVideoDialog} /> @@ -1286,49 +1350,48 @@ export default class CreateSingleItemModal extends React.PureComponent ) - } + }, [state, renderFields, renderMetrics, renderModalTitle, handleOpenVideoDialog]) - renderItemDetails() { - const { type, contents } = this.state + const renderItemDetails = useCallback(() => { + const { type, contents } = state if (type === ItemType.EMOTE) { - return this.renderEmoteDetails() + return renderEmoteDetails() } else if (isSmart({ type, contents })) { - return this.renderSmartWearableDetails() + return renderSmartWearableDetails() } else { - return this.renderWearableDetails() + return renderWearableDetails() } - } + }, [state, renderEmoteDetails, renderSmartWearableDetails, renderWearableDetails]) - handleGoBack = () => { - this.setState({ view: CreateItemView.UPLOAD_VIDEO }) - } + const handleGoBack = useCallback(() => { + setState({ view: CreateItemView.UPLOAD_VIDEO }) + }, [setState]) - renderDetailsView() { - const { onClose, metadata, error, isLoading, collection } = this.props - const { isRepresentation, error: stateError, type, contents, isLoading: isStateLoading, hasScreenshotTaken } = this.state + const renderDetailsView = useCallback(() => { + const { isRepresentation, error: stateError, type, contents, isLoading: isStateLoading, hasScreenshotTaken } = state const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) - const isDisabled = this.isDisabled() - const title = this.renderModalTitle() + const _isDisabled = isDisabled() + const title = renderModalTitle() const hasFinishSteps = (type === ItemType.EMOTE && hasScreenshotTaken) || type === ItemType.WEARABLE return ( <> -
+ - {this.renderItemDetails()} + {renderItemDetails()} {isSmart({ type, contents }) ? ( - ) : null} - - - ) : null} - - - - - {stateError ? ( - -

{stateError}

-
- ) : null} - {error ? ( - -

{error}

-
- ) : null} -
-
-
- - ) - }, [collection, error, metadata, state, handleSubmit, renderModalTitle, setState, isDisabled, isLoading, onClose]) - - const handleOnScreenshotTaken = useCallback( - async (screenshot: string) => { - const { itemSortedContents, item } = state - - if (item && itemSortedContents) { - const blob = dataURLToBlob(screenshot) - - itemSortedContents[THUMBNAIL_PATH] = blob! - item.contents = await computeHashes(itemSortedContents) - - setState(prev => { - let view = prev.view - - if (prev.fromView === CreateItemView.DETAILS) { - view = CreateItemView.DETAILS - } else { - void handleSubmit() - } - - return { ...prev, itemSortedContents, item, hasScreenshotTaken: true, view } - }) - } else { - setState(prev => { - let view = prev.view - - if (prev.fromView === CreateItemView.DETAILS) { - view = CreateItemView.DETAILS - } - - return { ...prev, thumbnail: screenshot, hasScreenshotTaken: true, view } - }) - } - }, - [state, setState] - ) - - const renderThumbnailView = useCallback(() => { - const { isLoading, contents } = state - - return ( - setState({ view: CreateItemView.DETAILS })} - onSave={handleOnScreenshotTaken} - onClose={onClose} - /> - ) - }, [state, renderModalTitle, handleOnScreenshotTaken, onClose]) - - const renderSetPrice = useCallback(() => { - const { item, itemSortedContents } = state - return ( - - ) - }, [state, handleSubmit]) - - const renderView = useCallback(() => { - const { view } = state - switch (view) { - case CreateItemView.IMPORT: - return renderImportView() - case CreateItemView.UPLOAD_VIDEO: - return renderUploadVideoView() - case CreateItemView.DETAILS: - return renderDetailsView() - case CreateItemView.THUMBNAIL: - return renderThumbnailView() - case CreateItemView.SET_PRICE: - return renderSetPrice() - default: - return null - } - }, [state]) + const contextValue = { + // State + state, + dispatch, + metadata, + collection, + isLoading, + error, + itemStatus, + + // Thumbnail handlers + handleOpenThumbnailDialog, + handleThumbnailChange, + thumbnailInput, + + // Wearable-specific handlers + filterItemsByBodyShape, + handleItemChange, + + // File handling + handleDropAccepted, + handleOnScreenshotTaken, + + // Modal handlers + onClose, + handleSubmit, + isDisabled, + + // Render functions + renderMetrics, + renderModalTitle, + renderWearablePreview, + + // Flags + isThirdPartyV2Enabled, + isAddingRepresentation + } return (
- {renderView()} + + +
) diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/index.ts b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/index.ts new file mode 100644 index 000000000..4b511ed40 --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/index.ts @@ -0,0 +1,3 @@ +import EditThumbnailStep from './EditThumbnailStep' + +export { EditThumbnailStep } diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx new file mode 100644 index 000000000..55d607ed2 --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import { ModalNavigation, Row, Column, Form } from 'decentraland-ui' +import Modal from 'decentraland-dapps/dist/containers/Modal' +import { ItemType } from 'modules/item/types' +import { isSmart } from 'modules/item/utils' +import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' +import { WearableDetails, EmoteDetails, SmartWearableDetails } from './index' + +export const ItemDetailsStep: React.FC = () => { + const { state, error, isDisabled, renderModalTitle, onClose } = useCreateSingleItemModal() + const { type, contents } = state + + const renderDetailsContent = () => { + if (type === ItemType.EMOTE) { + return + } else if (isSmart({ type, contents })) { + return + } else { + return + } + } + + return ( + <> + + +
+ + {renderDetailsContent()} + {state.error ? ( + +

{state.error}

+
+ ) : null} + {error ? ( + +

{error}

+
+ ) : null} +
+
+
+ + ) +} + +export default ItemDetailsStep diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx new file mode 100644 index 000000000..dd581362f --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx @@ -0,0 +1,146 @@ +import React, { useCallback } from 'react' +import { Row, Header, Message, Column, Button } from 'decentraland-ui' +import { t } from 'decentraland-dapps/dist/modules/translation/utils' +import { getBackgroundStyle } from 'modules/item/utils' +import Icon from 'components/Icon' +import ItemVideo from 'components/ItemVideo' +import ItemRequiredPermission from 'components/ItemRequiredPermission' +import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' +import { AcceptedFileProps, CreateItemView } from '../CreateSingleItemModal.types' +import CommonFields from '../CommonFields' +import { UploadVideoStep } from '../UploadVideoStep' +import { createItemActions, createInitialState } from '../CreateSingleItemModal.reducer' + +export const SmartWearableDetails: React.FC = () => { + const { + state, + dispatch, + onClose, + renderMetrics, + renderModalTitle, + handleOpenThumbnailDialog, + handleThumbnailChange, + thumbnailInput, + itemStatus, + metadata, + collection, + isThirdPartyV2Enabled, + handleSubmit, + isDisabled, + isLoading + } = useCreateSingleItemModal() + const { contents, thumbnail, rarity, requiredPermissions, video, view } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + const handleUploadVideoGoBack = useCallback(() => { + const { fromView } = state + + if (fromView) { + dispatch(createItemActions.setView(fromView)) + return + } + + // Reset to initial state using the reducer's createInitialState function + const initialState = createInitialState(metadata, collection, isThirdPartyV2Enabled) + dispatch(createItemActions.resetState(initialState)) + }, [state, metadata, collection, isThirdPartyV2Enabled]) + + const handleSaveVideo = useCallback(() => { + dispatch(createItemActions.setFromView(undefined)) + dispatch(createItemActions.setLoading(false)) + dispatch(createItemActions.setView(CreateItemView.DETAILS)) + }, []) + + const handleOpenVideoDialog = useCallback(() => { + dispatch(createItemActions.setView(CreateItemView.UPLOAD_VIDEO)) + dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) + }, []) + + const handleVideoDropAccepted = useCallback((acceptedFileProps: AcceptedFileProps) => { + dispatch(createItemActions.setLoading(true)) + dispatch(createItemActions.setAcceptedProps(acceptedFileProps)) + }, []) + + if (view === CreateItemView.UPLOAD_VIDEO) { + return ( + + ) + } + + return ( + <> + +
+ + {requiredPermissions?.length ? ( +
+
+ {t('create_single_item_modal.smart_wearable_permissions_label')} + + {t('global.learn_more')} + +
+ +
+ ) : null} + +
+
{t('create_single_item_modal.thumbnail_preview_title')}
+
+
+ {title} + + +
+
{renderMetrics()}
+
+
+ +
+
{t('create_single_item_modal.video_preview_title')}
+
+ } + onClick={handleOpenVideoDialog} + /> +
+
+
+
+ } /> +
+
+
+ + + + + + + + + + ) +} + +export default SmartWearableDetails diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx new file mode 100644 index 000000000..50e42806f --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx @@ -0,0 +1,139 @@ +import React, { useCallback } from 'react' +import { Row, Column, Section, Header, Icon } from 'decentraland-ui' +import { t } from 'decentraland-dapps/dist/modules/translation/utils' +import { BodyShapeType, ItemType, Item } from 'modules/item/types' +import { getBackgroundStyle } from 'modules/item/utils' +import ItemDropdown from 'components/ItemDropdown' +import { createItemActions } from '../CreateSingleItemModal.reducer' +import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' +import CommonFields from '../CommonFields' + +export const WearableDetails: React.FC = () => { + const { + state, + metadata, + dispatch, + renderMetrics, + renderModalTitle, + handleOpenThumbnailDialog, + handleThumbnailChange, + thumbnailInput, + filterItemsByBodyShape, + handleItemChange, + isAddingRepresentation, + handleSubmit, + isDisabled, + isLoading + } = useCreateSingleItemModal() + const { bodyShape, thumbnail, isRepresentation, rarity, item } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + const handleYes = useCallback(() => dispatch(createItemActions.setIsRepresentation(true)), []) + + const handleNo = useCallback(() => dispatch(createItemActions.setIsRepresentation(false)), []) + + const renderCommonFields = () => + + const renderExistingItemQuestion = () => ( +
+
{t('create_single_item_modal.existing_item')}
+ +
+ {t('global.yes')} +
+
+ {t('global.no')} +
+
+
+ ) + + const renderItemDropdown = () => ( +
+
+ {isAddingRepresentation + ? t('create_single_item_modal.adding_representation', { bodyShape: t(`body_shapes.${bodyShape}`) }) + : t('create_single_item_modal.pick_item', { bodyShape: t(`body_shapes.${bodyShape}`) })} +
+ } + filter={filterItemsByBodyShape} + onChange={handleItemChange} + isDisabled={isAddingRepresentation} + /> +
+ ) + + const renderRepresentation = useCallback( + (type: BodyShapeType) => { + return ( +
{ + dispatch(createItemActions.setBodyShape(type)) + dispatch(createItemActions.setIsRepresentation(metadata && metadata.changeItemFile ? false : undefined)) + dispatch(createItemActions.setItem(undefined)) + }} + > + {t('body_shapes.' + type)} +
+ ) + }, + [bodyShape, metadata, dispatch] + ) + + const renderWearableContent = () => { + if (!bodyShape || bodyShape === BodyShapeType.BOTH || (metadata && metadata.changeItemFile)) { + return renderCommonFields() + } + + return ( + <> + {!isAddingRepresentation && renderExistingItemQuestion()} + {isRepresentation === undefined ? null : isRepresentation ? renderItemDropdown() : renderCommonFields()} + + ) + } + + return ( + <> + +
+
+ {title} + {isRepresentation ? null : ( + <> + + + + )} +
+ {renderMetrics()} +
+ + {isAddingRepresentation ? null : ( +
+
{t('create_single_item_modal.representation_label')}
+ + {renderRepresentation(BodyShapeType.BOTH)} + {renderRepresentation(BodyShapeType.MALE)} + {renderRepresentation(BodyShapeType.FEMALE)} + +
+ )} + {renderWearableContent()} +
+
+ + + + + + + ) +} + +export default WearableDetails diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/index.ts b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/index.ts new file mode 100644 index 000000000..e27f6db82 --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/index.ts @@ -0,0 +1,4 @@ +export { default as ItemDetailsStep } from './ItemDetailsStep' +export { default as WearableDetails } from './WearableDetails' +export { default as EmoteDetails } from './EmoteDetails' +export { default as SmartWearableDetails } from './SmartWearableDetails' diff --git a/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx new file mode 100644 index 000000000..0f3efe960 --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx @@ -0,0 +1,111 @@ +import React, { useCallback, useEffect } from 'react' +import EditPriceAndBeneficiaryModal from '../../EditPriceAndBeneficiaryModal' +import ImportStep from '../ImportStep/ImportStep' +import EditThumbnailStep from '../EditThumbnailStep/EditThumbnailStep' +import { ItemDetailsStep } from '../ItemDetailsStep' +import { toEmoteWithBlobs } from '../utils' +import { createItemActions } from '../CreateSingleItemModal.reducer' +import { CreateItemView } from '../CreateSingleItemModal.types' +import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' + +interface StepsProps { + modalContainer: React.RefObject +} + +export const Steps: React.FC = ({ modalContainer }) => { + const { + state, + metadata, + collection, + onClose, + dispatch, + isLoading, + handleSubmit, + handleDropAccepted, + handleOnScreenshotTaken, + renderWearablePreview, + renderModalTitle + } = useCreateSingleItemModal() + + const { view } = state + + // TODO: Refactor this logic to a callback that calls the handleSubmit function + // and pass to the handleSubmit the required parameters + useEffect(() => { + if (state.fromView === CreateItemView.DETAILS && state.hasScreenshotTaken) { + handleSubmit() + } else if (!state.fromView && state.view === CreateItemView.THUMBNAIL && state.hasScreenshotTaken) { + dispatch(createItemActions.setView(CreateItemView.DETAILS)) + } + }, [state, handleSubmit]) + + // Thumbnail editing handlers + const handleThumbnailGoBack = useCallback(() => { + dispatch(createItemActions.setView(CreateItemView.DETAILS)) + dispatch(createItemActions.setFromView(undefined)) + }, [dispatch]) + + const handleSaveThumbnail = useCallback( + (screenshot: string) => { + handleOnScreenshotTaken(screenshot) + }, + [state, dispatch] + ) + + const renderView = useCallback(() => { + switch (view) { + case CreateItemView.IMPORT: + return ( + {renderWearablePreview()}} + isLoading={!!state.isLoading} + isRepresentation={!!state.isRepresentation} + onDropAccepted={handleDropAccepted} + onClose={onClose} + /> + ) + + case CreateItemView.DETAILS: + return + + case CreateItemView.THUMBNAIL: + return ( + + ) + + case CreateItemView.SET_PRICE: + return ( + { + onClose() + return { type: 'Close modal', payload: { name: 'EditPriceAndBeneficiaryModal' } } + }} + mountNode={modalContainer.current ?? undefined} + onSkip={handleSubmit} + /> + ) + + default: + return null + } + }, [view, state, modalContainer, handleDropAccepted, handleOnScreenshotTaken]) + + return renderView() +} + +export default Steps diff --git a/src/components/Modals/CreateSingleItemModal/Steps/index.ts b/src/components/Modals/CreateSingleItemModal/Steps/index.ts new file mode 100644 index 000000000..10cf87eaf --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/Steps/index.ts @@ -0,0 +1,2 @@ +export { Steps } from './Steps' +export { default } from './Steps' diff --git a/src/components/Modals/CreateSingleItemModal/UploadVideoStep/index.ts b/src/components/Modals/CreateSingleItemModal/UploadVideoStep/index.ts new file mode 100644 index 000000000..f834680e8 --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/UploadVideoStep/index.ts @@ -0,0 +1,3 @@ +import UploadVideoStep from './UploadVideoStep' + +export { UploadVideoStep } diff --git a/src/components/Modals/CreateSingleItemModal/index.ts b/src/components/Modals/CreateSingleItemModal/index.ts index a26fe2613..b041922f2 100644 --- a/src/components/Modals/CreateSingleItemModal/index.ts +++ b/src/components/Modals/CreateSingleItemModal/index.ts @@ -1,2 +1,9 @@ import CreateSingleItemModal from './CreateSingleItemModal.container' export default CreateSingleItemModal + +// Export new refactored components +export * from './CreateSingleItemModal.types' +export * from './CreateSingleItemModal.reducer' +export * from './ItemDetailsStep' +export { default as CommonFields } from './CommonFields' +export * from './Steps' diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index 9e27d7a40..a952fbf0a 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -1,6 +1,20 @@ -import { BodyShape, EmoteCategory, EmoteWithBlobs, WearableCategory, WearableWithBlobs } from '@dcl/schemas' +import { + BodyShape, + ContractAddress, + ContractNetwork, + EmoteCategory, + EmoteWithBlobs, + Mapping, + MappingType, + WearableCategory, + WearableWithBlobs +} from '@dcl/schemas' import { ThumbnailType } from 'lib/getModelData' +import { LinkedContract } from 'modules/thirdParty/types' import { isImageFile, isModelFile } from 'modules/item/utils' +import { Collection } from 'modules/collection/types' +import { BodyShapeType, THUMBNAIL_PATH, VIDEO_PATH, WearableRepresentation } from 'modules/item/types' +import { SortedContent } from './CreateSingleItemModal.types' export const THUMBNAIL_WIDTH = 1024 export const THUMBNAIL_HEIGHT = 1024 @@ -97,3 +111,180 @@ export function toEmoteWithBlobs({ contents, file }: { contents?: Record { + return `${bodyShape}/${contentKey}` +} + +/** + * Creates a new contents record with the names of the contents blobs record prefixed. + * The names need to be prefixed so they won't collide with other + * pre-uploaded models. The name of the content is the name of the uploaded file. + * + * @param bodyShape - The body shaped used to prefix the content names. + * @param contents - The contents which keys are going to be prefixed. + */ +const prefixContents = (bodyShape: BodyShapeType, contents: Record): Record => { + return Object.keys(contents).reduce((newContents: Record, key: string) => { + // Do not include the thumbnail, scenes, and video in each of the body shapes + if ([THUMBNAIL_PATH, VIDEO_PATH].includes(key)) { + return newContents + } + newContents[prefixContentName(bodyShape, key)] = contents[key] + return newContents + }, {}) +} + +/** + * Sorts the content into "male", "female" and "all" taking into consideration the body shape. + * All contains the item thumbnail and both male and female representations according to the shape. + * If the body representation is male, "female" will be an empty object and viceversa. + * + * @param bodyShape - The body shaped used to sort the content. + * @param contents - The contents to be sorted. + */ +export const sortContent = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + const male = bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, contents) : {} + const female = + bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, contents) : {} + + const all: Record = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + if (contents[VIDEO_PATH]) { + all[VIDEO_PATH] = contents[VIDEO_PATH] + } + + return { male, female, all } +} + +export const sortContentZipBothBodyShape = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + let male: Record = {} + let female: Record = {} + const both: Record = {} + + for (const [key, value] of Object.entries(contents)) { + if (key.startsWith('male/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE)) { + male[key] = value + } else if (key.startsWith('female/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE)) { + female[key] = value + } else { + both[key] = value + } + } + + male = { + ...male, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, both) : {}) + } + + female = { + ...female, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, both) : {}) + } + + const all = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + return { male, female, all } +} + +export const buildRepresentations = (bodyShape: BodyShapeType, model: string, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: prefixContentName(BodyShapeType.MALE, model), + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: prefixContentName(BodyShapeType.FEMALE, model), + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +export const buildRepresentationsZipBothBodyshape = (bodyShape: BodyShapeType, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: Object.keys(contents.male).find(content => content.includes('glb'))!, + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: Object.keys(contents.female).find(content => content.includes('glb'))!, + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +/** + * Gets the default mappings for a third party contract + */ +export const getDefaultMappings = ( + contract: LinkedContract | undefined, + isThirdPartyV2Enabled: boolean +): Partial>> | undefined => { + if (!isThirdPartyV2Enabled || !contract) { + return undefined + } + + return { + [contract.network]: { + [contract.address]: [{ type: MappingType.ANY }] + } + } +} + +/** + * Gets the linked contract from a collection + */ +export const getLinkedContract = (collection: Collection | undefined | null): LinkedContract | undefined => { + if (!collection?.linkedContractAddress || !collection?.linkedContractNetwork) { + return undefined + } + + return { + address: collection.linkedContractAddress, + network: collection.linkedContractNetwork + } +} From b8e4fef27d214292c12e876768327a0323431842 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Sun, 7 Sep 2025 01:14:22 -0300 Subject: [PATCH 07/48] feat: Add Outcomes section to the Emotes Details --- .../CreateSingleItemModal.css | 20 +- .../CreateSingleItemModal.original.tsx | 1499 +++++++++++++++++ .../ItemDetailsStep/EmoteDetails.tsx | 285 ++++ 3 files changed, 1803 insertions(+), 1 deletion(-) create mode 100644 src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx create mode 100644 src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css index 3b2619363..eb6a3edb9 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css @@ -43,6 +43,7 @@ display: flex; flex-direction: column; padding: 24px; + align-self: flex-start; } .CreateSingleItemModal .preview .thumbnail-container { @@ -280,7 +281,7 @@ font-weight: 500; } -.CreateSingleItemModal .field-header { +.CreateSingleItemModal .fields-header { display: flex; align-items: center; justify-content: space-between; @@ -289,3 +290,20 @@ .CreateSingleItemModal .field-header .learn-more { text-decoration: underline; } + +.CreateSingleItemModal .outcomes-section { + display: flex; + flex-direction: column; + gap: 8px; +} + +.CreateSingleItemModal .outcome-header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.CreateSingleItemModal .dcl.box.outcome-box { + padding: 0; + padding-bottom: 8px; +} diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx new file mode 100644 index 000000000..853d803ec --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx @@ -0,0 +1,1499 @@ +import React, { useReducer, useRef, useCallback, useMemo } from 'react' +import { ethers } from 'ethers' +import { + BodyPartCategory, + BodyShape, + EmoteCategory, + EmoteDataADR74, + Rarity, + PreviewProjection, + WearableCategory, + Mapping, + MappingType, + ContractNetwork, + ContractAddress +} from '@dcl/schemas' +import { + MAX_EMOTE_FILE_SIZE, + MAX_SKIN_FILE_SIZE, + MAX_THUMBNAIL_FILE_SIZE, + MAX_WEARABLE_FILE_SIZE, + MAX_SMART_WEARABLE_FILE_SIZE +} from '@dcl/builder-client/dist/files/constants' + +import { + ModalNavigation, + Row, + Column, + Button, + Form, + Field, + Icon as DCLIcon, + Section, + Header, + InputOnChangeData, + SelectField, + DropdownProps, + WearablePreview, + Message +} from 'decentraland-ui' +import { t } from 'decentraland-dapps/dist/modules/translation/utils' +import Modal from 'decentraland-dapps/dist/containers/Modal' +import { isErrorWithMessage } from 'decentraland-dapps/dist/lib/error' +import { getImageType, dataURLToBlob, convertImageIntoWearableThumbnail } from 'modules/media/utils' +import { ImageType } from 'modules/media/types' +import { + THUMBNAIL_PATH, + Item, + BodyShapeType, + ITEM_NAME_MAX_LENGTH, + WearableRepresentation, + ItemType, + EmotePlayMode, + VIDEO_PATH, + WearableData, + SyncStatus +} from 'modules/item/types' +import { Metrics } from 'modules/models/types' +import { computeHashes } from 'modules/deployment/contentUtils' +import { + getBodyShapeType, + getMissingBodyShapeType, + getWearableCategories, + getBackgroundStyle, + isImageFile, + resizeImage, + getEmoteCategories, + getEmotePlayModes, + getBodyShapeTypeFromContents, + isSmart, + isWearable, + buildItemMappings, + isEmoteFileSizeValid, + isSkinFileSizeValid, + isSmartWearableFileSizeValid, + isWearableFileSizeValid +} from 'modules/item/utils' +import { EngineType, getItemData, getModelData } from 'lib/getModelData' +import { getExtension, toMB } from 'lib/file' +import { + getDefaultThirdPartyUrnSuffix, + buildThirdPartyURN, + DecodedURN, + decodeURN, + isThirdParty, + isThirdPartyCollectionDecodedUrn +} from 'lib/urn' +import ItemDropdown from 'components/ItemDropdown' +import Icon from 'components/Icon' +import ItemVideo from 'components/ItemVideo' +import ItemRequiredPermission from 'components/ItemRequiredPermission' +import ItemProperties from 'components/ItemProperties' +import { Collection } from 'modules/collection/types' +import { LinkedContract } from 'modules/thirdParty/types' +import { calculateFileSize, calculateModelFinalSize } from 'modules/item/export' +import { MAX_THUMBNAIL_SIZE } from 'modules/assetPack/utils' +import { areMappingsValid } from 'modules/thirdParty/utils' +import { Authorization } from 'lib/api/auth' +import { MappingEditor } from 'components/MappingEditor' +import { BUILDER_SERVER_URL, BuilderAPI } from 'lib/api/builder' +import EditPriceAndBeneficiaryModal from '../EditPriceAndBeneficiaryModal' +import ImportStep from './ImportStep/ImportStep' +import EditThumbnailStep from './EditThumbnailStep/EditThumbnailStep' +import UploadVideoStep from './UploadVideoStep/UploadVideoStep' +import { getThumbnailType, toEmoteWithBlobs, toWearableWithBlobs } from './utils' +import { createItemReducer, createItemActions } from './CreateSingleItemModal.reducer' +import { + Props, + State, + CreateItemView, + CreateSingleItemModalMetadata, + StateData, + SortedContent, + AcceptedFileProps + // ITEM_LOADED_CHECK_DELAY +} from './CreateSingleItemModal.types' +import './CreateSingleItemModal.css' + +const defaultMapping: Mapping = { type: MappingType.ANY } + +/** + * Prefixes the content name by adding the adding the body shape name to it. + * + * @param bodyShape - The body shaped used to prefix the content name. + * @param contentKey - The content key or name to be prefixed. + */ +const prefixContentName = (bodyShape: BodyShapeType, contentKey: string): string => { + return `${bodyShape}/${contentKey}` +} + +/** + * Creates a new contents record with the names of the contents blobs record prefixed. + * The names need to be prefixed so they won't collide with other + * pre-uploaded models. The name of the content is the name of the uploaded file. + * + * @param bodyShape - The body shaped used to prefix the content names. + * @param contents - The contents which keys are going to be prefixed. + */ +const prefixContents = (bodyShape: BodyShapeType, contents: Record): Record => { + return Object.keys(contents).reduce((newContents: Record, key: string) => { + // Do not include the thumbnail, scenes, and video in each of the body shapes + if ([THUMBNAIL_PATH, VIDEO_PATH].includes(key)) { + return newContents + } + newContents[prefixContentName(bodyShape, key)] = contents[key] + return newContents + }, {}) +} + +/** + * Sorts the content into "male", "female" and "all" taking into consideration the body shape. + * All contains the item thumbnail and both male and female representations according to the shape. + * If the body representation is male, "female" will be an empty object and viceversa. + * + * @param bodyShape - The body shaped used to sort the content. + * @param contents - The contents to be sorted. + */ +const sortContent = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + const male = bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, contents) : {} + const female = + bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, contents) : {} + + const all: Record = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + if (contents[VIDEO_PATH]) { + all[VIDEO_PATH] = contents[VIDEO_PATH] + } + + return { male, female, all } +} + +const sortContentZipBothBodyShape = (bodyShape: BodyShapeType, contents: Record): SortedContent => { + let male: Record = {} + let female: Record = {} + const both: Record = {} + + for (const [key, value] of Object.entries(contents)) { + if (key.startsWith('male/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE)) { + male[key] = value + } else if (key.startsWith('female/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE)) { + female[key] = value + } else { + both[key] = value + } + } + + male = { + ...male, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, both) : {}) + } + + female = { + ...female, + ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, both) : {}) + } + + const all = { + [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], + ...male, + ...female + } + + return { male, female, all } +} + +const buildRepresentations = (bodyShape: BodyShapeType, model: string, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: prefixContentName(BodyShapeType.MALE, model), + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: prefixContentName(BodyShapeType.FEMALE, model), + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +const buildRepresentationsZipBothBodyshape = (bodyShape: BodyShapeType, contents: SortedContent): WearableRepresentation[] => { + const representations: WearableRepresentation[] = [] + + // add male representation + if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.MALE], + mainFile: Object.keys(contents.male).find(content => content.includes('glb'))!, + contents: Object.keys(contents.male), + overrideHides: [], + overrideReplaces: [] + }) + } + + // add female representation + if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { + representations.push({ + bodyShapes: [BodyShape.FEMALE], + mainFile: Object.keys(contents.female).find(content => content.includes('glb'))!, + contents: Object.keys(contents.female), + overrideHides: [], + overrideReplaces: [] + }) + } + + return representations +} + +const getDefaultMappings = ( + contract: LinkedContract | undefined, + isThirdPartyV2Enabled: boolean +): Partial>> | undefined => { + if (!isThirdPartyV2Enabled || !contract) { + return undefined + } + + return { + [contract.network]: { + [contract.address]: [defaultMapping] + } + } +} + +const getLinkedContract = (collection: Collection | undefined | null): LinkedContract | undefined => { + if (!collection?.linkedContractAddress || !collection?.linkedContractNetwork) { + return undefined + } + + return { + address: collection.linkedContractAddress, + network: collection.linkedContractNetwork + } +} + +const getPlayModeOptions = () => { + const playModes: string[] = getEmotePlayModes() + + return playModes.map(value => ({ + value, + text: t(`emote.play_mode.${value}.text`), + description: t(`emote.play_mode.${value}.description`) + })) +} + +export const CreateSingleItemModal: React.FC = props => { + const { address, collection, error, itemStatus, metadata, name, onClose, onSave, isLoading, isThirdPartyV2Enabled } = props + const thumbnailInput = useRef(null) + const modalContainer = useRef(null) + + const getInitialState = useCallback((): State => { + const state: State = { + view: CreateItemView.IMPORT, + playMode: EmotePlayMode.SIMPLE, + weareblePreviewUpdated: false, + hasScreenshotTaken: false + } + + if (!metadata) { + return state + } + + const { collectionId, item, addRepresentation } = metadata as CreateSingleItemModalMetadata + state.collectionId = collectionId + const contract = collection ? getLinkedContract(collection) : undefined + + if (item) { + state.id = item.id + state.name = item.name + state.description = item.description + state.item = item + state.type = item.type + state.collectionId = item.collectionId + state.bodyShape = getBodyShapeType(item) + state.category = item.data.category + state.rarity = item.rarity + state.isRepresentation = false + state.mappings = item.mappings ?? getDefaultMappings(contract, isThirdPartyV2Enabled) + + if (addRepresentation) { + const missingBodyShape = getMissingBodyShapeType(item) + if (missingBodyShape) { + state.bodyShape = missingBodyShape + state.isRepresentation = true + } + } + } else { + state.mappings = getDefaultMappings(contract, isThirdPartyV2Enabled) + } + + return state + }, [collection, metadata, isThirdPartyV2Enabled]) + + const [state, dispatch] = useReducer(createItemReducer, getInitialState()) + + const createItem = useCallback( + async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { + id, + name, + description, + type, + metrics, + collectionId, + category, + playMode, + rarity, + hasScreenshotTaken, + requiredPermissions, + tags, + blockVrmExport, + mappings + } = state as StateData + + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection?.urn) + // If it's a third party item, we need to automatically create an URN for it by generating a random uuid different from the id + const decodedCollectionUrn: DecodedURN | null = collection?.urn ? decodeURN(collection.urn) : null + let urn: string | undefined + if (decodedCollectionUrn && isThirdPartyCollectionDecodedUrn(decodedCollectionUrn)) { + urn = buildThirdPartyURN( + decodedCollectionUrn.thirdPartyName, + decodedCollectionUrn.thirdPartyCollectionId, + getDefaultThirdPartyUrnSuffix(name) + ) + } + + // create item to save + let data: WearableData | EmoteDataADR74 + + if (type === ItemType.WEARABLE) { + const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] + data = { + category: category as WearableCategory, + replaces: [], + hides: [], + removesDefaultHiding, + tags: tags || [], + representations: [...representations], + requiredPermissions: requiredPermissions || [], + blockVrmExport: blockVrmExport ?? false, + outlineCompatible: true // it's going to be true for all the items. It can be deactivated later in the editor view + } as WearableData + } else { + data = { + category: category as EmoteCategory, + loop: playMode === EmotePlayMode.LOOP, + tags: tags || [], + representations: [...representations] + } as EmoteDataADR74 + } + + const contents = await computeHashes(sortedContents.all) + + const item: Item = { + id, + name, + urn, + description: description || '', + thumbnail: THUMBNAIL_PATH, + video: contents[VIDEO_PATH], + type, + collectionId, + totalSupply: 0, + isPublished: false, + isApproved: false, + inCatalyst: false, + blockchainContentHash: null, + currentContentHash: null, + catalystContentHash: null, + rarity: belongsToAThirdPartyCollection ? Rarity.UNIQUE : rarity, + data, + owner: address!, + metrics, + contents, + mappings: belongsToAThirdPartyCollection && mappings ? mappings : null, + createdAt: +new Date(), + updatedAt: +new Date() + } + + // If it's a Third Party Item, don't prompt the user with the SET PRICE view + if ((hasScreenshotTaken || type !== ItemType.EMOTE) && belongsToAThirdPartyCollection) { + item.price = '0' + item.beneficiary = ethers.constants.AddressZero + return onSave(item as Item, sortedContents.all) + } + + if (hasScreenshotTaken || type !== ItemType.EMOTE) { + item.price = ethers.constants.MaxUint256.toString() + item.beneficiary = item.beneficiary || address + return onSave(item as Item, sortedContents.all) + } + + dispatch(createItemActions.setItem(item as Item)) + dispatch(createItemActions.setItemSortedContents(sortedContents.all)) + dispatch(createItemActions.setView(CreateItemView.THUMBNAIL)) + dispatch(createItemActions.setFromView(CreateItemView.THUMBNAIL)) + }, + [address, collection, state, onSave] + ) + + const addItemRepresentation = useCallback( + async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { bodyShape, item: editedItem, requiredPermissions } = state as StateData + const hashedContents = await computeHashes(bodyShape === BodyShapeType.MALE ? sortedContents.male : sortedContents.female) + if (isWearable(editedItem)) { + const removesDefaultHiding = + editedItem.data.category === WearableCategory.UPPER_BODY || editedItem.data.hides.includes(WearableCategory.UPPER_BODY) + ? [BodyPartCategory.HANDS] + : [] + const item = { + ...editedItem, + data: { + ...editedItem.data, + representations: [ + ...editedItem.data.representations, + // add new representation + ...representations + ], + replaces: [...editedItem.data.replaces], + hides: [...editedItem.data.hides], + removesDefaultHiding: removesDefaultHiding, + tags: [...editedItem.data.tags], + requiredPermissions: requiredPermissions || [], + blockVrmExport: editedItem.data.blockVrmExport, + outlineCompatible: editedItem.data.outlineCompatible || true // it's going to be true for all the items. It can be deactivated later in the editor view + }, + contents: { + ...editedItem.contents, + ...hashedContents + }, + updatedAt: +new Date() + } + + // Do not change the thumbnail when adding a new representation + delete sortedContents.all[THUMBNAIL_PATH] + onSave(item, sortedContents.all) + } + }, + [state, onSave] + ) + + const modifyItem = useCallback( + async (pristineItem: Item, sortedContents: SortedContent, representations: WearableRepresentation[]) => { + const { name, bodyShape, type, mappings, metrics, category, playMode, requiredPermissions } = state as StateData + + let data: WearableData | EmoteDataADR74 + + if (type === ItemType.WEARABLE) { + const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] + data = { + ...pristineItem.data, + removesDefaultHiding, + category: category as WearableCategory, + requiredPermissions: requiredPermissions || [] + } as WearableData + } else { + data = { + ...pristineItem.data, + loop: playMode === EmotePlayMode.LOOP, + category: category as EmoteCategory + } as EmoteDataADR74 + } + + const contents = await computeHashes(sortedContents.all) + + const item = { + ...pristineItem, + data, + name, + metrics, + contents, + mappings, + updatedAt: +new Date() + } + + const wearableBodyShape = bodyShape === BodyShapeType.MALE ? BodyShape.MALE : BodyShape.FEMALE + const representationIndex = pristineItem.data.representations.findIndex( + (representation: WearableRepresentation) => representation.bodyShapes[0] === wearableBodyShape + ) + const pristineBodyShape = getBodyShapeType(pristineItem) + if (representations.length === 2 || representationIndex === -1 || pristineBodyShape === BodyShapeType.BOTH) { + // Unisex or Representation changed + item.data.representations = representations + } else { + // Edited representation + item.data.representations[representationIndex] = representations[0] + } + + if (itemStatus && [SyncStatus.UNPUBLISHED, SyncStatus.UNDER_REVIEW].includes(itemStatus) && isSmart(item) && VIDEO_PATH in contents) { + item.video = contents[VIDEO_PATH] + } + + onSave(item as Item, sortedContents.all) + }, + [itemStatus, state, onSave] + ) + + const isValid = useCallback((): boolean => { + const { + name, + thumbnail, + metrics, + bodyShape, + category, + playMode, + rarity, + item, + isRepresentation, + type, + modelSize, + mappings, + error: stateError + } = state + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) + const linkedContract = collection ? getLinkedContract(collection) : undefined + + if (stateError) { + dispatch(createItemActions.clearError()) + } + + let required: (string | Metrics | Item | undefined)[] + if (isRepresentation) { + required = [item as Item] + } else if (belongsToAThirdPartyCollection) { + required = [name, thumbnail, metrics, bodyShape, category] + } else if (type === ItemType.EMOTE) { + required = [name, thumbnail, metrics, category, playMode, rarity, type] + } else { + required = [name, thumbnail, metrics, bodyShape, category, rarity, type] + } + + const thumbnailBlob = thumbnail ? dataURLToBlob(thumbnail) : undefined + const thumbnailSize = thumbnailBlob ? calculateFileSize(thumbnailBlob) : 0 + + if (thumbnailSize && thumbnailSize > MAX_THUMBNAIL_SIZE) { + dispatch( + createItemActions.setError( + t('create_single_item_modal.error.thumbnail_file_too_big', { maxSize: `${toMB(MAX_THUMBNAIL_FILE_SIZE)}MB` }) + ) + ) + return false + } + const isSkin = category === WearableCategory.SKIN + const isEmote = type === ItemType.EMOTE + const isSmartWearable = isSmart({ type, contents: state.contents }) + const isRequirementMet = required.every(prop => prop !== undefined) + const finalSize = modelSize ? modelSize + thumbnailSize : undefined + + if (isThirdPartyV2Enabled && ((!mappings && linkedContract) || (mappings && !areMappingsValid(mappings)))) { + return false + } + + if (isRequirementMet && isEmote && finalSize && !isEmoteFileSizeValid(finalSize)) { + dispatch( + createItemActions.setError( + t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_EMOTE_FILE_SIZE)}MB`, + type: `emote` + }) + ) + ) + return false + } + + if (isRequirementMet && isSkin && finalSize && !isSkinFileSizeValid(finalSize)) { + dispatch( + createItemActions.setError( + t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_SKIN_FILE_SIZE)}MB`, + type: `skin` + }) + ) + ) + return false + } + + if (isRequirementMet && !isSkin && isSmartWearable && finalSize && !isSmartWearableFileSizeValid(finalSize)) { + dispatch( + createItemActions.setError( + t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_SMART_WEARABLE_FILE_SIZE)}MB`, + type: `smart wearable` + }) + ) + ) + return false + } + + if (isRequirementMet && !isSkin && !isSmartWearable && finalSize && !isWearableFileSizeValid(finalSize)) { + dispatch( + createItemActions.setError( + t('create_single_item_modal.error.item_too_big', { + size: `${toMB(MAX_WEARABLE_FILE_SIZE)}MB`, + type: `wearable` + }) + ) + ) + return false + } + return isRequirementMet + }, [collection, state, isThirdPartyV2Enabled]) + + const handleSubmit = useCallback(async () => { + const { id } = state + + let changeItemFile = false + let addRepresentation = false + let pristineItem: Item | null = null + + if (metadata) { + changeItemFile = metadata.changeItemFile + addRepresentation = metadata.addRepresentation + pristineItem = metadata.item + } + + if (id && isValid()) { + const { thumbnail, contents, bodyShape, type, model, isRepresentation, item: editedItem, video } = state as StateData + if (state.view === CreateItemView.DETAILS) { + try { + const blob = dataURLToBlob(thumbnail) + const hasCustomThumbnail = THUMBNAIL_PATH in contents + if (blob && !hasCustomThumbnail) { + contents[THUMBNAIL_PATH] = blob + } + + if (video) { + const videoBlob = dataURLToBlob(video) + const hasPreviewVideo = VIDEO_PATH in contents + if (videoBlob && !hasPreviewVideo) { + contents[VIDEO_PATH] = videoBlob + } + } + + const sortedContents = + type === ItemType.WEARABLE && getBodyShapeTypeFromContents(contents) === BodyShapeType.BOTH + ? sortContentZipBothBodyShape(bodyShape, contents) + : sortContent(bodyShape, contents) + const representations = + type === ItemType.WEARABLE && getBodyShapeTypeFromContents(contents) === BodyShapeType.BOTH + ? buildRepresentationsZipBothBodyshape(bodyShape, sortedContents) + : buildRepresentations(bodyShape, model, sortedContents) + + // Add this item as a representation of an existing item + if ((isRepresentation || addRepresentation) && editedItem) { + await addItemRepresentation(sortedContents, representations) + } else if (pristineItem && changeItemFile) { + await modifyItem(pristineItem, sortedContents, representations) + } else { + await createItem(sortedContents, representations) + } + } catch (error) { + dispatch(createItemActions.setError(isErrorWithMessage(error) ? error.message : 'Unknown error')) + } + } else if (!!state.item && !!state.itemSortedContents) { + const sortedContents = { + male: state.itemSortedContents, + female: state.itemSortedContents, + all: state.itemSortedContents + } + const representations = buildRepresentations(state.bodyShape!, state.model!, sortedContents) + await createItem(sortedContents, representations) + } + } + }, [metadata, state, addItemRepresentation, createItem, modifyItem, isValid]) + + const getMetricsAndScreenshot = useCallback(async () => { + const { type, previewController, model, contents, category, thumbnail } = state + if (type && model && contents) { + const data = await getItemData({ + wearablePreviewController: previewController, + type, + model, + contents, + category + }) + let view = CreateItemView.DETAILS + if (isSmart({ type, contents })) { + // TODO: await setTimeout(() => {}, ITEM_LOADED_CHECK_DELAY) + view = CreateItemView.UPLOAD_VIDEO + } + + dispatch(createItemActions.setMetrics(data.metrics)) + dispatch(createItemActions.setThumbnail(thumbnail ?? data.image)) + dispatch(createItemActions.setView(view)) + dispatch(createItemActions.setLoading(false)) + } + }, [state]) + + const handleDropAccepted = useCallback( + (acceptedFileProps: AcceptedFileProps) => { + const { bodyShape, ...acceptedProps } = acceptedFileProps + dispatch(createItemActions.setLoading(true)) + dispatch(createItemActions.setBodyShape(bodyShape || state.bodyShape || BodyShapeType.MALE)) + dispatch(createItemActions.setAcceptedProps(acceptedProps)) + }, + [state] + ) + + const handleVideoDropAccepted = useCallback((acceptedFileProps: AcceptedFileProps) => { + dispatch(createItemActions.setLoading(true)) + dispatch(createItemActions.setAcceptedProps(acceptedFileProps)) + }, []) + + const handleSaveVideo = useCallback(() => { + dispatch(createItemActions.setFromView(undefined)) + dispatch(createItemActions.setLoading(false)) + dispatch(createItemActions.setView(CreateItemView.DETAILS)) + }, []) + + const getMapping = useCallback((): Mapping => { + const { mappings } = state + const contract = getLinkedContract(collection) + if (!contract) { + return defaultMapping + } + + let mapping: Mapping | undefined + if (mappings) { + mapping = mappings[contract.network]?.[contract.address][0] + } else { + mapping = getDefaultMappings(contract, isThirdPartyV2Enabled)?.[contract.network]?.[contract.address][0] + } + + return mapping ?? defaultMapping + }, [collection, state, isThirdPartyV2Enabled]) + + const handleMappingChange = useCallback( + (mapping: Mapping) => { + const contract = getLinkedContract(collection) + if (!contract) { + return + } + dispatch(createItemActions.setMappings(buildItemMappings(mapping, contract))) + }, + [collection] + ) + + const handleNameChange = useCallback( + (_event: React.ChangeEvent, props: InputOnChangeData) => + dispatch(createItemActions.setName(props.value.slice(0, ITEM_NAME_MAX_LENGTH))), + [] + ) + + const handleItemChange = useCallback((item: Item) => { + dispatch(createItemActions.setItem(item)) + dispatch(createItemActions.setCategory(item.data.category as WearableCategory)) + dispatch(createItemActions.setRarity(item.rarity as Rarity)) + }, []) + + const handleCategoryChange = useCallback( + (_event: React.SyntheticEvent, { value }: DropdownProps) => { + const category = value as WearableCategory + const hasChangedThumbnailType = + (state.category && getThumbnailType(category) !== getThumbnailType(state.category as WearableCategory)) || !state.category + + if (state.category !== category) { + dispatch(createItemActions.setCategory(category)) + if (state.type === ItemType.WEARABLE && hasChangedThumbnailType) { + // As it's not required to wait for the promise, use the void operator to return undefined + void updateThumbnailByCategory(category) + } + } + }, + [state] + ) + + const handleRarityChange = useCallback((_event: React.SyntheticEvent, { value }: DropdownProps) => { + const rarity = value as Rarity + dispatch(createItemActions.setRarity(rarity)) + }, []) + + const handlePlayModeChange = useCallback((_event: React.SyntheticEvent, { value }: DropdownProps) => { + const playMode = value as EmotePlayMode + dispatch(createItemActions.setPlayMode(playMode)) + }, []) + + const handleOpenThumbnailDialog = useCallback(() => { + const { type } = state + if (type === ItemType.EMOTE) { + dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) + dispatch(createItemActions.setView(CreateItemView.THUMBNAIL)) + } else if (thumbnailInput.current) { + thumbnailInput.current.click() + } + }, [state, thumbnailInput]) + + const handleThumbnailChange = useCallback( + async (event: React.ChangeEvent) => { + const { contents } = state + const { files } = event.target + if (files && files.length > 0) { + const file = files[0] + const imageType = await getImageType(file) + if (imageType !== ImageType.PNG) { + dispatch(createItemActions.setError(t('create_single_item_modal.wrong_thumbnail_format'))) + return + } + dispatch(createItemActions.clearError()) + + const smallThumbnailBlob = await resizeImage(file) + const bigThumbnailBlob = await resizeImage(file, 1024, 1024) + + const thumbnail = URL.createObjectURL(smallThumbnailBlob) + + dispatch(createItemActions.setThumbnail(thumbnail)) + dispatch( + createItemActions.setContents({ + ...contents, + [THUMBNAIL_PATH]: bigThumbnailBlob + }) + ) + } + }, + [state] + ) + + const handleOpenVideoDialog = useCallback(() => { + dispatch(createItemActions.setView(CreateItemView.UPLOAD_VIDEO)) + dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) + }, []) + + const handleYes = useCallback(() => dispatch(createItemActions.setIsRepresentation(true)), []) + + const handleNo = useCallback(() => dispatch(createItemActions.setIsRepresentation(false)), []) + + const isAddingRepresentation = useMemo(() => { + return !!(metadata && metadata.item && !metadata.changeItemFile) + }, [metadata]) + + const filterItemsByBodyShape = useCallback( + (item: Item) => { + const { bodyShape } = state + return getMissingBodyShapeType(item) === bodyShape && metadata.collectionId === item.collectionId + }, + [metadata, state] + ) + + /** + * Updates the item's thumbnail if the user changes the category of the item. + * + * @param category - The category of the wearable. + */ + const updateThumbnailByCategory = useCallback( + async (category: WearableCategory) => { + const { model, contents } = state + + const isCustom = !!contents && THUMBNAIL_PATH in contents + if (!isCustom) { + dispatch(createItemActions.setLoading(true)) + let thumbnail + if (contents && isImageFile(model!)) { + thumbnail = await convertImageIntoWearableThumbnail(contents[THUMBNAIL_PATH] || contents[model!], category) + } else { + const url = URL.createObjectURL(contents![model!]) + const { image } = await getModelData(url, { + width: 1024, + height: 1024, + thumbnailType: getThumbnailType(category), + extension: (model && getExtension(model)) || undefined, + engine: EngineType.BABYLON + }) + thumbnail = image + URL.revokeObjectURL(url) + } + dispatch(createItemActions.setThumbnail(thumbnail)) + dispatch(createItemActions.setLoading(false)) + } + }, + [state] + ) + + const renderModalTitle = useCallback(() => { + const { bodyShape, type, view, contents } = state + + if (isAddingRepresentation) { + return t('create_single_item_modal.add_representation', { bodyShape: t(`body_shapes.${bodyShape!}`) }) + } + + if (metadata && metadata.changeItemFile) { + return t('create_single_item_modal.change_item_file') + } + + if (type === ItemType.EMOTE) { + return view === CreateItemView.THUMBNAIL + ? t('create_single_item_modal.thumbnail_step_title') + : t('create_single_item_modal.title_emote') + } + + if (isSmart({ type, contents }) && view === CreateItemView.DETAILS) { + return t('create_single_item_modal.smart_wearable_details_title') + } + + switch (view) { + case CreateItemView.THUMBNAIL: + return t('create_single_item_modal.thumbnail_step_title') + case CreateItemView.UPLOAD_VIDEO: + return t('create_single_item_modal.upload_video_step_title') + default: + return t('create_single_item_modal.title') + } + }, [metadata, state, isAddingRepresentation]) + + const handleFileLoad = useCallback(async () => { + const { weareblePreviewUpdated, type, model, item, contents } = state + + const modelSize = await calculateModelFinalSize( + item?.contents ?? {}, + contents ?? {}, + type ?? ItemType.WEARABLE, + new BuilderAPI(BUILDER_SERVER_URL, new Authorization(() => props.address)) + ) + + dispatch(createItemActions.setModelSize(modelSize)) + + // if model is an image, the wearable preview won't be needed + if (model && isImageFile(model)) { + return getMetricsAndScreenshot() + } + + const controller = WearablePreview.createController('thumbnail-picker') + // dispatch(createItemActions.setPreviewController(controller)) + + if (weareblePreviewUpdated) { + if (type === ItemType.EMOTE) { + const length = await controller.emote.getLength() + await controller.emote.goTo(Math.floor(Math.random() * length)) + } + return getMetricsAndScreenshot() + } + }, [state, getMetricsAndScreenshot]) + + const renderWearablePreview = useCallback(() => { + const { type, contents } = state + const isEmote = type === ItemType.EMOTE + const blob = contents ? (isEmote ? toEmoteWithBlobs({ contents }) : toWearableWithBlobs({ contents })) : undefined + + if (!blob) { + return null + } + + const wearablePreviewExtraOptions = isEmote + ? { + profile: 'default', + disableFace: true, + disableDefaultWearables: true, + skin: '000000', + wheelZoom: 2 + } + : {} + + return ( + dispatch(createItemActions.setWearablePreviewUpdated(true))} + onLoad={handleFileLoad} + /> + ) + }, [state, handleFileLoad]) + + const handleUploadVideoGoBack = useCallback(() => { + const { fromView } = state + const keys = Object.keys(state) + + if (fromView) { + dispatch(createItemActions.setView(fromView)) + return + } + + const stateReset = keys.reduce((acc, v) => ({ ...acc, [v]: undefined }), {}) + dispatch(createItemActions.resetState(stateReset)) + }, [state]) + + const renderImportView = useCallback(() => { + const { category, isLoading, isRepresentation } = state + const title = renderModalTitle() + + return ( + {renderWearablePreview()}} + isLoading={!!isLoading} + isRepresentation={!!isRepresentation} + onDropAccepted={handleDropAccepted} + onClose={onClose} + /> + ) + }, [collection, metadata, state, handleDropAccepted, renderModalTitle, renderWearablePreview, onClose]) + + const renderUploadVideoView = useCallback(() => { + const { contents } = state + const title = renderModalTitle() + + return ( + + ) + }, [itemStatus, state, renderModalTitle, handleVideoDropAccepted, handleSaveVideo, handleUploadVideoGoBack, onClose]) + + const renderFields = useCallback(() => { + const { name, category, rarity, contents, item, type, isLoading } = state + + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) + const rarities = Rarity.getRarities() + const categories: string[] = type === ItemType.WEARABLE ? getWearableCategories(contents) : getEmoteCategories() + const linkedContract = getLinkedContract(collection) + + const raritiesLink = + 'https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections' + + (type === ItemType.EMOTE + ? '/uploading-emotes/#rarity' + : isSmart({ type, contents }) + ? '/uploading-smart-wearables/#rarity' + : '/uploading-wearables/#rarity') + + return ( + <> + + {(!item || !item.isPublished) && !belongsToAThirdPartyCollection ? ( + <> + + {t('create_single_item_modal.rarity_label')} + + {t('global.learn_more')} + + + } + placeholder={t('create_single_item_modal.rarity_placeholder')} + value={rarity} + options={rarities.map(value => ({ + value, + label: t('wearable.supply', { + count: Rarity.getMaxSupply(value), + formatted: Rarity.getMaxSupply(value).toLocaleString() + }), + text: t(`wearable.rarity.${value}`) + }))} + disabled={isLoading} + onChange={handleRarityChange} + /> + + ) : null} + ({ value, text: t(`${type!}.category.${value}`) }))} + onChange={handleCategoryChange} + /> + {isThirdPartyV2Enabled && linkedContract && } + + ) + }, [collection, getMapping, handleCategoryChange, handleMappingChange, handleNameChange, handleRarityChange, isThirdPartyV2Enabled]) + + const renderMetrics = useCallback(() => { + const { metrics, contents } = state + if (metrics) { + return + } else { + return null + } + }, [state]) + + const isDisabled = useCallback((): boolean => { + const { isLoading: isStateLoading } = state + + return !isValid() || isLoading || Boolean(isStateLoading) + }, [state, isLoading, isValid]) + + const renderRepresentation = useCallback( + (type: BodyShapeType) => { + const { bodyShape } = state + return ( +
{ + dispatch(createItemActions.setBodyShape(type)) + dispatch(createItemActions.setIsRepresentation(metadata && metadata.changeItemFile ? false : undefined)) + dispatch(createItemActions.setItem(undefined)) + }} + > + {t('body_shapes.' + type)} +
+ ) + }, + [metadata, state] + ) + + const renderWearableDetails = useCallback(() => { + const { bodyShape, thumbnail, isRepresentation, rarity, item } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + return ( + <> +
+
+ {title} + {isRepresentation ? null : ( + <> + + + + )} +
+ {renderMetrics()} +
+ + {isAddingRepresentation ? null : ( +
+
{t('create_single_item_modal.representation_label')}
+ + {renderRepresentation(BodyShapeType.BOTH)} + {renderRepresentation(BodyShapeType.MALE)} + {renderRepresentation(BodyShapeType.FEMALE)} + +
+ )} + {bodyShape && (!metadata || !metadata.changeItemFile) ? ( + <> + {bodyShape === BodyShapeType.BOTH ? ( + renderFields() + ) : ( + <> + {isAddingRepresentation ? null : ( +
+
{t('create_single_item_modal.existing_item')}
+ +
+ {t('global.yes')} +
+
+ {t('global.no')} +
+
+
+ )} + {isRepresentation === undefined ? null : isRepresentation ? ( +
+
+ {isAddingRepresentation + ? t('create_single_item_modal.adding_representation', { bodyShape: t(`body_shapes.${bodyShape}`) }) + : t('create_single_item_modal.pick_item', { bodyShape: t(`body_shapes.${bodyShape}`) })} +
+ } + filter={filterItemsByBodyShape} + onChange={handleItemChange} + isDisabled={isAddingRepresentation} + /> +
+ ) : ( + renderFields() + )} + + )} + + ) : ( + renderFields() + )} +
+ + ) + }, [metadata, state, renderFields, renderMetrics, renderModalTitle, renderRepresentation, isAddingRepresentation]) + + const renderEmoteDetails = useCallback(() => { + const { thumbnail, rarity, playMode = '' } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + return ( + + + +
+ {title} + + +
+ {renderMetrics()} +
+ + {renderFields()} + + +
+
+ } /> +
+
+ ) + }, [state, renderFields, renderMetrics, renderModalTitle, handlePlayModeChange, handleThumbnailChange]) + + const renderSmartWearableDetails = useCallback(() => { + const { thumbnail, rarity, requiredPermissions, video } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + return ( +
+ {renderFields()} + {requiredPermissions?.length ? ( +
+
+ {t('create_single_item_modal.smart_wearable_permissions_label')} + + {t('global.learn_more')} + +
+ +
+ ) : null} + +
+
{t('create_single_item_modal.thumbnail_preview_title')}
+
+
+ {title} + + +
+
{renderMetrics()}
+
+
+ +
+
{t('create_single_item_modal.video_preview_title')}
+
+ } + onClick={handleOpenVideoDialog} + /> +
+
+
+
+ } /> +
+
+ ) + }, [state, renderFields, renderMetrics, renderModalTitle, handleOpenVideoDialog]) + + const renderItemDetails = useCallback(() => { + const { type, contents } = state + + if (type === ItemType.EMOTE) { + return renderEmoteDetails() + } else if (isSmart({ type, contents })) { + return renderSmartWearableDetails() + } else { + return renderWearableDetails() + } + }, [state, renderEmoteDetails, renderSmartWearableDetails, renderWearableDetails]) + + const handleGoBack = useCallback(() => { + dispatch(createItemActions.setView(CreateItemView.UPLOAD_VIDEO)) + }, []) + + const renderDetailsView = useCallback(() => { + const { isRepresentation, error: stateError, type, contents, isLoading: isStateLoading, hasScreenshotTaken } = state + const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) + const _isDisabled = isDisabled() + const title = renderModalTitle() + const hasFinishSteps = (type === ItemType.EMOTE && hasScreenshotTaken) || type === ItemType.WEARABLE + + return ( + <> + + +
+ + {renderItemDetails()} + + {isSmart({ type, contents }) ? ( + + + + ) : null} + + + + + {stateError ? ( + +

{stateError}

+
+ ) : null} + {error ? ( + +

{error}

+
+ ) : null} +
+
+
+ + ) + }, [collection, error, metadata, state, handleSubmit, renderModalTitle, isDisabled, isLoading, onClose]) + + const handleOnScreenshotTaken = useCallback( + async (screenshot: string) => { + const { itemSortedContents, item } = state + + if (item && itemSortedContents) { + const blob = dataURLToBlob(screenshot) + + itemSortedContents[THUMBNAIL_PATH] = blob! + item.contents = await computeHashes(itemSortedContents) + + // Determine the target view based on fromView + let targetView = state.view + if (state.fromView === CreateItemView.DETAILS) { + targetView = CreateItemView.DETAILS + } else { + // Call handleSubmit and let it handle the view change + void handleSubmit() + } + + // Update state with individual actions for clarity + dispatch(createItemActions.setItemSortedContents(itemSortedContents)) + dispatch(createItemActions.setItem(item as Item)) + dispatch(createItemActions.setHasScreenshotTaken(true)) + dispatch(createItemActions.setView(targetView)) + } else { + // Determine the target view based on fromView + let targetView = state.view + if (state.fromView === CreateItemView.DETAILS) { + targetView = CreateItemView.DETAILS + } + + // Update state with individual actions + dispatch(createItemActions.setThumbnail(screenshot)) + dispatch(createItemActions.setHasScreenshotTaken(true)) + dispatch(createItemActions.setView(targetView)) + } + }, + [state, handleSubmit] + ) + + const renderThumbnailView = useCallback(() => { + const { isLoading, contents } = state + + return ( + dispatch(createItemActions.setView(CreateItemView.DETAILS))} + onSave={handleOnScreenshotTaken} + onClose={onClose} + /> + ) + }, [state, renderModalTitle, handleOnScreenshotTaken, onClose]) + + const renderSetPrice = useCallback(() => { + const { item, itemSortedContents } = state + return ( + + ) + }, [state, handleSubmit]) + + const renderView = useCallback(() => { + const { view } = state + switch (view) { + case CreateItemView.IMPORT: + return renderImportView() + case CreateItemView.UPLOAD_VIDEO: + return renderUploadVideoView() + case CreateItemView.DETAILS: + return renderDetailsView() + case CreateItemView.THUMBNAIL: + return renderThumbnailView() + case CreateItemView.SET_PRICE: + return renderSetPrice() + default: + return null + } + }, [state]) + + return ( +
+ + {renderView()} + +
+ ) +} + +export default React.memo(CreateSingleItemModal) diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx new file mode 100644 index 000000000..8b20afd5d --- /dev/null +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx @@ -0,0 +1,285 @@ +import React, { useCallback } from 'react' +import { Row, Column, SelectField, Message, DropdownProps, Field, Checkbox, Button, Box } from 'decentraland-ui' +import { t } from 'decentraland-dapps/dist/modules/translation/utils' +import { EmotePlayMode } from '@dcl/schemas' +import { getBackgroundStyle } from 'modules/item/utils' +import { EmoteOutcome, Item } from 'modules/item/types' +import Icon from 'components/Icon' +import ItemProperties from 'components/ItemProperties' +import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' +import { createItemActions } from '../CreateSingleItemModal.reducer' +import CommonFields from '../CommonFields' +import { CreateItemView } from '../CreateSingleItemModal.types' + +/** + * Gets play mode options for emotes + */ +export const getPlayModeOptions = () => { + const playModes: string[] = [EmotePlayMode.SIMPLE, EmotePlayMode.LOOP] + + return playModes.map(value => ({ + value, + text: t(`emote.play_mode.${value}.text`), + description: t(`emote.play_mode.${value}.description`) + })) +} + +const PlayModeSelectField: React.FC<{ + value: string + onChange: DropdownProps['onChange'] +}> = ({ value, onChange }) => { + return ( + + ) +} + +const OutcomeHeader: React.FC<{ + outcomeIndex: number + onDeleteOutcome: (outcomeIndex: number) => () => void +}> = ({ outcomeIndex, onDeleteOutcome }) => { + const canDelete = outcomeIndex > 0 + return ( +
+ Outcome {outcomeIndex + 1} + {canDelete ? ( + + ) : null} +
+ ) +} + +const OutcomeField: React.FC<{ + outcome: EmoteOutcome + outcomeIndex: number + isLoading: boolean + shouldShowRandomizeOutcome: boolean + onAnimationChange: (outcomeIndex: number) => (event: React.ChangeEvent, props: any) => void + onPlayModeChange: (outcomeIndex: number) => (event: React.SyntheticEvent, data: DropdownProps) => void + onToggleRandom: (outcomeIndex: number) => () => void + onDeleteOutcome: (outcomeIndex: number) => () => void +}> = ({ + outcome, + outcomeIndex, + shouldShowRandomizeOutcome, + isLoading, + onAnimationChange, + onPlayModeChange, + onToggleRandom, + onDeleteOutcome +}) => { + return ( + } borderless> + + + + {shouldShowRandomizeOutcome ? ( + + ) : null} + + + ) +} + +const OutcomesSection: React.FC<{ + outcomes: EmoteOutcome[] + isLoading: boolean + onAnimationChange: (outcomeIndex: number) => (event: React.ChangeEvent, props: any) => void + onPlayModeChange: (outcomeIndex: number) => (event: React.SyntheticEvent, data: DropdownProps) => void + onToggleRandom: (outcomeIndex: number) => () => void + onAddOutcome: () => void + onDeleteOutcome: (outcomeIndex: number) => () => void +}> = ({ outcomes, isLoading, onAnimationChange, onPlayModeChange, onToggleRandom, onAddOutcome, onDeleteOutcome }) => { + const canAddMore = outcomes.length < 4 + const shouldShowRandomizeOutcome = outcomes.length > 1 + return ( +
+
Outcomes
+ {outcomes.map((outcome, index) => ( + + ))} + {canAddMore && ( + + + + )} +
+ ) +} + +export const EmoteDetails: React.FC = () => { + const { + state, + renderModalTitle, + handleOpenThumbnailDialog, + handleThumbnailChange, + thumbnailInput, + dispatch, + isLoading, + handleSubmit, + isDisabled + } = useCreateSingleItemModal() + const { contents, metrics, thumbnail, rarity, playMode = '', outcomes = [], hasScreenshotTaken } = state + const title = renderModalTitle() + const thumbnailStyle = getBackgroundStyle(rarity) + + const handlePlayModeChange = useCallback( + (_event: React.SyntheticEvent, data: DropdownProps) => { + const value = data.value as EmotePlayMode + dispatch(createItemActions.setPlayMode(value)) + }, + [dispatch] + ) + + const handleOutcomeAnimationNameChange = useCallback( + (outcomeIndex: number) => (_event: React.ChangeEvent, props: any) => { + dispatch( + createItemActions.setOutcomes(prevOutcomes => { + const newOutcomes = [...prevOutcomes] + newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], animation: props.value } + return newOutcomes + }) + ) + }, + [dispatch] + ) + + const handleOutcomePlayModeChange = useCallback( + (outcomeIndex: number) => (_event: React.SyntheticEvent, data: DropdownProps) => { + dispatch( + createItemActions.setOutcomes(prevOutcomes => { + const newOutcomes = [...prevOutcomes] + newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], loop: data.value === EmotePlayMode.LOOP } + return newOutcomes + }) + ) + }, + [dispatch] + ) + + const handleToggleRandomOutcome = useCallback( + (outcomeIndex: number) => () => { + dispatch( + createItemActions.setOutcomes(prevOutcomes => { + const newOutcomes = [...prevOutcomes] + newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], randomize: !newOutcomes[outcomeIndex].randomize } + return newOutcomes + }) + ) + }, + [dispatch] + ) + + const handleAddOutcome = useCallback(() => { + dispatch( + createItemActions.setOutcomes(prevOutcomes => { + if (prevOutcomes.length < 4) { + const newOutcome: EmoteOutcome = { + animation: '', + loop: false, + randomize: false + } + return [...prevOutcomes, newOutcome] + } + return prevOutcomes + }) + ) + }, [dispatch]) + + const handleDeleteOutcome = useCallback( + (outcomeIndex: number) => () => { + dispatch( + createItemActions.setOutcomes(prevOutcomes => { + const newOutcomes = [...prevOutcomes] + newOutcomes.splice(outcomeIndex, 1) + return newOutcomes + }) + ) + }, + [dispatch] + ) + + const handleClickSave = useCallback(() => { + if (hasScreenshotTaken) { + handleSubmit() + } else { + dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) + handleOpenThumbnailDialog() + } + }, [hasScreenshotTaken, handleSubmit, handleOpenThumbnailDialog]) + + return ( + <> + + + + +
+ {title} + + +
+ {metrics ? : null} +
+ + + {outcomes.length > 0 ? ( + + ) : ( + + )} + +
+
+ } /> +
+
+
+ + + + + + + ) +} + +export default React.memo(EmoteDetails) From 28dcf2c48c595afec20ace3caa50c7995ff8dc40 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Sun, 7 Sep 2025 01:17:54 -0300 Subject: [PATCH 08/48] fix: Add missing import --- .../CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx index 50e42806f..30bf0bffd 100644 --- a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx @@ -1,5 +1,5 @@ import React, { useCallback } from 'react' -import { Row, Column, Section, Header, Icon } from 'decentraland-ui' +import { Row, Column, Section, Header, Icon, Button } from 'decentraland-ui' import { t } from 'decentraland-dapps/dist/modules/translation/utils' import { BodyShapeType, ItemType, Item } from 'modules/item/types' import { getBackgroundStyle } from 'modules/item/utils' From fe31c3c043189f73f24e04584419ec62ac339e74 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 17 Sep 2025 15:59:14 -0300 Subject: [PATCH 09/48] fix: Send outcomes for Social Emotes --- package-lock.json | 568 +++++-- .../CreateSingleItemModal/CommonFields.tsx | 4 +- ...t.tsx => CreateSingleItemModal.context.ts} | 17 +- .../CreateSingleItemModal.original.tsx | 1499 ----------------- .../CreateSingleItemModal.tsx | 50 +- .../CreateSingleItemModalProvider.tsx | 11 + .../ItemDetailsStep/EmoteDetails.tsx | 184 +- .../ItemDetailsStep/ItemDetailsStep.tsx | 2 +- .../ItemDetailsStep/SmartWearableDetails.tsx | 2 +- .../ItemDetailsStep/WearableDetails.tsx | 2 +- src/lib/getModelData.ts | 8 +- src/modules/item/types.ts | 17 +- src/modules/models/types.ts | 3 +- 13 files changed, 513 insertions(+), 1854 deletions(-) rename src/components/Modals/CreateSingleItemModal/{CreateSingleItemModal.context.tsx => CreateSingleItemModal.context.ts} (71%) delete mode 100644 src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx create mode 100644 src/components/Modals/CreateSingleItemModal/CreateSingleItemModalProvider.tsx diff --git a/package-lock.json b/package-lock.json index 15a10d4ec..5caca7862 100644 --- a/package-lock.json +++ b/package-lock.json @@ -712,19 +712,6 @@ "node": ">=4" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", @@ -1011,22 +998,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1168,26 +1139,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", @@ -7625,6 +7576,7 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -7643,6 +7595,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -7808,7 +7761,8 @@ "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9212,6 +9166,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9221,22 +9176,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -9244,12 +9203,14 @@ "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -9257,12 +9218,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9274,6 +9237,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -9282,6 +9246,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -9289,12 +9254,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9310,6 +9277,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9322,6 +9290,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9333,6 +9302,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -9346,6 +9316,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -9359,6 +9330,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -9475,12 +9447,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/abab": { "version": "2.0.6", @@ -9991,6 +9965,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9999,6 +9974,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10007,6 +9983,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10044,6 +10021,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10057,6 +10035,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -10067,7 +10046,8 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -10086,6 +10066,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10100,6 +10081,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, "funding": [ { "type": "individual", @@ -10134,6 +10116,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -10571,6 +10554,7 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -10596,6 +10580,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -10607,6 +10592,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10729,7 +10715,8 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, "node_modules/bn.js": { "version": "5.2.1", @@ -10796,6 +10783,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -10806,6 +10794,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -10817,6 +10806,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -10826,6 +10816,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -10845,6 +10836,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "dependencies": { "pako": "~1.0.5" } @@ -10992,7 +10984,8 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true }, "node_modules/cac": { "version": "6.7.14", @@ -11007,6 +11000,7 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -11029,6 +11023,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11037,12 +11032,14 @@ "node_modules/cacache/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, "node_modules/cacache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11062,6 +11059,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11073,6 +11071,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11084,6 +11083,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -11211,6 +11211,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -11302,6 +11303,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -11564,6 +11566,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -11721,7 +11724,8 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/component-classes": { "version": "1.2.6", @@ -11735,6 +11739,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -11768,6 +11773,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "engines": [ "node >= 0.8" ], @@ -11781,12 +11787,14 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11800,12 +11808,14 @@ "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -11890,7 +11900,8 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -11901,7 +11912,8 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -11931,6 +11943,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -11943,12 +11956,14 @@ "node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/copy-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11958,6 +11973,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11977,6 +11993,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11988,6 +12005,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11999,6 +12017,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12107,6 +12126,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -12115,7 +12135,8 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", @@ -12203,6 +12224,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -12283,7 +12305,8 @@ "node_modules/cyclist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true }, "node_modules/d": { "version": "1.0.2", @@ -12701,20 +12724,6 @@ "node": ">= 4" } }, - "node_modules/decentraland-dapps/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/decentraland-dapps/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -12972,6 +12981,18 @@ } } }, + "node_modules/decentraland-ui/node_modules/@dcl/schemas": { + "version": "18.5.2", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-18.5.2.tgz", + "integrity": "sha512-M66R114SEAwLzm/I4JfYCVJ7EbTxvclXEkQBvvco1zz+NJ4OYaseM29wrUv2FOeJHIZvi/fbn3phQaVuv4/DRA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-keywords": "^5.1.0", + "mitt": "^3.0.1" + } + }, "node_modules/decentraland-ui/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -13193,6 +13214,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13252,6 +13274,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -13352,6 +13375,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -13361,7 +13385,8 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -13614,6 +13639,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -13644,6 +13670,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, "dependencies": { "prr": "~1.0.1" }, @@ -14043,6 +14070,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -14054,6 +14082,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -14509,6 +14538,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -14526,6 +14556,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14533,7 +14564,8 @@ "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/expand-template": { "version": "1.1.1", @@ -14568,6 +14600,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -14579,6 +14612,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -14597,6 +14631,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -14608,6 +14643,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -14781,7 +14817,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported." + "deprecated": "This module is no longer supported.", + "dev": true }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -14843,6 +14880,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -14856,6 +14894,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -14867,6 +14906,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14879,6 +14919,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -14891,6 +14932,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -14905,6 +14947,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -14916,6 +14959,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, "engines": { "node": ">=4" } @@ -14924,6 +14968,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, "engines": { "node": ">=6" } @@ -14932,6 +14977,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -14943,6 +14989,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -15012,6 +15059,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -15020,12 +15068,14 @@ "node_modules/flush-write-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/flush-write-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15039,12 +15089,14 @@ "node_modules/flush-write-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/flush-write-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15080,6 +15132,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15149,6 +15202,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, "dependencies": { "map-cache": "^0.2.2" }, @@ -15160,6 +15214,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -15168,12 +15223,14 @@ "node_modules/from2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15187,12 +15244,14 @@ "node_modules/from2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/from2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15219,6 +15278,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -15229,12 +15289,14 @@ "node_modules/fs-write-stream-atomic/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15248,12 +15310,14 @@ "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15367,6 +15431,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15660,6 +15725,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -15673,6 +15739,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -15685,6 +15752,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15696,6 +15764,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15707,6 +15776,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15888,7 +15958,8 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -15981,7 +16052,8 @@ "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true }, "node_modules/ignore": { "version": "5.3.0", @@ -16072,6 +16144,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -16087,7 +16160,8 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true }, "node_modules/inflight": { "version": "1.0.6", @@ -16428,6 +16502,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16508,7 +16583,8 @@ "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", @@ -16536,6 +16612,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16561,6 +16638,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16587,6 +16665,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16949,6 +17028,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18302,7 +18382,8 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -18651,6 +18732,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -18659,6 +18741,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18672,6 +18755,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -18848,6 +18932,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -18856,6 +18941,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -18907,6 +18993,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18915,6 +19002,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, "dependencies": { "object-visit": "^1.0.0" }, @@ -18945,6 +19033,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -18956,12 +19045,14 @@ "node_modules/memory-fs/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/memory-fs/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18975,12 +19066,14 @@ "node_modules/memory-fs/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/memory-fs/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19034,6 +19127,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -19045,7 +19139,8 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/mime": { "version": "3.0.0", @@ -19157,6 +19252,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -19177,6 +19273,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -19187,12 +19284,14 @@ "node_modules/mississippi/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/mississippi/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19206,12 +19305,14 @@ "node_modules/mississippi/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/mississippi/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19225,6 +19326,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -19237,6 +19339,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19316,6 +19419,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -19328,12 +19432,14 @@ "node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/move-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19343,6 +19449,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19362,6 +19469,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19373,6 +19481,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -19657,6 +19766,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -19674,6 +19784,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -19695,6 +19806,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -19707,6 +19819,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -19719,6 +19832,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -19731,6 +19845,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19747,7 +19862,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/next-tick": { "version": "1.1.0", @@ -19850,6 +19966,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -19880,6 +19997,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" @@ -19889,6 +20007,7 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -19897,6 +20016,7 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -19907,6 +20027,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -19915,27 +20036,32 @@ "node_modules/node-libs-browser/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true }, "node_modules/node-libs-browser/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19949,12 +20075,14 @@ "node_modules/node-libs-browser/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/node-libs-browser/node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -19964,6 +20092,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -19976,6 +20105,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19983,12 +20113,14 @@ "node_modules/node-libs-browser/node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true }, "node_modules/node-libs-browser/node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -20167,6 +20299,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -20180,6 +20313,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -20231,6 +20365,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, "dependencies": { "isobject": "^3.0.0" }, @@ -20259,6 +20394,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -20376,7 +20512,8 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true }, "node_modules/os-homedir": { "version": "1.0.2", @@ -20478,6 +20615,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -20487,12 +20625,14 @@ "node_modules/parallel-transform/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20506,12 +20646,14 @@ "node_modules/parallel-transform/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/parallel-transform/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20531,6 +20673,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -20583,6 +20726,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20597,6 +20741,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, "optional": true }, "node_modules/path-exists": { @@ -20899,6 +21044,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20907,6 +21053,7 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -21135,6 +21282,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -21148,6 +21296,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -21158,7 +21307,8 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/process": { "version": "0.11.10", @@ -21212,7 +21362,8 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true }, "node_modules/prompts": { "version": "2.4.2", @@ -21314,7 +21465,8 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true }, "node_modules/psl": { "version": "1.9.0", @@ -21326,6 +21478,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21338,7 +21491,8 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/pull-batch": { "version": "1.0.0", @@ -21435,6 +21589,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -21445,6 +21600,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -21455,12 +21611,14 @@ "node_modules/pumpify/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21470,6 +21628,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -21483,12 +21642,14 @@ "node_modules/pumpify/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/pumpify/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -21676,6 +21837,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, "engines": { "node": ">=0.4.x" } @@ -21854,6 +22016,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -22574,6 +22737,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -22586,6 +22750,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -22598,6 +22763,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -22625,12 +22791,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, "optional": true }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -22639,6 +22807,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, "engines": { "node": ">=0.10" } @@ -22742,7 +22911,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true }, "node_modules/resolve.exports": { "version": "2.0.2", @@ -22757,6 +22927,7 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, "engines": { "node": ">=0.12" } @@ -23020,6 +23191,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, "dependencies": { "aproba": "^1.1.1" } @@ -23027,7 +23199,8 @@ "node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/rxjs": { "version": "7.8.1", @@ -23061,6 +23234,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, "dependencies": { "ret": "~0.1.10" } @@ -23077,7 +23251,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/saxes": { "version": "6.0.0", @@ -23253,6 +23428,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -23294,6 +23470,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -23461,6 +23638,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -23479,6 +23657,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -23492,6 +23671,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -23503,6 +23683,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -23515,6 +23696,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "dependencies": { "kind-of": "^3.2.0" }, @@ -23526,6 +23708,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -23537,6 +23720,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23544,7 +23728,8 @@ "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/socket.io-client": { "version": "4.7.4", @@ -23584,7 +23769,8 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "node_modules/source-map": { "version": "0.5.7", @@ -23598,6 +23784,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -23607,6 +23794,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -23619,6 +23807,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, "engines": { "node": ">=0.10" } @@ -23627,6 +23816,7 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23636,6 +23826,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -23644,7 +23835,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true }, "node_modules/sourcemap-codec": { "version": "1.4.8", @@ -23680,6 +23872,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -23691,6 +23884,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -23703,6 +23897,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -23729,6 +23924,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" } @@ -23775,6 +23971,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -23822,6 +24019,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -24074,6 +24272,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, "engines": { "node": ">=6" } @@ -24251,6 +24450,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -24273,6 +24473,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24288,6 +24489,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -24296,6 +24498,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -24304,6 +24507,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, "engines": { "node": ">=4" } @@ -24311,12 +24515,14 @@ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -24330,6 +24536,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -24338,6 +24545,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -24464,6 +24672,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -24472,12 +24681,14 @@ "node_modules/through2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24491,12 +24702,14 @@ "node_modules/through2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -24513,6 +24726,7 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -24551,7 +24765,8 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true }, "node_modules/to-buffer": { "version": "1.1.1", @@ -24572,6 +24787,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -24583,6 +24799,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -24603,6 +24820,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -24628,6 +24846,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -24640,6 +24859,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -24652,6 +24872,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -24664,6 +24885,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -25225,7 +25447,8 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -25391,6 +25614,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -25405,6 +25629,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -25413,6 +25638,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -25429,6 +25655,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -25441,6 +25668,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -25454,6 +25682,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, "dependencies": { "isarray": "1.0.0" }, @@ -25465,6 +25694,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -25472,7 +25702,8 @@ "node_modules/unset-value/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/unstorage": { "version": "1.12.0", @@ -25572,6 +25803,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, "optional": true, "engines": { "node": ">=4", @@ -25626,12 +25858,14 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true }, "node_modules/url": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -25738,12 +25972,14 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -26374,7 +26610,8 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -26409,6 +26646,7 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -26422,6 +26660,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -26431,6 +26670,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -26441,6 +26681,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -26453,6 +26694,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -26462,6 +26704,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -26484,6 +26727,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -26506,6 +26750,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.2", @@ -26519,6 +26764,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -26535,6 +26781,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -26552,6 +26799,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -26562,6 +26810,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -26574,6 +26823,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -26586,6 +26836,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", @@ -26599,6 +26850,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" @@ -26611,6 +26863,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -26623,6 +26876,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" @@ -26635,12 +26889,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", @@ -26665,6 +26921,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -26678,6 +26935,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "optional": true, "dependencies": { "core-util-is": "~1.0.0", @@ -26693,6 +26951,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -26707,12 +26966,14 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "optional": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -26722,6 +26983,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -26923,6 +27185,7 @@ "version": "4.47.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -26971,6 +27234,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -26980,6 +27244,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -26988,6 +27253,7 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -26999,6 +27265,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -27014,6 +27281,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -27022,6 +27290,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -27030,6 +27299,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -27050,6 +27320,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -27062,6 +27333,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -27074,6 +27346,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -27082,6 +27355,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -27096,6 +27370,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -27108,6 +27383,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -27119,6 +27395,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -27130,6 +27407,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -27140,17 +27418,20 @@ "node_modules/webpack/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/webpack/node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -27160,6 +27441,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -27183,6 +27465,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -27195,6 +27478,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -27208,12 +27492,14 @@ "node_modules/webpack/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -27227,6 +27513,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -27235,6 +27522,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -27427,6 +27715,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, "dependencies": { "errno": "~0.1.7" } @@ -27617,7 +27906,8 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", diff --git a/src/components/Modals/CreateSingleItemModal/CommonFields.tsx b/src/components/Modals/CreateSingleItemModal/CommonFields.tsx index 0ad9b504b..87265cd13 100644 --- a/src/components/Modals/CreateSingleItemModal/CommonFields.tsx +++ b/src/components/Modals/CreateSingleItemModal/CommonFields.tsx @@ -18,7 +18,7 @@ const RARITIES_LINK = 'https://docs.decentraland.org/creator/wearables-and-emote const defaultMapping: Mapping = { type: MappingType.ANY } -export const CommonFields: React.FC = () => { +export const CommonFields = () => { const { state, collection, isThirdPartyV2Enabled, isLoading, dispatch } = useCreateSingleItemModal() // Field handlers - moved from main modal to here since they're only used in CommonFields @@ -169,4 +169,4 @@ export const CommonFields: React.FC = () => { ) } -export default CommonFields +export default React.memo(CommonFields) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.ts similarity index 71% rename from src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.tsx rename to src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.ts index 43b16c4c5..01499f531 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.context.ts @@ -1,10 +1,10 @@ -import React, { createContext, useContext, ReactNode } from 'react' +import React, { createContext, useContext } from 'react' import { Item, SyncStatus } from 'modules/item/types' import { State, CreateSingleItemModalMetadata } from './CreateSingleItemModal.types' import { CreateItemAction } from './CreateSingleItemModal.reducer' import { Collection } from 'modules/collection/types' -interface CreateSingleItemModalContextValue { +export interface CreateSingleItemModalContextValue { // State state: State collection: Collection | null @@ -42,16 +42,7 @@ interface CreateSingleItemModalContextValue { isAddingRepresentation: boolean } -const CreateSingleItemModalContext = createContext(undefined) - -interface CreateSingleItemModalProviderProps { - children: ReactNode - value: CreateSingleItemModalContextValue -} - -export const CreateSingleItemModalProvider: React.FC = ({ children, value }) => { - return {children} -} +export const CreateSingleItemModalContext = createContext(undefined) export const useCreateSingleItemModal = (): CreateSingleItemModalContextValue => { const context = useContext(CreateSingleItemModalContext) @@ -60,5 +51,3 @@ export const useCreateSingleItemModal = (): CreateSingleItemModalContextValue => } return context } - -export default CreateSingleItemModalContext diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx deleted file mode 100644 index 853d803ec..000000000 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.original.tsx +++ /dev/null @@ -1,1499 +0,0 @@ -import React, { useReducer, useRef, useCallback, useMemo } from 'react' -import { ethers } from 'ethers' -import { - BodyPartCategory, - BodyShape, - EmoteCategory, - EmoteDataADR74, - Rarity, - PreviewProjection, - WearableCategory, - Mapping, - MappingType, - ContractNetwork, - ContractAddress -} from '@dcl/schemas' -import { - MAX_EMOTE_FILE_SIZE, - MAX_SKIN_FILE_SIZE, - MAX_THUMBNAIL_FILE_SIZE, - MAX_WEARABLE_FILE_SIZE, - MAX_SMART_WEARABLE_FILE_SIZE -} from '@dcl/builder-client/dist/files/constants' - -import { - ModalNavigation, - Row, - Column, - Button, - Form, - Field, - Icon as DCLIcon, - Section, - Header, - InputOnChangeData, - SelectField, - DropdownProps, - WearablePreview, - Message -} from 'decentraland-ui' -import { t } from 'decentraland-dapps/dist/modules/translation/utils' -import Modal from 'decentraland-dapps/dist/containers/Modal' -import { isErrorWithMessage } from 'decentraland-dapps/dist/lib/error' -import { getImageType, dataURLToBlob, convertImageIntoWearableThumbnail } from 'modules/media/utils' -import { ImageType } from 'modules/media/types' -import { - THUMBNAIL_PATH, - Item, - BodyShapeType, - ITEM_NAME_MAX_LENGTH, - WearableRepresentation, - ItemType, - EmotePlayMode, - VIDEO_PATH, - WearableData, - SyncStatus -} from 'modules/item/types' -import { Metrics } from 'modules/models/types' -import { computeHashes } from 'modules/deployment/contentUtils' -import { - getBodyShapeType, - getMissingBodyShapeType, - getWearableCategories, - getBackgroundStyle, - isImageFile, - resizeImage, - getEmoteCategories, - getEmotePlayModes, - getBodyShapeTypeFromContents, - isSmart, - isWearable, - buildItemMappings, - isEmoteFileSizeValid, - isSkinFileSizeValid, - isSmartWearableFileSizeValid, - isWearableFileSizeValid -} from 'modules/item/utils' -import { EngineType, getItemData, getModelData } from 'lib/getModelData' -import { getExtension, toMB } from 'lib/file' -import { - getDefaultThirdPartyUrnSuffix, - buildThirdPartyURN, - DecodedURN, - decodeURN, - isThirdParty, - isThirdPartyCollectionDecodedUrn -} from 'lib/urn' -import ItemDropdown from 'components/ItemDropdown' -import Icon from 'components/Icon' -import ItemVideo from 'components/ItemVideo' -import ItemRequiredPermission from 'components/ItemRequiredPermission' -import ItemProperties from 'components/ItemProperties' -import { Collection } from 'modules/collection/types' -import { LinkedContract } from 'modules/thirdParty/types' -import { calculateFileSize, calculateModelFinalSize } from 'modules/item/export' -import { MAX_THUMBNAIL_SIZE } from 'modules/assetPack/utils' -import { areMappingsValid } from 'modules/thirdParty/utils' -import { Authorization } from 'lib/api/auth' -import { MappingEditor } from 'components/MappingEditor' -import { BUILDER_SERVER_URL, BuilderAPI } from 'lib/api/builder' -import EditPriceAndBeneficiaryModal from '../EditPriceAndBeneficiaryModal' -import ImportStep from './ImportStep/ImportStep' -import EditThumbnailStep from './EditThumbnailStep/EditThumbnailStep' -import UploadVideoStep from './UploadVideoStep/UploadVideoStep' -import { getThumbnailType, toEmoteWithBlobs, toWearableWithBlobs } from './utils' -import { createItemReducer, createItemActions } from './CreateSingleItemModal.reducer' -import { - Props, - State, - CreateItemView, - CreateSingleItemModalMetadata, - StateData, - SortedContent, - AcceptedFileProps - // ITEM_LOADED_CHECK_DELAY -} from './CreateSingleItemModal.types' -import './CreateSingleItemModal.css' - -const defaultMapping: Mapping = { type: MappingType.ANY } - -/** - * Prefixes the content name by adding the adding the body shape name to it. - * - * @param bodyShape - The body shaped used to prefix the content name. - * @param contentKey - The content key or name to be prefixed. - */ -const prefixContentName = (bodyShape: BodyShapeType, contentKey: string): string => { - return `${bodyShape}/${contentKey}` -} - -/** - * Creates a new contents record with the names of the contents blobs record prefixed. - * The names need to be prefixed so they won't collide with other - * pre-uploaded models. The name of the content is the name of the uploaded file. - * - * @param bodyShape - The body shaped used to prefix the content names. - * @param contents - The contents which keys are going to be prefixed. - */ -const prefixContents = (bodyShape: BodyShapeType, contents: Record): Record => { - return Object.keys(contents).reduce((newContents: Record, key: string) => { - // Do not include the thumbnail, scenes, and video in each of the body shapes - if ([THUMBNAIL_PATH, VIDEO_PATH].includes(key)) { - return newContents - } - newContents[prefixContentName(bodyShape, key)] = contents[key] - return newContents - }, {}) -} - -/** - * Sorts the content into "male", "female" and "all" taking into consideration the body shape. - * All contains the item thumbnail and both male and female representations according to the shape. - * If the body representation is male, "female" will be an empty object and viceversa. - * - * @param bodyShape - The body shaped used to sort the content. - * @param contents - The contents to be sorted. - */ -const sortContent = (bodyShape: BodyShapeType, contents: Record): SortedContent => { - const male = bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, contents) : {} - const female = - bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, contents) : {} - - const all: Record = { - [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], - ...male, - ...female - } - - if (contents[VIDEO_PATH]) { - all[VIDEO_PATH] = contents[VIDEO_PATH] - } - - return { male, female, all } -} - -const sortContentZipBothBodyShape = (bodyShape: BodyShapeType, contents: Record): SortedContent => { - let male: Record = {} - let female: Record = {} - const both: Record = {} - - for (const [key, value] of Object.entries(contents)) { - if (key.startsWith('male/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE)) { - male[key] = value - } else if (key.startsWith('female/') && (bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE)) { - female[key] = value - } else { - both[key] = value - } - } - - male = { - ...male, - ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.MALE ? prefixContents(BodyShapeType.MALE, both) : {}) - } - - female = { - ...female, - ...(bodyShape === BodyShapeType.BOTH || bodyShape === BodyShapeType.FEMALE ? prefixContents(BodyShapeType.FEMALE, both) : {}) - } - - const all = { - [THUMBNAIL_PATH]: contents[THUMBNAIL_PATH], - ...male, - ...female - } - - return { male, female, all } -} - -const buildRepresentations = (bodyShape: BodyShapeType, model: string, contents: SortedContent): WearableRepresentation[] => { - const representations: WearableRepresentation[] = [] - - // add male representation - if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.MALE], - mainFile: prefixContentName(BodyShapeType.MALE, model), - contents: Object.keys(contents.male), - overrideHides: [], - overrideReplaces: [] - }) - } - - // add female representation - if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.FEMALE], - mainFile: prefixContentName(BodyShapeType.FEMALE, model), - contents: Object.keys(contents.female), - overrideHides: [], - overrideReplaces: [] - }) - } - - return representations -} - -const buildRepresentationsZipBothBodyshape = (bodyShape: BodyShapeType, contents: SortedContent): WearableRepresentation[] => { - const representations: WearableRepresentation[] = [] - - // add male representation - if (bodyShape === BodyShapeType.MALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.MALE], - mainFile: Object.keys(contents.male).find(content => content.includes('glb'))!, - contents: Object.keys(contents.male), - overrideHides: [], - overrideReplaces: [] - }) - } - - // add female representation - if (bodyShape === BodyShapeType.FEMALE || bodyShape === BodyShapeType.BOTH) { - representations.push({ - bodyShapes: [BodyShape.FEMALE], - mainFile: Object.keys(contents.female).find(content => content.includes('glb'))!, - contents: Object.keys(contents.female), - overrideHides: [], - overrideReplaces: [] - }) - } - - return representations -} - -const getDefaultMappings = ( - contract: LinkedContract | undefined, - isThirdPartyV2Enabled: boolean -): Partial>> | undefined => { - if (!isThirdPartyV2Enabled || !contract) { - return undefined - } - - return { - [contract.network]: { - [contract.address]: [defaultMapping] - } - } -} - -const getLinkedContract = (collection: Collection | undefined | null): LinkedContract | undefined => { - if (!collection?.linkedContractAddress || !collection?.linkedContractNetwork) { - return undefined - } - - return { - address: collection.linkedContractAddress, - network: collection.linkedContractNetwork - } -} - -const getPlayModeOptions = () => { - const playModes: string[] = getEmotePlayModes() - - return playModes.map(value => ({ - value, - text: t(`emote.play_mode.${value}.text`), - description: t(`emote.play_mode.${value}.description`) - })) -} - -export const CreateSingleItemModal: React.FC = props => { - const { address, collection, error, itemStatus, metadata, name, onClose, onSave, isLoading, isThirdPartyV2Enabled } = props - const thumbnailInput = useRef(null) - const modalContainer = useRef(null) - - const getInitialState = useCallback((): State => { - const state: State = { - view: CreateItemView.IMPORT, - playMode: EmotePlayMode.SIMPLE, - weareblePreviewUpdated: false, - hasScreenshotTaken: false - } - - if (!metadata) { - return state - } - - const { collectionId, item, addRepresentation } = metadata as CreateSingleItemModalMetadata - state.collectionId = collectionId - const contract = collection ? getLinkedContract(collection) : undefined - - if (item) { - state.id = item.id - state.name = item.name - state.description = item.description - state.item = item - state.type = item.type - state.collectionId = item.collectionId - state.bodyShape = getBodyShapeType(item) - state.category = item.data.category - state.rarity = item.rarity - state.isRepresentation = false - state.mappings = item.mappings ?? getDefaultMappings(contract, isThirdPartyV2Enabled) - - if (addRepresentation) { - const missingBodyShape = getMissingBodyShapeType(item) - if (missingBodyShape) { - state.bodyShape = missingBodyShape - state.isRepresentation = true - } - } - } else { - state.mappings = getDefaultMappings(contract, isThirdPartyV2Enabled) - } - - return state - }, [collection, metadata, isThirdPartyV2Enabled]) - - const [state, dispatch] = useReducer(createItemReducer, getInitialState()) - - const createItem = useCallback( - async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { - id, - name, - description, - type, - metrics, - collectionId, - category, - playMode, - rarity, - hasScreenshotTaken, - requiredPermissions, - tags, - blockVrmExport, - mappings - } = state as StateData - - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection?.urn) - // If it's a third party item, we need to automatically create an URN for it by generating a random uuid different from the id - const decodedCollectionUrn: DecodedURN | null = collection?.urn ? decodeURN(collection.urn) : null - let urn: string | undefined - if (decodedCollectionUrn && isThirdPartyCollectionDecodedUrn(decodedCollectionUrn)) { - urn = buildThirdPartyURN( - decodedCollectionUrn.thirdPartyName, - decodedCollectionUrn.thirdPartyCollectionId, - getDefaultThirdPartyUrnSuffix(name) - ) - } - - // create item to save - let data: WearableData | EmoteDataADR74 - - if (type === ItemType.WEARABLE) { - const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] - data = { - category: category as WearableCategory, - replaces: [], - hides: [], - removesDefaultHiding, - tags: tags || [], - representations: [...representations], - requiredPermissions: requiredPermissions || [], - blockVrmExport: blockVrmExport ?? false, - outlineCompatible: true // it's going to be true for all the items. It can be deactivated later in the editor view - } as WearableData - } else { - data = { - category: category as EmoteCategory, - loop: playMode === EmotePlayMode.LOOP, - tags: tags || [], - representations: [...representations] - } as EmoteDataADR74 - } - - const contents = await computeHashes(sortedContents.all) - - const item: Item = { - id, - name, - urn, - description: description || '', - thumbnail: THUMBNAIL_PATH, - video: contents[VIDEO_PATH], - type, - collectionId, - totalSupply: 0, - isPublished: false, - isApproved: false, - inCatalyst: false, - blockchainContentHash: null, - currentContentHash: null, - catalystContentHash: null, - rarity: belongsToAThirdPartyCollection ? Rarity.UNIQUE : rarity, - data, - owner: address!, - metrics, - contents, - mappings: belongsToAThirdPartyCollection && mappings ? mappings : null, - createdAt: +new Date(), - updatedAt: +new Date() - } - - // If it's a Third Party Item, don't prompt the user with the SET PRICE view - if ((hasScreenshotTaken || type !== ItemType.EMOTE) && belongsToAThirdPartyCollection) { - item.price = '0' - item.beneficiary = ethers.constants.AddressZero - return onSave(item as Item, sortedContents.all) - } - - if (hasScreenshotTaken || type !== ItemType.EMOTE) { - item.price = ethers.constants.MaxUint256.toString() - item.beneficiary = item.beneficiary || address - return onSave(item as Item, sortedContents.all) - } - - dispatch(createItemActions.setItem(item as Item)) - dispatch(createItemActions.setItemSortedContents(sortedContents.all)) - dispatch(createItemActions.setView(CreateItemView.THUMBNAIL)) - dispatch(createItemActions.setFromView(CreateItemView.THUMBNAIL)) - }, - [address, collection, state, onSave] - ) - - const addItemRepresentation = useCallback( - async (sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { bodyShape, item: editedItem, requiredPermissions } = state as StateData - const hashedContents = await computeHashes(bodyShape === BodyShapeType.MALE ? sortedContents.male : sortedContents.female) - if (isWearable(editedItem)) { - const removesDefaultHiding = - editedItem.data.category === WearableCategory.UPPER_BODY || editedItem.data.hides.includes(WearableCategory.UPPER_BODY) - ? [BodyPartCategory.HANDS] - : [] - const item = { - ...editedItem, - data: { - ...editedItem.data, - representations: [ - ...editedItem.data.representations, - // add new representation - ...representations - ], - replaces: [...editedItem.data.replaces], - hides: [...editedItem.data.hides], - removesDefaultHiding: removesDefaultHiding, - tags: [...editedItem.data.tags], - requiredPermissions: requiredPermissions || [], - blockVrmExport: editedItem.data.blockVrmExport, - outlineCompatible: editedItem.data.outlineCompatible || true // it's going to be true for all the items. It can be deactivated later in the editor view - }, - contents: { - ...editedItem.contents, - ...hashedContents - }, - updatedAt: +new Date() - } - - // Do not change the thumbnail when adding a new representation - delete sortedContents.all[THUMBNAIL_PATH] - onSave(item, sortedContents.all) - } - }, - [state, onSave] - ) - - const modifyItem = useCallback( - async (pristineItem: Item, sortedContents: SortedContent, representations: WearableRepresentation[]) => { - const { name, bodyShape, type, mappings, metrics, category, playMode, requiredPermissions } = state as StateData - - let data: WearableData | EmoteDataADR74 - - if (type === ItemType.WEARABLE) { - const removesDefaultHiding = category === WearableCategory.UPPER_BODY ? [BodyPartCategory.HANDS] : [] - data = { - ...pristineItem.data, - removesDefaultHiding, - category: category as WearableCategory, - requiredPermissions: requiredPermissions || [] - } as WearableData - } else { - data = { - ...pristineItem.data, - loop: playMode === EmotePlayMode.LOOP, - category: category as EmoteCategory - } as EmoteDataADR74 - } - - const contents = await computeHashes(sortedContents.all) - - const item = { - ...pristineItem, - data, - name, - metrics, - contents, - mappings, - updatedAt: +new Date() - } - - const wearableBodyShape = bodyShape === BodyShapeType.MALE ? BodyShape.MALE : BodyShape.FEMALE - const representationIndex = pristineItem.data.representations.findIndex( - (representation: WearableRepresentation) => representation.bodyShapes[0] === wearableBodyShape - ) - const pristineBodyShape = getBodyShapeType(pristineItem) - if (representations.length === 2 || representationIndex === -1 || pristineBodyShape === BodyShapeType.BOTH) { - // Unisex or Representation changed - item.data.representations = representations - } else { - // Edited representation - item.data.representations[representationIndex] = representations[0] - } - - if (itemStatus && [SyncStatus.UNPUBLISHED, SyncStatus.UNDER_REVIEW].includes(itemStatus) && isSmart(item) && VIDEO_PATH in contents) { - item.video = contents[VIDEO_PATH] - } - - onSave(item as Item, sortedContents.all) - }, - [itemStatus, state, onSave] - ) - - const isValid = useCallback((): boolean => { - const { - name, - thumbnail, - metrics, - bodyShape, - category, - playMode, - rarity, - item, - isRepresentation, - type, - modelSize, - mappings, - error: stateError - } = state - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) - const linkedContract = collection ? getLinkedContract(collection) : undefined - - if (stateError) { - dispatch(createItemActions.clearError()) - } - - let required: (string | Metrics | Item | undefined)[] - if (isRepresentation) { - required = [item as Item] - } else if (belongsToAThirdPartyCollection) { - required = [name, thumbnail, metrics, bodyShape, category] - } else if (type === ItemType.EMOTE) { - required = [name, thumbnail, metrics, category, playMode, rarity, type] - } else { - required = [name, thumbnail, metrics, bodyShape, category, rarity, type] - } - - const thumbnailBlob = thumbnail ? dataURLToBlob(thumbnail) : undefined - const thumbnailSize = thumbnailBlob ? calculateFileSize(thumbnailBlob) : 0 - - if (thumbnailSize && thumbnailSize > MAX_THUMBNAIL_SIZE) { - dispatch( - createItemActions.setError( - t('create_single_item_modal.error.thumbnail_file_too_big', { maxSize: `${toMB(MAX_THUMBNAIL_FILE_SIZE)}MB` }) - ) - ) - return false - } - const isSkin = category === WearableCategory.SKIN - const isEmote = type === ItemType.EMOTE - const isSmartWearable = isSmart({ type, contents: state.contents }) - const isRequirementMet = required.every(prop => prop !== undefined) - const finalSize = modelSize ? modelSize + thumbnailSize : undefined - - if (isThirdPartyV2Enabled && ((!mappings && linkedContract) || (mappings && !areMappingsValid(mappings)))) { - return false - } - - if (isRequirementMet && isEmote && finalSize && !isEmoteFileSizeValid(finalSize)) { - dispatch( - createItemActions.setError( - t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_EMOTE_FILE_SIZE)}MB`, - type: `emote` - }) - ) - ) - return false - } - - if (isRequirementMet && isSkin && finalSize && !isSkinFileSizeValid(finalSize)) { - dispatch( - createItemActions.setError( - t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_SKIN_FILE_SIZE)}MB`, - type: `skin` - }) - ) - ) - return false - } - - if (isRequirementMet && !isSkin && isSmartWearable && finalSize && !isSmartWearableFileSizeValid(finalSize)) { - dispatch( - createItemActions.setError( - t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_SMART_WEARABLE_FILE_SIZE)}MB`, - type: `smart wearable` - }) - ) - ) - return false - } - - if (isRequirementMet && !isSkin && !isSmartWearable && finalSize && !isWearableFileSizeValid(finalSize)) { - dispatch( - createItemActions.setError( - t('create_single_item_modal.error.item_too_big', { - size: `${toMB(MAX_WEARABLE_FILE_SIZE)}MB`, - type: `wearable` - }) - ) - ) - return false - } - return isRequirementMet - }, [collection, state, isThirdPartyV2Enabled]) - - const handleSubmit = useCallback(async () => { - const { id } = state - - let changeItemFile = false - let addRepresentation = false - let pristineItem: Item | null = null - - if (metadata) { - changeItemFile = metadata.changeItemFile - addRepresentation = metadata.addRepresentation - pristineItem = metadata.item - } - - if (id && isValid()) { - const { thumbnail, contents, bodyShape, type, model, isRepresentation, item: editedItem, video } = state as StateData - if (state.view === CreateItemView.DETAILS) { - try { - const blob = dataURLToBlob(thumbnail) - const hasCustomThumbnail = THUMBNAIL_PATH in contents - if (blob && !hasCustomThumbnail) { - contents[THUMBNAIL_PATH] = blob - } - - if (video) { - const videoBlob = dataURLToBlob(video) - const hasPreviewVideo = VIDEO_PATH in contents - if (videoBlob && !hasPreviewVideo) { - contents[VIDEO_PATH] = videoBlob - } - } - - const sortedContents = - type === ItemType.WEARABLE && getBodyShapeTypeFromContents(contents) === BodyShapeType.BOTH - ? sortContentZipBothBodyShape(bodyShape, contents) - : sortContent(bodyShape, contents) - const representations = - type === ItemType.WEARABLE && getBodyShapeTypeFromContents(contents) === BodyShapeType.BOTH - ? buildRepresentationsZipBothBodyshape(bodyShape, sortedContents) - : buildRepresentations(bodyShape, model, sortedContents) - - // Add this item as a representation of an existing item - if ((isRepresentation || addRepresentation) && editedItem) { - await addItemRepresentation(sortedContents, representations) - } else if (pristineItem && changeItemFile) { - await modifyItem(pristineItem, sortedContents, representations) - } else { - await createItem(sortedContents, representations) - } - } catch (error) { - dispatch(createItemActions.setError(isErrorWithMessage(error) ? error.message : 'Unknown error')) - } - } else if (!!state.item && !!state.itemSortedContents) { - const sortedContents = { - male: state.itemSortedContents, - female: state.itemSortedContents, - all: state.itemSortedContents - } - const representations = buildRepresentations(state.bodyShape!, state.model!, sortedContents) - await createItem(sortedContents, representations) - } - } - }, [metadata, state, addItemRepresentation, createItem, modifyItem, isValid]) - - const getMetricsAndScreenshot = useCallback(async () => { - const { type, previewController, model, contents, category, thumbnail } = state - if (type && model && contents) { - const data = await getItemData({ - wearablePreviewController: previewController, - type, - model, - contents, - category - }) - let view = CreateItemView.DETAILS - if (isSmart({ type, contents })) { - // TODO: await setTimeout(() => {}, ITEM_LOADED_CHECK_DELAY) - view = CreateItemView.UPLOAD_VIDEO - } - - dispatch(createItemActions.setMetrics(data.metrics)) - dispatch(createItemActions.setThumbnail(thumbnail ?? data.image)) - dispatch(createItemActions.setView(view)) - dispatch(createItemActions.setLoading(false)) - } - }, [state]) - - const handleDropAccepted = useCallback( - (acceptedFileProps: AcceptedFileProps) => { - const { bodyShape, ...acceptedProps } = acceptedFileProps - dispatch(createItemActions.setLoading(true)) - dispatch(createItemActions.setBodyShape(bodyShape || state.bodyShape || BodyShapeType.MALE)) - dispatch(createItemActions.setAcceptedProps(acceptedProps)) - }, - [state] - ) - - const handleVideoDropAccepted = useCallback((acceptedFileProps: AcceptedFileProps) => { - dispatch(createItemActions.setLoading(true)) - dispatch(createItemActions.setAcceptedProps(acceptedFileProps)) - }, []) - - const handleSaveVideo = useCallback(() => { - dispatch(createItemActions.setFromView(undefined)) - dispatch(createItemActions.setLoading(false)) - dispatch(createItemActions.setView(CreateItemView.DETAILS)) - }, []) - - const getMapping = useCallback((): Mapping => { - const { mappings } = state - const contract = getLinkedContract(collection) - if (!contract) { - return defaultMapping - } - - let mapping: Mapping | undefined - if (mappings) { - mapping = mappings[contract.network]?.[contract.address][0] - } else { - mapping = getDefaultMappings(contract, isThirdPartyV2Enabled)?.[contract.network]?.[contract.address][0] - } - - return mapping ?? defaultMapping - }, [collection, state, isThirdPartyV2Enabled]) - - const handleMappingChange = useCallback( - (mapping: Mapping) => { - const contract = getLinkedContract(collection) - if (!contract) { - return - } - dispatch(createItemActions.setMappings(buildItemMappings(mapping, contract))) - }, - [collection] - ) - - const handleNameChange = useCallback( - (_event: React.ChangeEvent, props: InputOnChangeData) => - dispatch(createItemActions.setName(props.value.slice(0, ITEM_NAME_MAX_LENGTH))), - [] - ) - - const handleItemChange = useCallback((item: Item) => { - dispatch(createItemActions.setItem(item)) - dispatch(createItemActions.setCategory(item.data.category as WearableCategory)) - dispatch(createItemActions.setRarity(item.rarity as Rarity)) - }, []) - - const handleCategoryChange = useCallback( - (_event: React.SyntheticEvent, { value }: DropdownProps) => { - const category = value as WearableCategory - const hasChangedThumbnailType = - (state.category && getThumbnailType(category) !== getThumbnailType(state.category as WearableCategory)) || !state.category - - if (state.category !== category) { - dispatch(createItemActions.setCategory(category)) - if (state.type === ItemType.WEARABLE && hasChangedThumbnailType) { - // As it's not required to wait for the promise, use the void operator to return undefined - void updateThumbnailByCategory(category) - } - } - }, - [state] - ) - - const handleRarityChange = useCallback((_event: React.SyntheticEvent, { value }: DropdownProps) => { - const rarity = value as Rarity - dispatch(createItemActions.setRarity(rarity)) - }, []) - - const handlePlayModeChange = useCallback((_event: React.SyntheticEvent, { value }: DropdownProps) => { - const playMode = value as EmotePlayMode - dispatch(createItemActions.setPlayMode(playMode)) - }, []) - - const handleOpenThumbnailDialog = useCallback(() => { - const { type } = state - if (type === ItemType.EMOTE) { - dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) - dispatch(createItemActions.setView(CreateItemView.THUMBNAIL)) - } else if (thumbnailInput.current) { - thumbnailInput.current.click() - } - }, [state, thumbnailInput]) - - const handleThumbnailChange = useCallback( - async (event: React.ChangeEvent) => { - const { contents } = state - const { files } = event.target - if (files && files.length > 0) { - const file = files[0] - const imageType = await getImageType(file) - if (imageType !== ImageType.PNG) { - dispatch(createItemActions.setError(t('create_single_item_modal.wrong_thumbnail_format'))) - return - } - dispatch(createItemActions.clearError()) - - const smallThumbnailBlob = await resizeImage(file) - const bigThumbnailBlob = await resizeImage(file, 1024, 1024) - - const thumbnail = URL.createObjectURL(smallThumbnailBlob) - - dispatch(createItemActions.setThumbnail(thumbnail)) - dispatch( - createItemActions.setContents({ - ...contents, - [THUMBNAIL_PATH]: bigThumbnailBlob - }) - ) - } - }, - [state] - ) - - const handleOpenVideoDialog = useCallback(() => { - dispatch(createItemActions.setView(CreateItemView.UPLOAD_VIDEO)) - dispatch(createItemActions.setFromView(CreateItemView.DETAILS)) - }, []) - - const handleYes = useCallback(() => dispatch(createItemActions.setIsRepresentation(true)), []) - - const handleNo = useCallback(() => dispatch(createItemActions.setIsRepresentation(false)), []) - - const isAddingRepresentation = useMemo(() => { - return !!(metadata && metadata.item && !metadata.changeItemFile) - }, [metadata]) - - const filterItemsByBodyShape = useCallback( - (item: Item) => { - const { bodyShape } = state - return getMissingBodyShapeType(item) === bodyShape && metadata.collectionId === item.collectionId - }, - [metadata, state] - ) - - /** - * Updates the item's thumbnail if the user changes the category of the item. - * - * @param category - The category of the wearable. - */ - const updateThumbnailByCategory = useCallback( - async (category: WearableCategory) => { - const { model, contents } = state - - const isCustom = !!contents && THUMBNAIL_PATH in contents - if (!isCustom) { - dispatch(createItemActions.setLoading(true)) - let thumbnail - if (contents && isImageFile(model!)) { - thumbnail = await convertImageIntoWearableThumbnail(contents[THUMBNAIL_PATH] || contents[model!], category) - } else { - const url = URL.createObjectURL(contents![model!]) - const { image } = await getModelData(url, { - width: 1024, - height: 1024, - thumbnailType: getThumbnailType(category), - extension: (model && getExtension(model)) || undefined, - engine: EngineType.BABYLON - }) - thumbnail = image - URL.revokeObjectURL(url) - } - dispatch(createItemActions.setThumbnail(thumbnail)) - dispatch(createItemActions.setLoading(false)) - } - }, - [state] - ) - - const renderModalTitle = useCallback(() => { - const { bodyShape, type, view, contents } = state - - if (isAddingRepresentation) { - return t('create_single_item_modal.add_representation', { bodyShape: t(`body_shapes.${bodyShape!}`) }) - } - - if (metadata && metadata.changeItemFile) { - return t('create_single_item_modal.change_item_file') - } - - if (type === ItemType.EMOTE) { - return view === CreateItemView.THUMBNAIL - ? t('create_single_item_modal.thumbnail_step_title') - : t('create_single_item_modal.title_emote') - } - - if (isSmart({ type, contents }) && view === CreateItemView.DETAILS) { - return t('create_single_item_modal.smart_wearable_details_title') - } - - switch (view) { - case CreateItemView.THUMBNAIL: - return t('create_single_item_modal.thumbnail_step_title') - case CreateItemView.UPLOAD_VIDEO: - return t('create_single_item_modal.upload_video_step_title') - default: - return t('create_single_item_modal.title') - } - }, [metadata, state, isAddingRepresentation]) - - const handleFileLoad = useCallback(async () => { - const { weareblePreviewUpdated, type, model, item, contents } = state - - const modelSize = await calculateModelFinalSize( - item?.contents ?? {}, - contents ?? {}, - type ?? ItemType.WEARABLE, - new BuilderAPI(BUILDER_SERVER_URL, new Authorization(() => props.address)) - ) - - dispatch(createItemActions.setModelSize(modelSize)) - - // if model is an image, the wearable preview won't be needed - if (model && isImageFile(model)) { - return getMetricsAndScreenshot() - } - - const controller = WearablePreview.createController('thumbnail-picker') - // dispatch(createItemActions.setPreviewController(controller)) - - if (weareblePreviewUpdated) { - if (type === ItemType.EMOTE) { - const length = await controller.emote.getLength() - await controller.emote.goTo(Math.floor(Math.random() * length)) - } - return getMetricsAndScreenshot() - } - }, [state, getMetricsAndScreenshot]) - - const renderWearablePreview = useCallback(() => { - const { type, contents } = state - const isEmote = type === ItemType.EMOTE - const blob = contents ? (isEmote ? toEmoteWithBlobs({ contents }) : toWearableWithBlobs({ contents })) : undefined - - if (!blob) { - return null - } - - const wearablePreviewExtraOptions = isEmote - ? { - profile: 'default', - disableFace: true, - disableDefaultWearables: true, - skin: '000000', - wheelZoom: 2 - } - : {} - - return ( - dispatch(createItemActions.setWearablePreviewUpdated(true))} - onLoad={handleFileLoad} - /> - ) - }, [state, handleFileLoad]) - - const handleUploadVideoGoBack = useCallback(() => { - const { fromView } = state - const keys = Object.keys(state) - - if (fromView) { - dispatch(createItemActions.setView(fromView)) - return - } - - const stateReset = keys.reduce((acc, v) => ({ ...acc, [v]: undefined }), {}) - dispatch(createItemActions.resetState(stateReset)) - }, [state]) - - const renderImportView = useCallback(() => { - const { category, isLoading, isRepresentation } = state - const title = renderModalTitle() - - return ( - {renderWearablePreview()}} - isLoading={!!isLoading} - isRepresentation={!!isRepresentation} - onDropAccepted={handleDropAccepted} - onClose={onClose} - /> - ) - }, [collection, metadata, state, handleDropAccepted, renderModalTitle, renderWearablePreview, onClose]) - - const renderUploadVideoView = useCallback(() => { - const { contents } = state - const title = renderModalTitle() - - return ( - - ) - }, [itemStatus, state, renderModalTitle, handleVideoDropAccepted, handleSaveVideo, handleUploadVideoGoBack, onClose]) - - const renderFields = useCallback(() => { - const { name, category, rarity, contents, item, type, isLoading } = state - - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) - const rarities = Rarity.getRarities() - const categories: string[] = type === ItemType.WEARABLE ? getWearableCategories(contents) : getEmoteCategories() - const linkedContract = getLinkedContract(collection) - - const raritiesLink = - 'https://docs.decentraland.org/creator/wearables-and-emotes/manage-collections' + - (type === ItemType.EMOTE - ? '/uploading-emotes/#rarity' - : isSmart({ type, contents }) - ? '/uploading-smart-wearables/#rarity' - : '/uploading-wearables/#rarity') - - return ( - <> - - {(!item || !item.isPublished) && !belongsToAThirdPartyCollection ? ( - <> - - {t('create_single_item_modal.rarity_label')} - - {t('global.learn_more')} - - - } - placeholder={t('create_single_item_modal.rarity_placeholder')} - value={rarity} - options={rarities.map(value => ({ - value, - label: t('wearable.supply', { - count: Rarity.getMaxSupply(value), - formatted: Rarity.getMaxSupply(value).toLocaleString() - }), - text: t(`wearable.rarity.${value}`) - }))} - disabled={isLoading} - onChange={handleRarityChange} - /> - - ) : null} - ({ value, text: t(`${type!}.category.${value}`) }))} - onChange={handleCategoryChange} - /> - {isThirdPartyV2Enabled && linkedContract && } - - ) - }, [collection, getMapping, handleCategoryChange, handleMappingChange, handleNameChange, handleRarityChange, isThirdPartyV2Enabled]) - - const renderMetrics = useCallback(() => { - const { metrics, contents } = state - if (metrics) { - return - } else { - return null - } - }, [state]) - - const isDisabled = useCallback((): boolean => { - const { isLoading: isStateLoading } = state - - return !isValid() || isLoading || Boolean(isStateLoading) - }, [state, isLoading, isValid]) - - const renderRepresentation = useCallback( - (type: BodyShapeType) => { - const { bodyShape } = state - return ( -
{ - dispatch(createItemActions.setBodyShape(type)) - dispatch(createItemActions.setIsRepresentation(metadata && metadata.changeItemFile ? false : undefined)) - dispatch(createItemActions.setItem(undefined)) - }} - > - {t('body_shapes.' + type)} -
- ) - }, - [metadata, state] - ) - - const renderWearableDetails = useCallback(() => { - const { bodyShape, thumbnail, isRepresentation, rarity, item } = state - const title = renderModalTitle() - const thumbnailStyle = getBackgroundStyle(rarity) - - return ( - <> -
-
- {title} - {isRepresentation ? null : ( - <> - - - - )} -
- {renderMetrics()} -
- - {isAddingRepresentation ? null : ( -
-
{t('create_single_item_modal.representation_label')}
- - {renderRepresentation(BodyShapeType.BOTH)} - {renderRepresentation(BodyShapeType.MALE)} - {renderRepresentation(BodyShapeType.FEMALE)} - -
- )} - {bodyShape && (!metadata || !metadata.changeItemFile) ? ( - <> - {bodyShape === BodyShapeType.BOTH ? ( - renderFields() - ) : ( - <> - {isAddingRepresentation ? null : ( -
-
{t('create_single_item_modal.existing_item')}
- -
- {t('global.yes')} -
-
- {t('global.no')} -
-
-
- )} - {isRepresentation === undefined ? null : isRepresentation ? ( -
-
- {isAddingRepresentation - ? t('create_single_item_modal.adding_representation', { bodyShape: t(`body_shapes.${bodyShape}`) }) - : t('create_single_item_modal.pick_item', { bodyShape: t(`body_shapes.${bodyShape}`) })} -
- } - filter={filterItemsByBodyShape} - onChange={handleItemChange} - isDisabled={isAddingRepresentation} - /> -
- ) : ( - renderFields() - )} - - )} - - ) : ( - renderFields() - )} -
- - ) - }, [metadata, state, renderFields, renderMetrics, renderModalTitle, renderRepresentation, isAddingRepresentation]) - - const renderEmoteDetails = useCallback(() => { - const { thumbnail, rarity, playMode = '' } = state - const title = renderModalTitle() - const thumbnailStyle = getBackgroundStyle(rarity) - - return ( - - - -
- {title} - - -
- {renderMetrics()} -
- - {renderFields()} - - -
-
- } /> -
-
- ) - }, [state, renderFields, renderMetrics, renderModalTitle, handlePlayModeChange, handleThumbnailChange]) - - const renderSmartWearableDetails = useCallback(() => { - const { thumbnail, rarity, requiredPermissions, video } = state - const title = renderModalTitle() - const thumbnailStyle = getBackgroundStyle(rarity) - - return ( -
- {renderFields()} - {requiredPermissions?.length ? ( -
-
- {t('create_single_item_modal.smart_wearable_permissions_label')} - - {t('global.learn_more')} - -
- -
- ) : null} - -
-
{t('create_single_item_modal.thumbnail_preview_title')}
-
-
- {title} - - -
-
{renderMetrics()}
-
-
- -
-
{t('create_single_item_modal.video_preview_title')}
-
- } - onClick={handleOpenVideoDialog} - /> -
-
-
-
- } /> -
-
- ) - }, [state, renderFields, renderMetrics, renderModalTitle, handleOpenVideoDialog]) - - const renderItemDetails = useCallback(() => { - const { type, contents } = state - - if (type === ItemType.EMOTE) { - return renderEmoteDetails() - } else if (isSmart({ type, contents })) { - return renderSmartWearableDetails() - } else { - return renderWearableDetails() - } - }, [state, renderEmoteDetails, renderSmartWearableDetails, renderWearableDetails]) - - const handleGoBack = useCallback(() => { - dispatch(createItemActions.setView(CreateItemView.UPLOAD_VIDEO)) - }, []) - - const renderDetailsView = useCallback(() => { - const { isRepresentation, error: stateError, type, contents, isLoading: isStateLoading, hasScreenshotTaken } = state - const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection.urn) - const _isDisabled = isDisabled() - const title = renderModalTitle() - const hasFinishSteps = (type === ItemType.EMOTE && hasScreenshotTaken) || type === ItemType.WEARABLE - - return ( - <> - - -
- - {renderItemDetails()} - - {isSmart({ type, contents }) ? ( - - - - ) : null} - - - - - {stateError ? ( - -

{stateError}

-
- ) : null} - {error ? ( - -

{error}

-
- ) : null} -
-
-
- - ) - }, [collection, error, metadata, state, handleSubmit, renderModalTitle, isDisabled, isLoading, onClose]) - - const handleOnScreenshotTaken = useCallback( - async (screenshot: string) => { - const { itemSortedContents, item } = state - - if (item && itemSortedContents) { - const blob = dataURLToBlob(screenshot) - - itemSortedContents[THUMBNAIL_PATH] = blob! - item.contents = await computeHashes(itemSortedContents) - - // Determine the target view based on fromView - let targetView = state.view - if (state.fromView === CreateItemView.DETAILS) { - targetView = CreateItemView.DETAILS - } else { - // Call handleSubmit and let it handle the view change - void handleSubmit() - } - - // Update state with individual actions for clarity - dispatch(createItemActions.setItemSortedContents(itemSortedContents)) - dispatch(createItemActions.setItem(item as Item)) - dispatch(createItemActions.setHasScreenshotTaken(true)) - dispatch(createItemActions.setView(targetView)) - } else { - // Determine the target view based on fromView - let targetView = state.view - if (state.fromView === CreateItemView.DETAILS) { - targetView = CreateItemView.DETAILS - } - - // Update state with individual actions - dispatch(createItemActions.setThumbnail(screenshot)) - dispatch(createItemActions.setHasScreenshotTaken(true)) - dispatch(createItemActions.setView(targetView)) - } - }, - [state, handleSubmit] - ) - - const renderThumbnailView = useCallback(() => { - const { isLoading, contents } = state - - return ( - dispatch(createItemActions.setView(CreateItemView.DETAILS))} - onSave={handleOnScreenshotTaken} - onClose={onClose} - /> - ) - }, [state, renderModalTitle, handleOnScreenshotTaken, onClose]) - - const renderSetPrice = useCallback(() => { - const { item, itemSortedContents } = state - return ( - - ) - }, [state, handleSubmit]) - - const renderView = useCallback(() => { - const { view } = state - switch (view) { - case CreateItemView.IMPORT: - return renderImportView() - case CreateItemView.UPLOAD_VIDEO: - return renderUploadVideoView() - case CreateItemView.DETAILS: - return renderDetailsView() - case CreateItemView.THUMBNAIL: - return renderThumbnailView() - case CreateItemView.SET_PRICE: - return renderSetPrice() - default: - return null - } - }, [state]) - - return ( -
- - {renderView()} - -
- ) -} - -export default React.memo(CreateSingleItemModal) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index e4f2d6a42..35feb7e60 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -1,6 +1,15 @@ import React, { useReducer, useRef, useCallback, useMemo } from 'react' import { ethers } from 'ethers' -import { BodyPartCategory, BodyShape, EmoteCategory, Rarity, PreviewProjection, WearableCategory, IPreviewController } from '@dcl/schemas' +import { + BodyPartCategory, + BodyShape, + EmoteCategory, + Rarity, + PreviewProjection, + WearableCategory, + IPreviewController, + EmoteDataADR287 +} from '@dcl/schemas' import { MAX_EMOTE_FILE_SIZE, MAX_SKIN_FILE_SIZE, @@ -24,8 +33,7 @@ import { VIDEO_PATH, WearableData, SyncStatus, - EmoteData, - EmoteDataADR287 + EmoteData } from 'modules/item/types' import { areEmoteMetrics, Metrics } from 'modules/models/types' import { computeHashes } from 'modules/deployment/contentUtils' @@ -70,7 +78,7 @@ import { import { createItemReducer, createItemActions, createInitialState } from './CreateSingleItemModal.reducer' import { Props, State, CreateItemView, StateData, SortedContent, AcceptedFileProps } from './CreateSingleItemModal.types' import { Steps } from './Steps' -import { CreateSingleItemModalProvider } from './CreateSingleItemModal.context' +import { CreateSingleItemModalProvider } from './CreateSingleItemModalProvider' import './CreateSingleItemModal.css' export const CreateSingleItemModal: React.FC = props => { @@ -145,8 +153,36 @@ export const CreateSingleItemModal: React.FC = props => { } as EmoteData // ADR 287 - Social Emotes + // Hardcoded for testing purposes but should be removed later if (outcomes && outcomes.length > 0) { - ;(data as EmoteDataADR287).outcomes = outcomes + data = { + ...data, + startAnimation: [ + { + armature: 'Armature', + animation: 'HighFive_Start', + loop: true + } + ], + randomizeOutcomes: false, + outcomes: [ + { + title: 'High Five', + clips: [ + { + armature: 'Armature', + animation: 'HighFive_Avatar', + loop: false + }, + { + armature: 'Armature', + animation: 'HighFive_AvatarOther', + loop: false + } + ] + } + ] + } } } @@ -667,7 +703,7 @@ export const CreateSingleItemModal: React.FC = props => { dispatch(createItemActions.setMetrics(data.metrics)) dispatch(createItemActions.setThumbnail(thumbnail ?? data.image)) dispatch(createItemActions.setView(view)) - if (areEmoteMetrics(data.metrics) && data.metrics.secondaryArmature) { + if (areEmoteMetrics(data.metrics) && data.metrics.additionalArmatures) { // required? // dispatch(createItemActions.setEmoteData({ animations: data.animations ?? [], armatures: data.armatures! })) dispatch( @@ -736,7 +772,7 @@ export const CreateSingleItemModal: React.FC = props => { return ( { + return {children} +} diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx index 8b20afd5d..08367007b 100644 --- a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/EmoteDetails.tsx @@ -1,20 +1,21 @@ import React, { useCallback } from 'react' -import { Row, Column, SelectField, Message, DropdownProps, Field, Checkbox, Button, Box } from 'decentraland-ui' +import { Row, Column, SelectField, Message, DropdownProps, Button } from 'decentraland-ui' import { t } from 'decentraland-dapps/dist/modules/translation/utils' import { EmotePlayMode } from '@dcl/schemas' import { getBackgroundStyle } from 'modules/item/utils' -import { EmoteOutcome, Item } from 'modules/item/types' +import { Item } from 'modules/item/types' import Icon from 'components/Icon' import ItemProperties from 'components/ItemProperties' import { useCreateSingleItemModal } from '../CreateSingleItemModal.context' import { createItemActions } from '../CreateSingleItemModal.reducer' import CommonFields from '../CommonFields' import { CreateItemView } from '../CreateSingleItemModal.types' +import { areEmoteMetrics } from 'modules/models/types' /** * Gets play mode options for emotes */ -export const getPlayModeOptions = () => { +const getPlayModeOptions = () => { const playModes: string[] = [EmotePlayMode.SIMPLE, EmotePlayMode.LOOP] return playModes.map(value => ({ @@ -42,99 +43,6 @@ const PlayModeSelectField: React.FC<{ ) } -const OutcomeHeader: React.FC<{ - outcomeIndex: number - onDeleteOutcome: (outcomeIndex: number) => () => void -}> = ({ outcomeIndex, onDeleteOutcome }) => { - const canDelete = outcomeIndex > 0 - return ( -
- Outcome {outcomeIndex + 1} - {canDelete ? ( - - ) : null} -
- ) -} - -const OutcomeField: React.FC<{ - outcome: EmoteOutcome - outcomeIndex: number - isLoading: boolean - shouldShowRandomizeOutcome: boolean - onAnimationChange: (outcomeIndex: number) => (event: React.ChangeEvent, props: any) => void - onPlayModeChange: (outcomeIndex: number) => (event: React.SyntheticEvent, data: DropdownProps) => void - onToggleRandom: (outcomeIndex: number) => () => void - onDeleteOutcome: (outcomeIndex: number) => () => void -}> = ({ - outcome, - outcomeIndex, - shouldShowRandomizeOutcome, - isLoading, - onAnimationChange, - onPlayModeChange, - onToggleRandom, - onDeleteOutcome -}) => { - return ( - } borderless> - - - - {shouldShowRandomizeOutcome ? ( - - ) : null} - - - ) -} - -const OutcomesSection: React.FC<{ - outcomes: EmoteOutcome[] - isLoading: boolean - onAnimationChange: (outcomeIndex: number) => (event: React.ChangeEvent, props: any) => void - onPlayModeChange: (outcomeIndex: number) => (event: React.SyntheticEvent, data: DropdownProps) => void - onToggleRandom: (outcomeIndex: number) => () => void - onAddOutcome: () => void - onDeleteOutcome: (outcomeIndex: number) => () => void -}> = ({ outcomes, isLoading, onAnimationChange, onPlayModeChange, onToggleRandom, onAddOutcome, onDeleteOutcome }) => { - const canAddMore = outcomes.length < 4 - const shouldShowRandomizeOutcome = outcomes.length > 1 - return ( -
-
Outcomes
- {outcomes.map((outcome, index) => ( - - ))} - {canAddMore && ( - - - - )} -
- ) -} - export const EmoteDetails: React.FC = () => { const { state, @@ -147,7 +55,7 @@ export const EmoteDetails: React.FC = () => { handleSubmit, isDisabled } = useCreateSingleItemModal() - const { contents, metrics, thumbnail, rarity, playMode = '', outcomes = [], hasScreenshotTaken } = state + const { contents, metrics, thumbnail, rarity, playMode = '', hasScreenshotTaken } = state const title = renderModalTitle() const thumbnailStyle = getBackgroundStyle(rarity) @@ -159,74 +67,6 @@ export const EmoteDetails: React.FC = () => { [dispatch] ) - const handleOutcomeAnimationNameChange = useCallback( - (outcomeIndex: number) => (_event: React.ChangeEvent, props: any) => { - dispatch( - createItemActions.setOutcomes(prevOutcomes => { - const newOutcomes = [...prevOutcomes] - newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], animation: props.value } - return newOutcomes - }) - ) - }, - [dispatch] - ) - - const handleOutcomePlayModeChange = useCallback( - (outcomeIndex: number) => (_event: React.SyntheticEvent, data: DropdownProps) => { - dispatch( - createItemActions.setOutcomes(prevOutcomes => { - const newOutcomes = [...prevOutcomes] - newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], loop: data.value === EmotePlayMode.LOOP } - return newOutcomes - }) - ) - }, - [dispatch] - ) - - const handleToggleRandomOutcome = useCallback( - (outcomeIndex: number) => () => { - dispatch( - createItemActions.setOutcomes(prevOutcomes => { - const newOutcomes = [...prevOutcomes] - newOutcomes[outcomeIndex] = { ...newOutcomes[outcomeIndex], randomize: !newOutcomes[outcomeIndex].randomize } - return newOutcomes - }) - ) - }, - [dispatch] - ) - - const handleAddOutcome = useCallback(() => { - dispatch( - createItemActions.setOutcomes(prevOutcomes => { - if (prevOutcomes.length < 4) { - const newOutcome: EmoteOutcome = { - animation: '', - loop: false, - randomize: false - } - return [...prevOutcomes, newOutcome] - } - return prevOutcomes - }) - ) - }, [dispatch]) - - const handleDeleteOutcome = useCallback( - (outcomeIndex: number) => () => { - dispatch( - createItemActions.setOutcomes(prevOutcomes => { - const newOutcomes = [...prevOutcomes] - newOutcomes.splice(outcomeIndex, 1) - return newOutcomes - }) - ) - }, - [dispatch] - ) - const handleClickSave = useCallback(() => { if (hasScreenshotTaken) { handleSubmit() @@ -251,19 +91,9 @@ export const EmoteDetails: React.FC = () => { - {outcomes.length > 0 ? ( - - ) : ( + {metrics && areEmoteMetrics(metrics) && !metrics.additionalArmatures ? ( - )} + ) : null}
diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx index 55d607ed2..b6f9d0ee6 100644 --- a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/ItemDetailsStep.tsx @@ -44,4 +44,4 @@ export const ItemDetailsStep: React.FC = () => { ) } -export default ItemDetailsStep +export default React.memo(ItemDetailsStep) diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx index dd581362f..b2fa8e59a 100644 --- a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/SmartWearableDetails.tsx @@ -143,4 +143,4 @@ export const SmartWearableDetails: React.FC = () => { ) } -export default SmartWearableDetails +export default React.memo(SmartWearableDetails) diff --git a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx index 30bf0bffd..9b3054913 100644 --- a/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx +++ b/src/components/Modals/CreateSingleItemModal/ItemDetailsStep/WearableDetails.tsx @@ -136,4 +136,4 @@ export const WearableDetails: React.FC = () => { ) } -export default WearableDetails +export default React.memo(WearableDetails) diff --git a/src/lib/getModelData.ts b/src/lib/getModelData.ts index 84c398d17..a1d6ec6ed 100644 --- a/src/lib/getModelData.ts +++ b/src/lib/getModelData.ts @@ -235,7 +235,11 @@ export async function getEmoteData(url: string, options: Partial = {}) throw new EmoteWithMeshError() } - if (propsAnimation && propsAnimation.duration !== animation.duration) { + // For social emotes, we need to count the number of additional armatures, currently only one additional armature is supported + const additionalArmatures = armatures.some(({ name }) => name === ARMATURES.OTHER) ? 1 : 0 + + // For social emotes, we don't need to check the duration of the props animation + if (!additionalArmatures && propsAnimation && propsAnimation.duration !== animation.duration) { throw new EmoteAnimationsSyncError() } @@ -255,7 +259,7 @@ export async function getEmoteData(url: string, options: Partial = {}) frames, fps: frames / animation.duration, props: armatures.some(({ name }) => name === ARMATURES.PROP) ? 1 : 0, - secondaryArmature: armatures.some(({ name }) => name === ARMATURES.OTHER) ? 1 : 0 + additionalArmatures } } } diff --git a/src/modules/item/types.ts b/src/modules/item/types.ts index bde9e418b..75bf3b512 100644 --- a/src/modules/item/types.ts +++ b/src/modules/item/types.ts @@ -2,6 +2,7 @@ import { BuiltItem, Content } from '@dcl/builder-client' import { BodyShape, EmoteDataADR74, + EmoteDataADR287, Wearable, WearableCategory, Rarity, @@ -44,6 +45,12 @@ export enum ItemMetadataType { EMOTE = 'e' } +export enum EmoteOutcomeMetadataType { + SIMPLE_OUTCOME = 'so', + MULTIPLE_OUTCOME = 'mo', + RANDOM_OUTCOME = 'ro' +} + export const BODY_SHAPE_CATEGORY = 'body_shape' export enum BodyShapeType { @@ -83,16 +90,6 @@ export type WearableData = { outlineCompatible?: boolean } -export type EmoteOutcome = { - animation: string - loop: boolean - randomize: boolean -} - -export type EmoteDataADR287 = EmoteDataADR74 & { - outcomes: EmoteOutcome[] -} - export type EmoteData = EmoteDataADR74 | EmoteDataADR287 type BaseItem = { diff --git a/src/modules/models/types.ts b/src/modules/models/types.ts index 9143ce78d..d2f1e0f87 100644 --- a/src/modules/models/types.ts +++ b/src/modules/models/types.ts @@ -13,12 +13,13 @@ export type AnimationMetrics = { frames: number fps: number props: number - secondaryArmature: number + additionalArmatures: number } export type Metrics = ModelMetrics | AnimationMetrics export const areEmoteMetrics = (metrics: Metrics): metrics is AnimationMetrics => !!(metrics as AnimationMetrics).fps +export const isSocialEmoteMetrics = (metrics: Metrics): metrics is AnimationMetrics => !!(metrics as AnimationMetrics).additionalArmatures export type Vector3 = { x: number; y: number; z: number } From 60b6821d55f17c05222150947ff73c692a380081 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 17 Sep 2025 17:02:38 -0300 Subject: [PATCH 10/48] fix: Use local types --- package-lock.json | 920 +++++------------- .../CreateSingleItemModal.tsx | 14 +- src/modules/item/types.ts | 20 +- 3 files changed, 258 insertions(+), 696 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5caca7862..b834797ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -556,81 +556,19 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", @@ -686,30 +624,45 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { @@ -746,37 +699,23 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -802,10 +741,11 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -835,17 +775,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -873,88 +815,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.28.4" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -998,6 +866,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1023,12 +908,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1139,6 +1025,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", @@ -1151,70 +1058,50 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/@babylonjs/core": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-4.2.2.tgz", @@ -5570,16 +5457,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -5590,14 +5474,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", @@ -5608,14 +5484,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -7576,7 +7454,6 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -7595,7 +7472,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -7761,8 +7637,7 @@ "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9166,7 +9041,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9176,26 +9050,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -9203,14 +9073,12 @@ "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -9218,14 +9086,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9237,7 +9103,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -9246,7 +9111,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -9254,14 +9118,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9277,7 +9139,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9290,7 +9151,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9302,7 +9162,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -9316,7 +9175,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -9330,7 +9188,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -9447,14 +9304,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abab": { "version": "2.0.6", @@ -9965,7 +9820,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9974,7 +9828,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9983,7 +9836,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10021,7 +9873,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10035,7 +9886,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -10046,8 +9896,7 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { "version": "2.1.0", @@ -10066,7 +9915,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10081,7 +9929,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, "funding": [ { "type": "individual", @@ -10116,7 +9963,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -10554,7 +10400,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -10580,7 +10425,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -10592,7 +10436,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10715,8 +10558,7 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -10783,7 +10625,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -10794,7 +10635,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -10806,7 +10646,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -10816,7 +10655,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", - "dev": true, "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -10836,7 +10674,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "dependencies": { "pako": "~1.0.5" } @@ -10984,8 +10821,7 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "node_modules/cac": { "version": "6.7.14", @@ -11000,7 +10836,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -11023,7 +10858,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11032,14 +10866,12 @@ "node_modules/cacache/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/cacache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11059,7 +10891,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11071,7 +10902,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11083,7 +10913,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -11211,7 +11040,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -11303,7 +11131,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -11566,7 +11393,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -11724,8 +11550,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/component-classes": { "version": "1.2.6", @@ -11739,7 +11564,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -11773,7 +11597,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "engines": [ "node >= 0.8" ], @@ -11787,14 +11610,12 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11808,14 +11629,12 @@ "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -11900,8 +11719,7 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -11912,8 +11730,7 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -11943,7 +11760,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -11956,14 +11772,12 @@ "node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/copy-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11973,7 +11787,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11993,7 +11806,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12005,7 +11817,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -12017,7 +11828,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12126,7 +11936,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -12135,8 +11944,7 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/create-hash": { "version": "1.2.0", @@ -12224,7 +12032,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -12305,8 +12112,7 @@ "node_modules/cyclist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" }, "node_modules/d": { "version": "1.0.2", @@ -12724,6 +12530,21 @@ "node": ">= 4" } }, + "node_modules/decentraland-dapps/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/decentraland-dapps/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -13214,7 +13035,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13274,7 +13094,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -13375,7 +13194,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -13385,8 +13203,7 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -13639,7 +13456,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -13670,7 +13486,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, "dependencies": { "prr": "~1.0.1" }, @@ -14070,7 +13885,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -14082,7 +13896,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -14538,7 +14351,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -14556,7 +14368,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14564,8 +14375,7 @@ "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/expand-template": { "version": "1.1.1", @@ -14600,7 +14410,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -14612,7 +14421,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -14631,7 +14439,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -14643,7 +14450,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -14817,8 +14623,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported.", - "dev": true + "deprecated": "This module is no longer supported." }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -14880,7 +14685,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -14894,7 +14698,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -14906,7 +14709,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14919,7 +14721,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -14932,7 +14733,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -14947,7 +14747,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -14959,7 +14758,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, "engines": { "node": ">=4" } @@ -14968,7 +14766,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "engines": { "node": ">=6" } @@ -14977,7 +14774,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -14989,7 +14785,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -15059,7 +14854,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -15068,14 +14862,12 @@ "node_modules/flush-write-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/flush-write-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15089,14 +14881,12 @@ "node_modules/flush-write-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/flush-write-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15132,7 +14922,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15202,7 +14991,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, "dependencies": { "map-cache": "^0.2.2" }, @@ -15214,7 +15002,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -15223,14 +15010,12 @@ "node_modules/from2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15244,14 +15029,12 @@ "node_modules/from2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/from2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15278,7 +15061,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -15289,14 +15071,12 @@ "node_modules/fs-write-stream-atomic/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15310,14 +15090,12 @@ "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15431,7 +15209,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15725,7 +15502,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -15739,7 +15515,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -15752,7 +15527,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15764,7 +15538,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15776,7 +15549,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15958,8 +15730,7 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -16052,8 +15823,7 @@ "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" }, "node_modules/ignore": { "version": "5.3.0", @@ -16144,7 +15914,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -16160,8 +15929,7 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", @@ -16502,7 +16270,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16583,8 +16350,7 @@ "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { "version": "1.2.7", @@ -16612,7 +16378,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16638,7 +16403,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16665,7 +16429,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17028,7 +16791,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18382,8 +18144,7 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -18732,7 +18493,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -18741,7 +18501,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18755,7 +18514,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -18932,7 +18690,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -18941,7 +18698,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -18993,7 +18749,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19002,7 +18757,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, "dependencies": { "object-visit": "^1.0.0" }, @@ -19033,7 +18787,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -19045,14 +18798,12 @@ "node_modules/memory-fs/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/memory-fs/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19066,14 +18817,12 @@ "node_modules/memory-fs/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/memory-fs/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19127,7 +18876,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -19139,8 +18887,7 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/mime": { "version": "3.0.0", @@ -19252,7 +18999,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -19273,7 +19019,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -19284,14 +19029,12 @@ "node_modules/mississippi/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/mississippi/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19305,14 +19048,12 @@ "node_modules/mississippi/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/mississippi/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19326,7 +19067,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -19339,7 +19079,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19419,7 +19158,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -19432,14 +19170,12 @@ "node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/move-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19449,7 +19185,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19469,7 +19204,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19481,7 +19215,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -19766,7 +19499,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -19784,7 +19516,6 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -19806,7 +19537,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -19819,7 +19549,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -19832,7 +19561,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -19845,7 +19573,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19862,8 +19589,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { "version": "1.1.0", @@ -19966,7 +19692,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -19997,7 +19722,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", - "dev": true, "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" @@ -20007,7 +19731,6 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -20016,7 +19739,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -20027,7 +19749,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -20036,32 +19757,27 @@ "node_modules/node-libs-browser/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/node-libs-browser/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/node-libs-browser/node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/node-libs-browser/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20075,14 +19791,12 @@ "node_modules/node-libs-browser/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/node-libs-browser/node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -20092,7 +19806,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -20105,7 +19818,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20113,14 +19825,12 @@ "node_modules/node-libs-browser/node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" }, "node_modules/node-libs-browser/node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -20299,7 +20009,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -20313,7 +20022,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -20365,7 +20073,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, "dependencies": { "isobject": "^3.0.0" }, @@ -20394,7 +20101,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -20512,8 +20218,7 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-homedir": { "version": "1.0.2", @@ -20615,7 +20320,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -20625,14 +20329,12 @@ "node_modules/parallel-transform/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20646,14 +20348,12 @@ "node_modules/parallel-transform/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/parallel-transform/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20673,7 +20373,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -20726,7 +20425,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -20741,7 +20439,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, "optional": true }, "node_modules/path-exists": { @@ -21044,7 +20741,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -21053,7 +20749,6 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -21282,7 +20977,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -21296,7 +20990,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -21307,8 +21000,7 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/process": { "version": "0.11.10", @@ -21362,8 +21054,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, "node_modules/prompts": { "version": "2.4.2", @@ -21465,8 +21156,7 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" }, "node_modules/psl": { "version": "1.9.0", @@ -21478,7 +21168,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21491,8 +21180,7 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/pull-batch": { "version": "1.0.0", @@ -21589,7 +21277,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -21600,7 +21287,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -21611,14 +21297,12 @@ "node_modules/pumpify/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21628,7 +21312,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -21642,14 +21325,12 @@ "node_modules/pumpify/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/pumpify/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -21837,7 +21518,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -22016,7 +21696,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -22737,7 +22416,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -22750,7 +22428,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -22763,7 +22440,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -22791,14 +22467,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true, "optional": true }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -22807,7 +22481,6 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, "engines": { "node": ">=0.10" } @@ -22911,8 +22584,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/resolve.exports": { "version": "2.0.2", @@ -22927,7 +22599,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, "engines": { "node": ">=0.12" } @@ -23191,7 +22862,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, "dependencies": { "aproba": "^1.1.1" } @@ -23199,8 +22869,7 @@ "node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/rxjs": { "version": "7.8.1", @@ -23234,7 +22903,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, "dependencies": { "ret": "~0.1.10" } @@ -23251,8 +22919,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/saxes": { "version": "6.0.0", @@ -23428,7 +23095,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -23470,7 +23136,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -23638,7 +23303,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -23657,7 +23321,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -23671,7 +23334,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -23683,7 +23345,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -23696,7 +23357,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "dependencies": { "kind-of": "^3.2.0" }, @@ -23708,7 +23368,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -23720,7 +23379,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23728,8 +23386,7 @@ "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/socket.io-client": { "version": "4.7.4", @@ -23769,8 +23426,7 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.5.7", @@ -23784,7 +23440,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23794,7 +23449,6 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -23807,7 +23461,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, "engines": { "node": ">=0.10" } @@ -23816,7 +23469,6 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23826,7 +23478,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23835,8 +23486,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" }, "node_modules/sourcemap-codec": { "version": "1.4.8", @@ -23872,7 +23522,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -23884,7 +23533,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -23897,7 +23545,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -23924,7 +23571,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" } @@ -23971,7 +23617,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -24019,7 +23664,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -24272,7 +23916,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, "engines": { "node": ">=6" } @@ -24450,7 +24093,6 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -24473,7 +24115,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24489,7 +24130,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -24498,7 +24138,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -24507,7 +24146,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, "engines": { "node": ">=4" } @@ -24515,14 +24153,12 @@ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -24536,7 +24172,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -24545,7 +24180,6 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -24672,7 +24306,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -24681,14 +24314,12 @@ "node_modules/through2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24702,14 +24333,12 @@ "node_modules/through2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -24726,7 +24355,6 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -24765,8 +24393,7 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" }, "node_modules/to-buffer": { "version": "1.1.1", @@ -24787,7 +24414,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -24799,7 +24425,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -24820,7 +24445,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -24846,7 +24470,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -24859,7 +24482,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -24872,7 +24494,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -24885,7 +24506,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -25447,8 +25067,7 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -25614,7 +25233,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -25629,7 +25247,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -25638,7 +25255,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -25655,7 +25271,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -25668,7 +25283,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -25682,7 +25296,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, "dependencies": { "isarray": "1.0.0" }, @@ -25694,7 +25307,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -25702,8 +25314,7 @@ "node_modules/unset-value/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/unstorage": { "version": "1.12.0", @@ -25803,7 +25414,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, "optional": true, "engines": { "node": ">=4", @@ -25858,14 +25468,12 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true + "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/url": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -25972,14 +25580,12 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -26610,8 +26216,7 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -26646,7 +26251,6 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -26660,7 +26264,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -26670,7 +26273,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -26681,7 +26283,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -26694,7 +26295,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -26704,7 +26304,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -26727,7 +26326,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -26750,7 +26348,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.2", @@ -26764,7 +26361,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -26781,7 +26377,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -26799,7 +26394,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -26810,7 +26404,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -26823,7 +26416,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -26836,7 +26428,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", @@ -26850,7 +26441,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" @@ -26863,7 +26453,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -26876,7 +26465,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" @@ -26889,14 +26477,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", @@ -26921,7 +26507,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -26935,7 +26520,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "optional": true, "dependencies": { "core-util-is": "~1.0.0", @@ -26951,7 +26535,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -26966,14 +26549,12 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "optional": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -26983,7 +26564,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -27185,7 +26765,6 @@ "version": "4.47.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -27234,7 +26813,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -27244,7 +26822,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -27253,7 +26830,6 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -27265,7 +26841,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -27281,7 +26856,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -27290,7 +26864,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -27299,7 +26872,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -27320,7 +26892,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -27333,7 +26904,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -27346,7 +26916,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -27355,7 +26924,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -27370,7 +26938,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -27383,7 +26950,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -27395,7 +26961,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -27407,7 +26972,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -27418,20 +26982,17 @@ "node_modules/webpack/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/webpack/node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -27441,7 +27002,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -27465,7 +27025,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -27478,7 +27037,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -27492,14 +27050,12 @@ "node_modules/webpack/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -27513,7 +27069,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -27522,7 +27077,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -27715,7 +27269,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, "dependencies": { "errno": "~0.1.7" } @@ -27906,8 +27459,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 35feb7e60..93759444e 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -1,15 +1,6 @@ import React, { useReducer, useRef, useCallback, useMemo } from 'react' import { ethers } from 'ethers' -import { - BodyPartCategory, - BodyShape, - EmoteCategory, - Rarity, - PreviewProjection, - WearableCategory, - IPreviewController, - EmoteDataADR287 -} from '@dcl/schemas' +import { BodyPartCategory, BodyShape, EmoteCategory, Rarity, PreviewProjection, WearableCategory, IPreviewController } from '@dcl/schemas' import { MAX_EMOTE_FILE_SIZE, MAX_SKIN_FILE_SIZE, @@ -33,7 +24,8 @@ import { VIDEO_PATH, WearableData, SyncStatus, - EmoteData + EmoteData, + EmoteDataADR287 } from 'modules/item/types' import { areEmoteMetrics, Metrics } from 'modules/models/types' import { computeHashes } from 'modules/deployment/contentUtils' diff --git a/src/modules/item/types.ts b/src/modules/item/types.ts index 75bf3b512..3c701ec35 100644 --- a/src/modules/item/types.ts +++ b/src/modules/item/types.ts @@ -2,7 +2,6 @@ import { BuiltItem, Content } from '@dcl/builder-client' import { BodyShape, EmoteDataADR74, - EmoteDataADR287, Wearable, WearableCategory, Rarity, @@ -90,6 +89,25 @@ export type WearableData = { outlineCompatible?: boolean } +// TODO: Replace these types using the ones from @dcl/schemas + +export type EmoteClip = { + armature: string + animation: string + loop: boolean +} + +export type OutcomeGroup = { + title: string + clips: EmoteClip[] +} + +export type EmoteDataADR287 = EmoteDataADR74 & { + startAnimation: EmoteClip[] + randomizeOutcomes: boolean + outcomes: OutcomeGroup[] +} + export type EmoteData = EmoteDataADR74 | EmoteDataADR287 type BaseItem = { From 4f7a400df842f116c25c742caac60dc283df3111 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 17 Sep 2025 17:31:54 -0300 Subject: [PATCH 11/48] fix: Local types --- .../CreateSingleItemModal.reducer.ts | 6 +++--- .../CreateSingleItemModal.tsx | 14 ++++++++++---- .../CreateSingleItemModal.types.ts | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts index 73946907d..24a4a9b53 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts @@ -1,6 +1,6 @@ import { AnimationClip, Object3D } from 'three' import { EmotePlayMode, Rarity, WearableCategory, Mapping, ContractNetwork, ContractAddress } from '@dcl/schemas' -import { Item, BodyShapeType, ItemType, EmoteOutcome } from 'modules/item/types' +import { Item, BodyShapeType, ItemType, OutcomeGroup } from 'modules/item/types' import { Metrics } from 'modules/models/types' import { CreateItemView, State, AcceptedFileProps, CreateSingleItemModalMetadata } from './CreateSingleItemModal.types' import { Collection } from 'modules/collection/types' @@ -120,7 +120,7 @@ export type CreateItemAction = payload: Partial>> | undefined } | { type: typeof CREATE_ITEM_ACTIONS.SET_REQUIRED_PERMISSIONS; payload: string[] } - | { type: typeof CREATE_ITEM_ACTIONS.SET_OUTCOMES; payload: EmoteOutcome[] | ((prevOutcomes: EmoteOutcome[]) => EmoteOutcome[]) } + | { type: typeof CREATE_ITEM_ACTIONS.SET_OUTCOMES; payload: OutcomeGroup[] | ((prevOutcomes: OutcomeGroup[]) => OutcomeGroup[]) } | { type: typeof CREATE_ITEM_ACTIONS.SET_EMOTE_DATA; payload: { animations: AnimationClip[]; armatures: Object3D[] } } | { type: typeof CREATE_ITEM_ACTIONS.SET_TAGS; payload: string[] } | { type: typeof CREATE_ITEM_ACTIONS.SET_BLOCK_VRM_EXPORT; payload: boolean } @@ -242,7 +242,7 @@ export const createItemActions = { payload: requiredPermissions }), - setOutcomes: (outcomes: EmoteOutcome[] | ((prevOutcomes: EmoteOutcome[]) => EmoteOutcome[])): CreateItemAction => ({ + setOutcomes: (outcomes: OutcomeGroup[] | ((prevOutcomes: OutcomeGroup[]) => OutcomeGroup[])): CreateItemAction => ({ type: CREATE_ITEM_ACTIONS.SET_OUTCOMES, payload: outcomes }), diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 93759444e..b4a8ad0d0 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -167,7 +167,7 @@ export const CreateSingleItemModal: React.FC = props => { loop: false }, { - armature: 'Armature', + armature: 'Armature_Other', animation: 'HighFive_AvatarOther', loop: false } @@ -698,12 +698,18 @@ export const CreateSingleItemModal: React.FC = props => { if (areEmoteMetrics(data.metrics) && data.metrics.additionalArmatures) { // required? // dispatch(createItemActions.setEmoteData({ animations: data.animations ?? [], armatures: data.armatures! })) + // TODO: Remove this once the RightPanel is updated dispatch( createItemActions.setOutcomes([ { - animation: 'Start_Loop', - loop: true, - randomize: false + title: 'Test', + clips: [ + { + armature: 'Armature', + animation: 'Test_Start', + loop: true + } + ] } ]) ) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts index fe2758dc4..a9a6f7c97 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts @@ -5,7 +5,7 @@ import { IPreviewController, Mappings, Rarity } from '@dcl/schemas' import { Metrics } from 'modules/models/types' import { Collection } from 'modules/collection/types' import { saveItemRequest, SaveItemRequestAction } from 'modules/item/actions' -import { BodyShapeType, EmoteOutcome, Item, ItemType, SyncStatus } from 'modules/item/types' +import { BodyShapeType, Item, ItemType, OutcomeGroup, SyncStatus } from 'modules/item/types' export enum CreateItemView { IMPORT = 'import', @@ -56,7 +56,7 @@ export type StateData = { modelSize?: number mappings: Mappings blockVrmExport?: boolean - outcomes?: EmoteOutcome[] + outcomes?: OutcomeGroup[] emoteData?: { animations: AnimationClip[] armatures: Object3D[] From 48745c1d0ae263854c6b8e518b3a1d3cd3de6661 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 17 Sep 2025 18:11:05 -0300 Subject: [PATCH 12/48] fix: Button loading state --- .../EditThumbnailStep/EditThumbnailStep.tsx | 4 ++-- src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx index 19ecdfcea..5e7261157 100644 --- a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx @@ -134,10 +134,10 @@ export default class EditThumbnailStep extends React.PureComponent )}
- - diff --git a/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx index 0f3efe960..c24f8d607 100644 --- a/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx +++ b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx @@ -103,7 +103,7 @@ export const Steps: React.FC = ({ modalContainer }) => { default: return null } - }, [view, state, modalContainer, handleDropAccepted, handleOnScreenshotTaken]) + }, [view, state, modalContainer, isLoading, handleDropAccepted, handleOnScreenshotTaken]) return renderView() } From 87253771ffc182fcb097169b532d054639656e8c Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:13:01 -0300 Subject: [PATCH 13/48] chore: Update dcl-catalyst-client --- package-lock.json | 693 +++++++++++++++++++++++++++++++++++----------- package.json | 3 +- 2 files changed, 536 insertions(+), 160 deletions(-) diff --git a/package-lock.json b/package-lock.json index b834797ac..30e22a880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "classnames": "^2.3.2", "connected-react-router": "^6.9.2", "date-fns": "^2.28.0", - "dcl-catalyst-client": "^21.5.5", + "dcl-catalyst-client": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", "dcl-scene-writer": "^1.1.2", "decentraland": "3.3.0", "decentraland-builder-scripts": "^0.24.0", @@ -51,6 +51,7 @@ "decentraland-ui": "^6.23.1", "decentraland-ui2": "^0.27.0", "ethers": "^5.6.8", + "fast-equals": "^5.3.0", "file-saver": "^2.0.1", "graphql": "^15.8.0", "interface-datastore": "^0.7.0", @@ -651,20 +652,6 @@ "node": ">=6" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", @@ -866,23 +853,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1025,27 +995,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", @@ -2189,6 +2138,40 @@ "npm": ">=3.0.0" } }, + "node_modules/@dcl/asset-packs/node_modules/dcl-catalyst-client": { + "version": "21.8.1", + "resolved": "https://registry.npmjs.org/dcl-catalyst-client/-/dcl-catalyst-client-21.8.1.tgz", + "integrity": "sha512-VtYSBDmiHOFdAl3qzi2CtEUJ8VlJqQ6uTZXYTZ6pCgT/lQnxYkdB0VCVfSfqNo9OD+S7dYeayQ2n+Uap32K0AA==", + "license": "Apache-2.0", + "dependencies": { + "@dcl/catalyst-contracts": "^4.4.0", + "@dcl/crypto": "^3.4.0", + "@dcl/hashing": "^3.0.0", + "@dcl/schemas": "^11.5.0", + "@well-known-components/fetch-component": "^2.0.0", + "cookie": "^0.5.0", + "cross-fetch": "^3.1.5", + "form-data": "^4.0.0" + } + }, + "node_modules/@dcl/asset-packs/node_modules/dcl-catalyst-client/node_modules/@dcl/hashing": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@dcl/hashing/-/hashing-3.0.4.tgz", + "integrity": "sha512-Cg+MoIOn+BYmQV2q8zSFnNYY+GldlnUazwBnfgrq3i66ZxOaZ65h01btd8OUtSAlfWG4VTNIOHDjtKqmuwJNBg==", + "license": "Apache-2.0" + }, + "node_modules/@dcl/asset-packs/node_modules/dcl-catalyst-client/node_modules/@dcl/schemas": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-11.12.0.tgz", + "integrity": "sha512-L04KTucvxSnrHDAl3/rnkzhjfZ785dSSPeKarBVfzyuw41uyQ0Mh4HVFWjX9hC+f/nMpM5Adg5udlT5efmepcA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-keywords": "^5.1.0", + "mitt": "^3.0.1" + } + }, "node_modules/@dcl/asset-packs/node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", @@ -2722,9 +2705,10 @@ "integrity": "sha512-n7BTTOyeFJbZicGcLGzhFlVx7I+kVYOgJlFDaFYecdR2iGBLa1Y2sFLrTpMbSHJpt9dIPGdNbdmpEhDgQpWI+w==" }, "node_modules/@dcl/catalyst-contracts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@dcl/catalyst-contracts/-/catalyst-contracts-4.3.1.tgz", - "integrity": "sha512-wOaIG/RwsKniQu1wDhigiQHDbfYMSu9Ifk7PToLMA01ellPrF0CZK06vGJLtXlahaXfUbv94N03teS7kYRORLA==" + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@dcl/catalyst-contracts/-/catalyst-contracts-4.4.2.tgz", + "integrity": "sha512-gJZo3IB8U+jhBJWR0DgoLS+zaUDIb/u79e7Rp+MEM78uH3bvC19S3Dd8lxWEbPXNKlCB0saUptfK/Buw0c1y2Q==", + "license": "Apache-2.0" }, "node_modules/@dcl/content-hash-tree": { "version": "1.1.4", @@ -3116,6 +3100,40 @@ "npm": ">=3.0.0" } }, + "node_modules/@dcl/sdk-commands/node_modules/dcl-catalyst-client": { + "version": "21.8.1", + "resolved": "https://registry.npmjs.org/dcl-catalyst-client/-/dcl-catalyst-client-21.8.1.tgz", + "integrity": "sha512-VtYSBDmiHOFdAl3qzi2CtEUJ8VlJqQ6uTZXYTZ6pCgT/lQnxYkdB0VCVfSfqNo9OD+S7dYeayQ2n+Uap32K0AA==", + "license": "Apache-2.0", + "dependencies": { + "@dcl/catalyst-contracts": "^4.4.0", + "@dcl/crypto": "^3.4.0", + "@dcl/hashing": "^3.0.0", + "@dcl/schemas": "^11.5.0", + "@well-known-components/fetch-component": "^2.0.0", + "cookie": "^0.5.0", + "cross-fetch": "^3.1.5", + "form-data": "^4.0.0" + } + }, + "node_modules/@dcl/sdk-commands/node_modules/dcl-catalyst-client/node_modules/@dcl/hashing": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@dcl/hashing/-/hashing-3.0.4.tgz", + "integrity": "sha512-Cg+MoIOn+BYmQV2q8zSFnNYY+GldlnUazwBnfgrq3i66ZxOaZ65h01btd8OUtSAlfWG4VTNIOHDjtKqmuwJNBg==", + "license": "Apache-2.0" + }, + "node_modules/@dcl/sdk-commands/node_modules/dcl-catalyst-client/node_modules/@dcl/schemas": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-11.12.0.tgz", + "integrity": "sha512-L04KTucvxSnrHDAl3/rnkzhjfZ785dSSPeKarBVfzyuw41uyQ0Mh4HVFWjX9hC+f/nMpM5Adg5udlT5efmepcA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-keywords": "^5.1.0", + "mitt": "^3.0.1" + } + }, "node_modules/@dcl/sdk-commands/node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", @@ -7454,6 +7472,7 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -7472,6 +7491,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -7637,7 +7657,8 @@ "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9041,6 +9062,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9050,22 +9072,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -9073,12 +9099,14 @@ "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -9086,12 +9114,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9103,6 +9133,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -9111,6 +9142,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -9118,12 +9150,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9139,6 +9173,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9151,6 +9186,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9162,6 +9198,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -9175,6 +9212,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -9188,6 +9226,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -9304,12 +9343,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/abab": { "version": "2.0.6", @@ -9820,6 +9861,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9828,6 +9870,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9836,6 +9879,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9873,6 +9917,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9886,6 +9931,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -9896,7 +9942,8 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -9915,6 +9962,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9929,6 +9977,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, "funding": [ { "type": "individual", @@ -9963,6 +10012,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -10400,6 +10450,7 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -10425,6 +10476,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -10436,6 +10488,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10558,7 +10611,8 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, "node_modules/bn.js": { "version": "5.2.1", @@ -10625,6 +10679,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -10635,6 +10690,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -10646,6 +10702,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -10655,6 +10712,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -10674,6 +10732,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "dependencies": { "pako": "~1.0.5" } @@ -10821,7 +10880,8 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true }, "node_modules/cac": { "version": "6.7.14", @@ -10836,6 +10896,7 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -10858,6 +10919,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10866,12 +10928,14 @@ "node_modules/cacache/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, "node_modules/cacache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10891,6 +10955,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10902,6 +10967,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -10913,6 +10979,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -11040,6 +11107,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -11131,6 +11199,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -11393,6 +11462,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -11550,7 +11620,8 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/component-classes": { "version": "1.2.6", @@ -11564,6 +11635,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -11597,6 +11669,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "engines": [ "node >= 0.8" ], @@ -11610,12 +11683,14 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11629,12 +11704,14 @@ "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -11719,7 +11796,8 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -11730,7 +11808,8 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -11760,6 +11839,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -11772,12 +11852,14 @@ "node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/copy-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11787,6 +11869,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11806,6 +11889,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11817,6 +11901,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11828,6 +11913,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11936,6 +12022,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -11944,7 +12031,8 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", @@ -12032,6 +12120,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -12112,7 +12201,8 @@ "node_modules/cyclist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true }, "node_modules/d": { "version": "1.0.2", @@ -12303,14 +12393,15 @@ } }, "node_modules/dcl-catalyst-client": { - "version": "21.6.1", - "resolved": "https://registry.npmjs.org/dcl-catalyst-client/-/dcl-catalyst-client-21.6.1.tgz", - "integrity": "sha512-OsGvcu3rKn03tWfvfWnk91th4Le/bEUA1aUxYnE53w4ZsW8HHbaJjcBNFXeaZ+9kaQKTWrs8iuwi3B48d2CczA==", + "version": "21.8.2-18010198694.commit-8403888", + "resolved": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", + "integrity": "sha512-G2I6gmbOyNa7tS9MbNpPtp4XTLrfYXe1zSgpIlmWItD0ex1H9aWCWmT55X0/YsqEJUsorb1rkCAaT9YMlytUsw==", + "license": "Apache-2.0", "dependencies": { - "@dcl/catalyst-contracts": "^4.0.2", + "@dcl/catalyst-contracts": "^4.4.0", "@dcl/crypto": "^3.4.0", "@dcl/hashing": "^3.0.0", - "@dcl/schemas": "^9.0.0", + "@dcl/schemas": "19.0.0", "@well-known-components/fetch-component": "^2.0.0", "cookie": "^0.5.0", "cross-fetch": "^3.1.5", @@ -12318,13 +12409,15 @@ } }, "node_modules/dcl-catalyst-client/node_modules/@dcl/schemas": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-9.15.0.tgz", - "integrity": "sha512-nip5rsOcJplNfBWeImwezuHLprM0gLW03kEeqGIvT9J6HnEBTtvIwkk9+NSt7hzFKEvWGI+C23vyNWbG3nU+SQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-19.0.0.tgz", + "integrity": "sha512-v5uDNp0ghVg57bLNmJZpJJBp8nMIRyCWF/t7LU7EL1jCd6frMp3+3gshBAgaeqpV3Kpe3xKcs8Q7tSCLrJQBhw==", + "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", "ajv-errors": "^3.0.0", - "ajv-keywords": "^5.1.0" + "ajv-keywords": "^5.1.0", + "mitt": "^3.0.1" } }, "node_modules/dcl-scene-writer": { @@ -12496,6 +12589,34 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, + "node_modules/decentraland-dapps/node_modules/dcl-catalyst-client": { + "version": "21.8.1", + "resolved": "https://registry.npmjs.org/dcl-catalyst-client/-/dcl-catalyst-client-21.8.1.tgz", + "integrity": "sha512-VtYSBDmiHOFdAl3qzi2CtEUJ8VlJqQ6uTZXYTZ6pCgT/lQnxYkdB0VCVfSfqNo9OD+S7dYeayQ2n+Uap32K0AA==", + "license": "Apache-2.0", + "dependencies": { + "@dcl/catalyst-contracts": "^4.4.0", + "@dcl/crypto": "^3.4.0", + "@dcl/hashing": "^3.0.0", + "@dcl/schemas": "^11.5.0", + "@well-known-components/fetch-component": "^2.0.0", + "cookie": "^0.5.0", + "cross-fetch": "^3.1.5", + "form-data": "^4.0.0" + } + }, + "node_modules/decentraland-dapps/node_modules/dcl-catalyst-client/node_modules/@dcl/schemas": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-11.12.0.tgz", + "integrity": "sha512-L04KTucvxSnrHDAl3/rnkzhjfZ785dSSPeKarBVfzyuw41uyQ0Mh4HVFWjX9hC+f/nMpM5Adg5udlT5efmepcA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.11.0", + "ajv-errors": "^3.0.0", + "ajv-keywords": "^5.1.0", + "mitt": "^3.0.1" + } + }, "node_modules/decentraland-dapps/node_modules/react-intl": { "version": "5.25.1", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-5.25.1.tgz", @@ -12530,21 +12651,6 @@ "node": ">= 4" } }, - "node_modules/decentraland-dapps/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/decentraland-dapps/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -13035,6 +13141,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13094,6 +13201,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -13194,6 +13302,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -13203,7 +13312,8 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -13456,6 +13566,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -13486,6 +13597,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, "dependencies": { "prr": "~1.0.1" }, @@ -13885,6 +13997,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -13896,6 +14009,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -14351,6 +14465,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -14368,6 +14483,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14375,7 +14491,8 @@ "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/expand-template": { "version": "1.1.1", @@ -14410,6 +14527,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -14421,6 +14539,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -14439,6 +14558,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -14450,6 +14570,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -14492,9 +14613,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.0.tgz", + "integrity": "sha512-xwP+dG/in/nJelMOUEQBiIYeOoHKihWPB2sNZ8ZeDbZFoGb1OwTGMggGRgg6CRitNx7kmHgtIz2dOHDQ8Ap7Bw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -14623,7 +14744,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported." + "deprecated": "This module is no longer supported.", + "dev": true }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -14685,6 +14807,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -14698,6 +14821,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -14709,6 +14833,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14721,6 +14846,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -14733,6 +14859,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -14747,6 +14874,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -14758,6 +14886,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, "engines": { "node": ">=4" } @@ -14766,6 +14895,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, "engines": { "node": ">=6" } @@ -14774,6 +14904,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -14785,6 +14916,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -14854,6 +14986,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -14862,12 +14995,14 @@ "node_modules/flush-write-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/flush-write-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14881,12 +15016,14 @@ "node_modules/flush-write-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/flush-write-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -14922,6 +15059,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14991,6 +15129,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, "dependencies": { "map-cache": "^0.2.2" }, @@ -15002,6 +15141,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -15010,12 +15150,14 @@ "node_modules/from2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15029,12 +15171,14 @@ "node_modules/from2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/from2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15061,6 +15205,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -15071,12 +15216,14 @@ "node_modules/fs-write-stream-atomic/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15090,12 +15237,14 @@ "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15209,6 +15358,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15502,6 +15652,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -15515,6 +15666,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -15527,6 +15679,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15538,6 +15691,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15549,6 +15703,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15730,7 +15885,8 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -15823,7 +15979,8 @@ "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true }, "node_modules/ignore": { "version": "5.3.0", @@ -15914,6 +16071,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -15929,7 +16087,8 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true }, "node_modules/inflight": { "version": "1.0.6", @@ -16270,6 +16429,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16350,7 +16510,8 @@ "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", @@ -16378,6 +16539,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16403,6 +16565,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16429,6 +16592,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16791,6 +16955,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18144,7 +18309,8 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -18493,6 +18659,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -18501,6 +18668,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18514,6 +18682,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -18690,6 +18859,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -18698,6 +18868,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -18749,6 +18920,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18757,6 +18929,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, "dependencies": { "object-visit": "^1.0.0" }, @@ -18787,6 +18960,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -18798,12 +18972,14 @@ "node_modules/memory-fs/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/memory-fs/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18817,12 +18993,14 @@ "node_modules/memory-fs/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/memory-fs/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -18876,6 +19054,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -18887,7 +19066,8 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/mime": { "version": "3.0.0", @@ -18999,6 +19179,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -19019,6 +19200,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -19029,12 +19211,14 @@ "node_modules/mississippi/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/mississippi/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19048,12 +19232,14 @@ "node_modules/mississippi/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/mississippi/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19067,6 +19253,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -19079,6 +19266,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19158,6 +19346,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -19170,12 +19359,14 @@ "node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/move-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19185,6 +19376,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19204,6 +19396,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19215,6 +19408,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -19499,6 +19693,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -19516,6 +19711,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -19537,6 +19733,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -19549,6 +19746,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -19561,6 +19759,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -19573,6 +19772,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19589,7 +19789,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/next-tick": { "version": "1.1.0", @@ -19692,6 +19893,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -19722,6 +19924,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" @@ -19731,6 +19934,7 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -19739,6 +19943,7 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -19749,6 +19954,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -19757,27 +19963,32 @@ "node_modules/node-libs-browser/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true }, "node_modules/node-libs-browser/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/node-libs-browser/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19791,12 +20002,14 @@ "node_modules/node-libs-browser/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/node-libs-browser/node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -19806,6 +20019,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -19818,6 +20032,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19825,12 +20040,14 @@ "node_modules/node-libs-browser/node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true }, "node_modules/node-libs-browser/node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -20009,6 +20226,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -20022,6 +20240,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -20073,6 +20292,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, "dependencies": { "isobject": "^3.0.0" }, @@ -20101,6 +20321,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -20218,7 +20439,8 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true }, "node_modules/os-homedir": { "version": "1.0.2", @@ -20320,6 +20542,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -20329,12 +20552,14 @@ "node_modules/parallel-transform/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20348,12 +20573,14 @@ "node_modules/parallel-transform/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/parallel-transform/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20373,6 +20600,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -20425,6 +20653,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20439,6 +20668,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, "optional": true }, "node_modules/path-exists": { @@ -20741,6 +20971,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20749,6 +20980,7 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -20977,6 +21209,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -20990,6 +21223,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -21000,7 +21234,8 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/process": { "version": "0.11.10", @@ -21054,7 +21289,8 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true }, "node_modules/prompts": { "version": "2.4.2", @@ -21156,7 +21392,8 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true }, "node_modules/psl": { "version": "1.9.0", @@ -21168,6 +21405,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21180,7 +21418,8 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/pull-batch": { "version": "1.0.0", @@ -21277,6 +21516,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -21287,6 +21527,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -21297,12 +21538,14 @@ "node_modules/pumpify/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21312,6 +21555,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -21325,12 +21569,14 @@ "node_modules/pumpify/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/pumpify/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -21518,6 +21764,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, "engines": { "node": ">=0.4.x" } @@ -21696,6 +21943,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -22416,6 +22664,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -22428,6 +22677,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -22440,6 +22690,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -22467,12 +22718,14 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, "optional": true }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -22481,6 +22734,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, "engines": { "node": ">=0.10" } @@ -22584,7 +22838,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true }, "node_modules/resolve.exports": { "version": "2.0.2", @@ -22599,6 +22854,7 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, "engines": { "node": ">=0.12" } @@ -22862,6 +23118,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, "dependencies": { "aproba": "^1.1.1" } @@ -22869,7 +23126,8 @@ "node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "node_modules/rxjs": { "version": "7.8.1", @@ -22903,6 +23161,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, "dependencies": { "ret": "~0.1.10" } @@ -22919,7 +23178,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/saxes": { "version": "6.0.0", @@ -23095,6 +23355,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -23136,6 +23397,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -23303,6 +23565,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -23321,6 +23584,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -23334,6 +23598,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -23345,6 +23610,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -23357,6 +23623,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "dependencies": { "kind-of": "^3.2.0" }, @@ -23368,6 +23635,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -23379,6 +23647,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23386,7 +23655,8 @@ "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/socket.io-client": { "version": "4.7.4", @@ -23426,7 +23696,8 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "node_modules/source-map": { "version": "0.5.7", @@ -23440,6 +23711,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -23449,6 +23721,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -23461,6 +23734,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, "engines": { "node": ">=0.10" } @@ -23469,6 +23743,7 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23478,6 +23753,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -23486,7 +23762,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true }, "node_modules/sourcemap-codec": { "version": "1.4.8", @@ -23522,6 +23799,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -23533,6 +23811,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -23545,6 +23824,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -23571,6 +23851,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" } @@ -23617,6 +23898,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -23664,6 +23946,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -23916,6 +24199,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, "engines": { "node": ">=6" } @@ -24093,6 +24377,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -24115,6 +24400,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24130,6 +24416,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -24138,6 +24425,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -24146,6 +24434,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, "engines": { "node": ">=4" } @@ -24153,12 +24442,14 @@ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -24172,6 +24463,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -24180,6 +24472,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -24306,6 +24599,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -24314,12 +24608,14 @@ "node_modules/through2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24333,12 +24629,14 @@ "node_modules/through2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -24355,6 +24653,7 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -24393,7 +24692,8 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true }, "node_modules/to-buffer": { "version": "1.1.1", @@ -24414,6 +24714,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -24425,6 +24726,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -24445,6 +24747,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -24470,6 +24773,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -24482,6 +24786,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -24494,6 +24799,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -24506,6 +24812,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -25067,7 +25374,8 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -25233,6 +25541,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -25247,6 +25556,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -25255,6 +25565,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -25271,6 +25582,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -25283,6 +25595,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -25296,6 +25609,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, "dependencies": { "isarray": "1.0.0" }, @@ -25307,6 +25621,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -25314,7 +25629,8 @@ "node_modules/unset-value/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/unstorage": { "version": "1.12.0", @@ -25414,6 +25730,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, "optional": true, "engines": { "node": ">=4", @@ -25468,12 +25785,14 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true }, "node_modules/url": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -25580,12 +25899,14 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -26216,7 +26537,8 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -26251,6 +26573,7 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -26264,6 +26587,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -26273,6 +26597,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -26283,6 +26608,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -26295,6 +26621,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -26304,6 +26631,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -26326,6 +26654,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -26348,6 +26677,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.2", @@ -26361,6 +26691,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -26377,6 +26708,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -26394,6 +26726,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -26404,6 +26737,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -26416,6 +26750,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -26428,6 +26763,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", @@ -26441,6 +26777,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" @@ -26453,6 +26790,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -26465,6 +26803,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" @@ -26477,12 +26816,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", @@ -26507,6 +26848,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -26520,6 +26862,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "optional": true, "dependencies": { "core-util-is": "~1.0.0", @@ -26535,6 +26878,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -26549,12 +26893,14 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "optional": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -26564,6 +26910,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -26765,6 +27112,7 @@ "version": "4.47.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -26813,6 +27161,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -26822,6 +27171,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -26830,6 +27180,7 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -26841,6 +27192,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -26856,6 +27208,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -26864,6 +27217,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -26872,6 +27226,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -26892,6 +27247,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -26904,6 +27260,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -26916,6 +27273,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -26924,6 +27282,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -26938,6 +27297,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -26950,6 +27310,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -26961,6 +27322,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -26972,6 +27334,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -26982,17 +27345,20 @@ "node_modules/webpack/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/webpack/node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -27002,6 +27368,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -27025,6 +27392,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -27037,6 +27405,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -27050,12 +27419,14 @@ "node_modules/webpack/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -27069,6 +27440,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -27077,6 +27449,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -27269,6 +27642,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, "dependencies": { "errno": "~0.1.7" } @@ -27459,7 +27833,8 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 751d8b4f3..d0209cafd 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "classnames": "^2.3.2", "connected-react-router": "^6.9.2", "date-fns": "^2.28.0", - "dcl-catalyst-client": "^21.5.5", + "dcl-catalyst-client": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", "dcl-scene-writer": "^1.1.2", "decentraland": "3.3.0", "decentraland-builder-scripts": "^0.24.0", @@ -45,6 +45,7 @@ "decentraland-ui": "^6.23.1", "decentraland-ui2": "^0.27.0", "ethers": "^5.6.8", + "fast-equals": "^5.3.0", "file-saver": "^2.0.1", "graphql": "^15.8.0", "interface-datastore": "^0.7.0", From 42ca63bf92a27f770f8da8476635fd51521594c2 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:13:49 -0300 Subject: [PATCH 14/48] feat: Update emote metadata handling outcome types --- src/modules/item/utils.ts | 60 +++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/src/modules/item/utils.ts b/src/modules/item/utils.ts index 79cba41f2..f6b16c25c 100644 --- a/src/modules/item/utils.ts +++ b/src/modules/item/utils.ts @@ -1,4 +1,5 @@ import { constants } from 'ethers' +import { deepEqual } from 'fast-equals' import { LocalItem, MAX_EMOTE_FILE_SIZE, @@ -10,7 +11,7 @@ import { BodyPartCategory, BodyShape, EmoteCategory, - EmoteDataADR74, + EmoteDataADR287, Wearable, Rarity, WearableCategory, @@ -50,7 +51,9 @@ import { WearableRepresentation, GenerateImageOptions, EmotePlayMode, - VIDEO_PATH + VIDEO_PATH, + EmoteOutcomeMetadataType, + EmoteData } from './types' import { getChainIdByNetwork, getSigner } from 'decentraland-dapps/dist/lib' import { getOffChainMarketplaceContract, getTradeSignature } from 'decentraland-dapps/dist/lib/trades' @@ -129,6 +132,23 @@ export function getEmoteAdditionalProperties(item: Item): string return additionalProperties } +export function getEmoteOutcomeType(item: Item): string { + // Validates is a Social Emote + if (!('startAnimation' in item.data)) { + return '' + } + + if (item.data.outcomes.length === 1) { + return EmoteOutcomeMetadataType.SIMPLE_OUTCOME + } + + if (item.data.outcomes.length > 1 && item.data.randomizeOutcomes) { + return EmoteOutcomeMetadataType.RANDOM_OUTCOME + } + + return EmoteOutcomeMetadataType.MULTIPLE_OUTCOME +} + export function getMissingBodyShapeType(item: Item) { const existingBodyShapeType = getBodyShapeType(item) if (existingBodyShapeType === BodyShapeType.MALE) { @@ -224,11 +244,12 @@ export function buildEmoteMetada( category: string, bodyShapeTypes: string, loop: number, - additionalProperties?: string + additionalProperties?: string, + outcomeType?: string ): string { return `${version}:${type}:${name}:${description}:${category}:${bodyShapeTypes}:${loop}${ additionalProperties ? `:${additionalProperties}` : '' - }` + }${outcomeType ? `:${outcomeType}` : ''}` } // Metadata looks like this: @@ -246,12 +267,13 @@ export function getMetadata(item: Item) { return buildItemMetadata(1, getItemMetadataType(item), item.name, item.description, data.category, bodyShapeTypes) } case ItemType.EMOTE: { - const data = item.data as unknown as EmoteDataADR74 + const data = item.data as unknown as EmoteData const bodyShapeTypes = getBodyShapes(item).map(toWearableBodyShapeType).join(',') if (!data.category) { throw new Error(`Unknown item category "${JSON.stringify(item.data)}"`) } const additionalProperties = getEmoteAdditionalProperties(item as unknown as Item) + const outcomeType = getEmoteOutcomeType(item as unknown as Item) return buildEmoteMetada( 1, getItemMetadataType(item), @@ -260,7 +282,8 @@ export function getMetadata(item: Item) { data.category, bodyShapeTypes, data.loop ? 1 : 0, - additionalProperties + additionalProperties, + outcomeType ) } default: @@ -586,24 +609,37 @@ export function isEmoteSynced(item: Item | Item, entity: Entity) throw new Error('Item must be EMOTE') } - // check if metadata has the new schema from ADR 74 + // check if metadata has the new schema from ADR 74 or ADR 287 const isADR74 = 'emoteDataADR74' in entity.metadata - if (!isADR74) { + const isADR287 = 'emoteDataADR287' in entity.metadata + if (!isADR74 && !isADR287) { return false } // check if metadata is synced const catalystItem = entity.metadata - const catalystItemMetadataData = isADR74 ? entity.metadata.emoteDataADR74 : entity.metadata.data - const data = item.data as EmoteDataADR74 - - const hasMetadataChanged = + const catalystItemMetadataData = isADR74 + ? entity.metadata.emoteDataADR74 + : isADR287 + ? entity.metadata.emoteDataADR287 + : entity.metadata.data + const data = item.data as unknown as EmoteData + + let hasMetadataChanged = item.name !== catalystItem.name || item.description !== catalystItem.description || data.category !== catalystItemMetadataData.category || data.loop !== catalystItemMetadataData.loop || data.tags.toString() !== catalystItemMetadataData.tags.toString() + if (isADR287) { + hasMetadataChanged = + hasMetadataChanged || + !deepEqual((data as EmoteDataADR287).startAnimation, catalystItemMetadataData.startAnimation) || + (data as EmoteDataADR287).randomizeOutcomes !== catalystItemMetadataData.randomizeOutcomes || + !deepEqual((data as EmoteDataADR287).outcomes, catalystItemMetadataData.outcomes) + } + if (hasMetadataChanged) { return false } From 9407681d149fa74e9d7c7d59cff8ab187f34b850 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:14:11 -0300 Subject: [PATCH 15/48] fix: Use types from @dcl/schemas --- src/modules/item/types.ts | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/modules/item/types.ts b/src/modules/item/types.ts index 3c701ec35..12f303598 100644 --- a/src/modules/item/types.ts +++ b/src/modules/item/types.ts @@ -2,6 +2,7 @@ import { BuiltItem, Content } from '@dcl/builder-client' import { BodyShape, EmoteDataADR74, + EmoteDataADR287, Wearable, WearableCategory, Rarity, @@ -89,25 +90,6 @@ export type WearableData = { outlineCompatible?: boolean } -// TODO: Replace these types using the ones from @dcl/schemas - -export type EmoteClip = { - armature: string - animation: string - loop: boolean -} - -export type OutcomeGroup = { - title: string - clips: EmoteClip[] -} - -export type EmoteDataADR287 = EmoteDataADR74 & { - startAnimation: EmoteClip[] - randomizeOutcomes: boolean - outcomes: OutcomeGroup[] -} - export type EmoteData = EmoteDataADR74 | EmoteDataADR287 type BaseItem = { @@ -160,7 +142,8 @@ export const isEmoteItemType = (item: Item | Item): item is Item (item as Item).type === ItemType.EMOTE export const isEmoteDataADR287 = (data: EmoteData): data is EmoteDataADR287 => (data as EmoteDataADR287).outcomes !== undefined -export const isEmoteData = (data: WearableData | EmoteData): data is EmoteData => (data as EmoteData).loop !== undefined +export const isEmoteData = (data: WearableData | EmoteData | undefined): data is EmoteData => + !!data && (data as unknown as EmoteData).loop !== undefined export enum Currency { MANA = 'MANA', From f1a4c70e82a7f6391b3a01cb592a7e058b823fc0 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:15:21 -0300 Subject: [PATCH 16/48] feat: Build emote entity metadata using ADR287 schema --- src/modules/editor/utils.ts | 39 ++++++++++++++++++++++---------- src/modules/item/export.ts | 44 +++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/modules/editor/utils.ts b/src/modules/editor/utils.ts index 03ae7bc45..181d5010e 100644 --- a/src/modules/editor/utils.ts +++ b/src/modules/editor/utils.ts @@ -1,6 +1,6 @@ import type { Wearable } from 'decentraland-ecs' import { Locale, BodyShape, WearableCategory, WearableDefinition, EmoteDefinition } from '@dcl/schemas' -import { Item, ItemType } from 'modules/item/types' +import { isEmoteDataADR287, Item, ItemType } from 'modules/item/types' import { CatalystWearable, EditorScene, UnityKeyboardEvent } from 'modules/editor/types' import { Project } from 'modules/project/types' import { getSceneDefinition } from 'modules/project/export' @@ -198,7 +198,7 @@ export const getName = (wearable: Wearable) => { return !isNumeric || part <= 0 ? strPart : null }) .filter(part => part != null) // Filter out ignored parts - .map(part => capitalize(part!)) + .map(part => capitalize(part)) .join(' ') } @@ -324,15 +324,32 @@ export function toEmote(item: Item): EmoteDefinition { text: item.name } ], - emoteDataADR74: { - ...item.data, - category: item.data.category, - representations: item.data.representations.map(representation => ({ - ...representation, - contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) - })), - loop: item.data.loop - } + ...(isEmoteDataADR287(item.data) + ? { + emoteDataADR287: { + ...item.data, + category: item.data.category, + representations: item.data.representations.map(representation => ({ + ...representation, + contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) + })), + loop: item.data.loop, + startAnimation: item.data.startAnimation, + randomizeOutcomes: item.data.randomizeOutcomes, + outcomes: item.data.outcomes + } + } + : { + emoteDataADR74: { + ...item.data, + category: item.data.category, + representations: item.data.representations.map(representation => ({ + ...representation, + contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) + })), + loop: item.data.loop + } + }) } } diff --git a/src/modules/item/export.ts b/src/modules/item/export.ts index 1f52846c9..fc0128755 100644 --- a/src/modules/item/export.ts +++ b/src/modules/item/export.ts @@ -1,4 +1,4 @@ -import { Emote, EntityType, Locale, Rarity, Wearable, WearableCategory, WearableRepresentation } from '@dcl/schemas' +import { Emote, EmoteDataADR287, EntityType, Locale, Rarity, Wearable, WearableCategory, WearableRepresentation } from '@dcl/schemas' import { DeploymentPreparationData, buildEntity } from 'dcl-catalyst-client/dist/client/utils/DeploymentBuilder' import { MerkleDistributorInfo } from '@dcl/content-hash-tree/dist/types' import { calculateMultipleHashesADR32, calculateMultipleHashesADR32LegacyQmHash } from '@dcl/hashing' @@ -6,7 +6,7 @@ import { BuilderAPI } from 'lib/api/builder' import { buildCatalystItemURN } from 'lib/urn' import { makeContentFiles, computeHashes } from 'modules/deployment/contentUtils' import { Collection } from 'modules/collection/types' -import { Item, IMAGE_PATH, THUMBNAIL_PATH, ItemType, EntityHashingType, isEmoteItemType, VIDEO_PATH } from './types' +import { Item, IMAGE_PATH, THUMBNAIL_PATH, ItemType, EntityHashingType, isEmoteItemType, VIDEO_PATH, isEmoteDataADR287 } from './types' import { EMPTY_ITEM_METRICS, generateCatalystImage, generateImage } from './utils' /** @@ -222,6 +222,36 @@ function buildADR74EmoteEntityMetadata(collection: Collection, item: Item): Emote { + if (!collection.contractAddress || !item.tokenId) { + throw new Error('You need the collection and item to be published') + } + + // The order of the metadata properties can't be changed. Changing it will result in a different content hash. + const catalystItem: Emote = { + id: buildCatalystItemURN(collection.contractAddress, item.tokenId), + name: item.name, + description: item.description, + collectionAddress: collection.contractAddress, + rarity: item.rarity! as unknown as Rarity, + i18n: [{ code: Locale.EN, text: item.name }], + emoteDataADR287: { + category: item.data.category, + representations: item.data.representations, + tags: item.data.tags, + loop: item.data.loop, + startAnimation: (item.data as EmoteDataADR287).startAnimation, + randomizeOutcomes: (item.data as EmoteDataADR287).randomizeOutcomes, + outcomes: (item.data as EmoteDataADR287).outcomes + }, + image: IMAGE_PATH, + thumbnail: THUMBNAIL_PATH, + metrics: EMPTY_ITEM_METRICS + } + console.log('generating emote metadata for ADR 287', { catalystItem }) + return catalystItem +} + async function buildItemEntityContent(item: Item): Promise> { const contents = { ...item.contents } if (!item.contents[IMAGE_PATH]) { @@ -260,7 +290,9 @@ export async function buildItemEntity( let metadata const isEmote = isEmoteItemType(item) //TODO: @Emotes remove this FF once launched if (isEmote) { - metadata = buildADR74EmoteEntityMetadata(collection, item) + metadata = isEmoteDataADR287(item.data) + ? buildADR287EmoteEntityMetadata(collection, item) + : buildADR74EmoteEntityMetadata(collection, item) } else if (tree && itemHash) { metadata = buildTPItemEntityMetadata(item, itemHash, tree) } else { @@ -301,7 +333,11 @@ export async function buildStandardWearableContentHash( ): Promise { const hashes = await buildItemEntityContent(item) const content = Object.keys(hashes).map(file => ({ file, hash: hashes[file] })) - const metadata = isEmoteItemType(item) ? buildADR74EmoteEntityMetadata(collection, item) : buildWearableEntityMetadata(collection, item) + const metadata = isEmoteItemType(item) + ? isEmoteDataADR287(item.data) + ? buildADR287EmoteEntityMetadata(collection, item) + : buildADR74EmoteEntityMetadata(collection, item) + : buildWearableEntityMetadata(collection, item) if (hashingType === EntityHashingType.V0) { return (await calculateMultipleHashesADR32LegacyQmHash(content, metadata)).hash } else { From 14db2312b7e247f70448291ed874e9b6ffe525fb Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:16:38 -0300 Subject: [PATCH 17/48] fix: Update social emote structure --- .../CreateSingleItemModal.tsx | 72 +++++++----- .../Modals/CreateSingleItemModal/utils.ts | 111 ++++++++++++++++++ src/lib/getModelData.ts | 6 +- 3 files changed, 155 insertions(+), 34 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index b4a8ad0d0..654ae9f19 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -1,6 +1,16 @@ import React, { useReducer, useRef, useCallback, useMemo } from 'react' import { ethers } from 'ethers' -import { BodyPartCategory, BodyShape, EmoteCategory, Rarity, PreviewProjection, WearableCategory, IPreviewController } from '@dcl/schemas' +import { + BodyPartCategory, + BodyShape, + EmoteCategory, + Rarity, + PreviewProjection, + WearableCategory, + IPreviewController, + ArmatureId, + EmoteDataADR287 +} from '@dcl/schemas' import { MAX_EMOTE_FILE_SIZE, MAX_SKIN_FILE_SIZE, @@ -24,8 +34,7 @@ import { VIDEO_PATH, WearableData, SyncStatus, - EmoteData, - EmoteDataADR287 + EmoteData } from 'modules/item/types' import { areEmoteMetrics, Metrics } from 'modules/models/types' import { computeHashes } from 'modules/deployment/contentUtils' @@ -59,6 +68,7 @@ import { areMappingsValid } from 'modules/thirdParty/utils' import { Authorization } from 'lib/api/auth' import { BUILDER_SERVER_URL, BuilderAPI } from 'lib/api/builder' import { + autocompleteEmoteData, buildRepresentations, buildRepresentationsZipBothBodyshape, getLinkedContract, @@ -68,7 +78,15 @@ import { toWearableWithBlobs } from './utils' import { createItemReducer, createItemActions, createInitialState } from './CreateSingleItemModal.reducer' -import { Props, State, CreateItemView, StateData, SortedContent, AcceptedFileProps } from './CreateSingleItemModal.types' +import { + Props, + State, + CreateItemView, + StateData, + SortedContent, + AcceptedFileProps, + CreateSingleItemModalMetadata +} from './CreateSingleItemModal.types' import { Steps } from './Steps' import { CreateSingleItemModalProvider } from './CreateSingleItemModalProvider' import './CreateSingleItemModal.css' @@ -149,29 +167,26 @@ export const CreateSingleItemModal: React.FC = props => { if (outcomes && outcomes.length > 0) { data = { ...data, - startAnimation: [ - { - armature: 'Armature', + startAnimation: { + [ArmatureId.Armature]: { animation: 'HighFive_Start', loop: true } - ], + }, randomizeOutcomes: false, outcomes: [ { title: 'High Five', - clips: [ - { - armature: 'Armature', + clips: { + [ArmatureId.Armature]: { animation: 'HighFive_Avatar', loop: false }, - { - armature: 'Armature_Other', + [ArmatureId.Armature_Other]: { animation: 'HighFive_AvatarOther', loop: false } - ] + } } ] } @@ -396,7 +411,7 @@ export const CreateSingleItemModal: React.FC = props => { /** * Gets the modal title based on state and metadata */ - const getModalTitle = (state: State, metadata: any, isAddingRepresentation: boolean): string => { + const getModalTitle = (state: State, metadata: CreateSingleItemModalMetadata, isAddingRepresentation: boolean): string => { const { type, view, contents } = state if (isAddingRepresentation) { @@ -697,22 +712,17 @@ export const CreateSingleItemModal: React.FC = props => { dispatch(createItemActions.setView(view)) if (areEmoteMetrics(data.metrics) && data.metrics.additionalArmatures) { // required? - // dispatch(createItemActions.setEmoteData({ animations: data.animations ?? [], armatures: data.armatures! })) - // TODO: Remove this once the RightPanel is updated - dispatch( - createItemActions.setOutcomes([ - { - title: 'Test', - clips: [ - { - armature: 'Armature', - animation: 'Test_Start', - loop: true - } - ] - } - ]) - ) + dispatch(createItemActions.setEmoteData({ animations: data.animations ?? [], armatures: data.armatures! })) + + // Extract animation names from AnimationClip objects + const animationNames = (data.animations ?? []).map(clip => clip.name) + + // Autocomplete emote data based on animation naming conventions + const autocompletedData = autocompleteEmoteData(animationNames) + + if (autocompletedData.outcomes) { + dispatch(createItemActions.setOutcomes(autocompletedData.outcomes)) + } } dispatch(createItemActions.setLoading(false)) } diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index a952fbf0a..f690cb152 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -288,3 +288,114 @@ export const getLinkedContract = (collection: Collection | undefined | null): Li network: collection.linkedContractNetwork } } + +/** + * Maps animation suffixes to their corresponding armature names + */ +const ANIMATION_TO_ARMATURE_MAP = { + Avatar: 'Armature', + AvatarOther: 'Armature_Other', + Prop: 'Armature_Prop' +} as const + +/** + * Extracts the base name from an animation name by removing the suffix + */ +const getBaseAnimationName = (animationName: string): string => { + // Remove common suffixes to get the base name + const suffixes = ['_Start', '_Avatar', '_AvatarOther', '_Prop', '_Prop_Start'] + + for (const suffix of suffixes) { + if (animationName.endsWith(suffix)) { + return animationName.slice(0, -suffix.length) + } + } + + return animationName +} + +/** + * Gets the armature name based on the animation name suffix + */ +const getArmatureFromAnimation = (animationName: string): string => { + if (animationName.endsWith('_AvatarOther')) { + return ANIMATION_TO_ARMATURE_MAP.AvatarOther + } + if (animationName.endsWith('_Prop') || animationName.endsWith('_Prop_Start')) { + return ANIMATION_TO_ARMATURE_MAP.Prop + } + // Default to Avatar for _Avatar, _Start, or no suffix + return ANIMATION_TO_ARMATURE_MAP.Avatar +} + +/** + * Formats the base animation name into a title (e.g., "HighFive" -> "High Five") + */ +const formatAnimationTitle = (baseName: string): string => { + // Convert camelCase/PascalCase to title case + return baseName + .replace(/([A-Z])/g, ' $1') // Add space before capital letters + .replace(/^./, str => str.toUpperCase()) // Capitalize first letter + .trim() +} + +/** + * Autocompletes emote data based on animation naming conventions + */ +export const autocompleteEmoteData = (animations: string[]) => { + const startAnimations: Array<{ armature: string; animation: string; loop: boolean }> = [] + const outcomes: Array<{ title: string; clips: Array<{ armature: string; animation: string; loop: boolean }> }> = [] + + // Group animations by base name + const animationGroups = new Map() + + animations.forEach(animation => { + const baseName = getBaseAnimationName(animation) + if (!animationGroups.has(baseName)) { + animationGroups.set(baseName, []) + } + animationGroups.get(baseName)!.push(animation) + }) + + // Process each group + animationGroups.forEach((groupAnimations, baseName) => { + const title = formatAnimationTitle(baseName) + + // Find start animations + const startAnimation = groupAnimations.find(anim => anim.endsWith('_Start')) + if (startAnimation) { + const armature = getArmatureFromAnimation(startAnimation) + startAnimations.push({ + armature, + animation: startAnimation, + loop: true + }) + } + + // Find outcome animations (non-start animations) + const outcomeAnimations = groupAnimations.filter(anim => !anim.endsWith('_Start')) + if (outcomeAnimations.length > 0) { + const clips = outcomeAnimations.map(animation => ({ + armature: getArmatureFromAnimation(animation), + animation, + loop: true + })) + + outcomes.push({ + title, + clips + }) + } + }) + + return { + startAnimation: + startAnimations.length > 0 + ? { + avatar: startAnimations.find(s => s.armature === 'Armature') || startAnimations[0], + prop: startAnimations.find(s => s.armature === 'Armature_Prop') + } + : undefined, + outcomes: outcomes.length > 0 ? outcomes : undefined + } +} diff --git a/src/lib/getModelData.ts b/src/lib/getModelData.ts index a1d6ec6ed..d1cea80c2 100644 --- a/src/lib/getModelData.ts +++ b/src/lib/getModelData.ts @@ -42,11 +42,11 @@ export const defaults: Options = { thumbnailType: ThumbnailType.DEFAULT } -const ARMATURE_PREFIX = 'Armature_' +const ARMATURE_PREFIX = 'Armature' enum ARMATURES { - PROP = ARMATURE_PREFIX + 'Prop', - OTHER = ARMATURE_PREFIX + 'Other' + PROP = ARMATURE_PREFIX + '_Prop', + OTHER = ARMATURE_PREFIX + '_Other' } async function loadGltf(url: string, options: Partial = {}) { From ef29bd4e8e6e22ada0e5fb20203bc2f2a2037078 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Thu, 25 Sep 2025 11:22:59 -0300 Subject: [PATCH 18/48] fix: catalyst-client lib --- package-lock.json | 21 ++++++++++----------- package.json | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30e22a880..542ad08d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "classnames": "^2.3.2", "connected-react-router": "^6.9.2", "date-fns": "^2.28.0", - "dcl-catalyst-client": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", + "dcl-catalyst-client": "^21.5.5", "dcl-scene-writer": "^1.1.2", "decentraland": "3.3.0", "decentraland-builder-scripts": "^0.24.0", @@ -12393,15 +12393,15 @@ } }, "node_modules/dcl-catalyst-client": { - "version": "21.8.2-18010198694.commit-8403888", - "resolved": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", - "integrity": "sha512-G2I6gmbOyNa7tS9MbNpPtp4XTLrfYXe1zSgpIlmWItD0ex1H9aWCWmT55X0/YsqEJUsorb1rkCAaT9YMlytUsw==", + "version": "21.5.5", + "resolved": "https://registry.npmjs.org/dcl-catalyst-client/-/dcl-catalyst-client-21.5.5.tgz", + "integrity": "sha512-VXIypnUl4czyo+vTH0L082YgTqA5fKu/1Y5yusZ7bhuUs/uxgNsGSc35blqjUY67GaG4R7XaSOwn6jA3dzxPfg==", "license": "Apache-2.0", "dependencies": { - "@dcl/catalyst-contracts": "^4.4.0", + "@dcl/catalyst-contracts": "^4.0.2", "@dcl/crypto": "^3.4.0", "@dcl/hashing": "^3.0.0", - "@dcl/schemas": "19.0.0", + "@dcl/schemas": "^9.0.0", "@well-known-components/fetch-component": "^2.0.0", "cookie": "^0.5.0", "cross-fetch": "^3.1.5", @@ -12409,15 +12409,14 @@ } }, "node_modules/dcl-catalyst-client/node_modules/@dcl/schemas": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-19.0.0.tgz", - "integrity": "sha512-v5uDNp0ghVg57bLNmJZpJJBp8nMIRyCWF/t7LU7EL1jCd6frMp3+3gshBAgaeqpV3Kpe3xKcs8Q7tSCLrJQBhw==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-9.15.0.tgz", + "integrity": "sha512-nip5rsOcJplNfBWeImwezuHLprM0gLW03kEeqGIvT9J6HnEBTtvIwkk9+NSt7hzFKEvWGI+C23vyNWbG3nU+SQ==", "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", "ajv-errors": "^3.0.0", - "ajv-keywords": "^5.1.0", - "mitt": "^3.0.1" + "ajv-keywords": "^5.1.0" } }, "node_modules/dcl-scene-writer": { diff --git a/package.json b/package.json index d0209cafd..80dbea854 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "classnames": "^2.3.2", "connected-react-router": "^6.9.2", "date-fns": "^2.28.0", - "dcl-catalyst-client": "https://sdk-team-cdn.decentraland.org/@dcl/catalyst-client/branch/feat/add-social-emote/dcl-catalyst-client-21.8.2-18010198694.commit-8403888.tgz", + "dcl-catalyst-client": "^21.5.5", "dcl-scene-writer": "^1.1.2", "decentraland": "3.3.0", "decentraland-builder-scripts": "^0.24.0", From 5b1129d69c5ae4cc18703cdd7d293fe799d16d6d Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Fri, 26 Sep 2025 18:50:49 -0300 Subject: [PATCH 19/48] fix: Animation data --- src/components/ItemProvider/ItemProvider.tsx | 100 +++++++++++++++++- .../ItemProvider/ItemProvider.types.ts | 11 +- .../CreateSingleItemModal.tsx | 69 +++++++----- 3 files changed, 152 insertions(+), 28 deletions(-) diff --git a/src/components/ItemProvider/ItemProvider.tsx b/src/components/ItemProvider/ItemProvider.tsx index dbb7c7133..40818215f 100644 --- a/src/components/ItemProvider/ItemProvider.tsx +++ b/src/components/ItemProvider/ItemProvider.tsx @@ -1,9 +1,16 @@ import * as React from 'react' +import { getEmoteData } from 'lib/getModelData' import { Props, State } from './ItemProvider.types' +import { Item } from 'modules/item/types' export default class ItemProvider extends React.PureComponent { state: State = { - loadedItemId: undefined + loadedItemId: undefined, + animationData: { + animations: [], + armatures: [], + isLoaded: false + } } componentDidMount() { @@ -15,9 +22,14 @@ export default class ItemProvider extends React.PureComponent { if (isConnected && id && item?.collectionId && !collection) { onFetchCollection(item.collectionId) } + + // Load animation data if item is available + if (isConnected && id && item) { + void this.loadAnimationData(item) + } } - componentDidUpdate() { + componentDidUpdate(prevProps: Props) { const { id, item, collection, onFetchItem, onFetchCollection, isConnected } = this.props const { loadedItemId } = this.state @@ -27,10 +39,92 @@ export default class ItemProvider extends React.PureComponent { if (isConnected && id && item?.collectionId && !collection) { onFetchCollection(item.collectionId) } + + // Load animation data when item changes + if (isConnected && id && item && item.id !== prevProps.item?.id) { + void this.loadAnimationData(item) + } + } + + private findGlbFile(contents: Record): { path: string; hash: string } | null { + // Look for GLB/GLTF files in the contents + for (const [path, hash] of Object.entries(contents)) { + if (path.endsWith('.glb') || path.endsWith('.gltf')) { + return { path, hash } + } + } + return null + } + + private async fetchGlbBlob(hash: string): Promise { + const { getContentsStorageUrl } = await import('lib/api/builder') + const url = getContentsStorageUrl(hash) + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Failed to fetch GLB file: ${response.statusText}`) + } + return response.blob() + } + + private async loadAnimationData(item: Item) { + if (item.type !== 'emote') { + return + } + + this.setState(prev => ({ + ...prev, + animationData: { + animations: [], + armatures: [], + isLoaded: false + } + })) + + try { + const glbFile = this.findGlbFile(item.contents) + if (!glbFile) { + this.setState(prev => ({ + ...prev, + animationData: { + animations: [], + armatures: [], + isLoaded: true, + error: 'No GLB/GLTF file found' + } + })) + return + } + + // Fetch the blob and get emote data + const blob = await this.fetchGlbBlob(glbFile.hash) + const data = await getEmoteData(URL.createObjectURL(blob)) + + console.log('Loaded animation data:', data) + + this.setState(prev => ({ + ...prev, + animationData: { + animations: data.animations || [], + armatures: data.armatures || [], + isLoaded: true + } + })) + } catch (error) { + this.setState(prev => ({ + ...prev, + animationData: { + animations: [], + armatures: [], + isLoaded: true, + error: error instanceof Error ? error.message : 'Unknown error' + } + })) + } } render() { const { item, collection, isLoading, children } = this.props - return <>{children(item, collection, isLoading)} + const { animationData } = this.state + return <>{children(item, collection, isLoading, animationData)} } } diff --git a/src/components/ItemProvider/ItemProvider.types.ts b/src/components/ItemProvider/ItemProvider.types.ts index 91222660b..29478d7b9 100644 --- a/src/components/ItemProvider/ItemProvider.types.ts +++ b/src/components/ItemProvider/ItemProvider.types.ts @@ -1,6 +1,14 @@ +import { AnimationClip, Object3D } from 'three' import { Item } from 'modules/item/types' import { Collection } from 'modules/collection/types' +export type AnimationData = { + animations: AnimationClip[] + armatures: Object3D[] + isLoaded: boolean + error?: string +} + export type Props = { item: Item | null collection: Collection | null @@ -9,10 +17,11 @@ export type Props = { id: string | null onFetchItem: (id: string) => void onFetchCollection: (id: string) => void - children: (item: Item | null, collection: Collection | null, isLoading: boolean) => React.ReactNode + children: (item: Item | null, collection: Collection | null, isLoading: boolean, animationData: AnimationData) => React.ReactNode } export type State = { loadedItemId: string | undefined + animationData: AnimationData } export type ContainerProps = Pick diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 654ae9f19..b5dfcb0af 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -123,7 +123,7 @@ export const CreateSingleItemModal: React.FC = props => { tags, blockVrmExport, mappings, - outcomes + emoteData } = state as StateData const belongsToAThirdPartyCollection = collection?.urn && isThirdParty(collection?.urn) @@ -163,32 +163,53 @@ export const CreateSingleItemModal: React.FC = props => { } as EmoteData // ADR 287 - Social Emotes - // Hardcoded for testing purposes but should be removed later - if (outcomes && outcomes.length > 0) { - data = { - ...data, - startAnimation: { - [ArmatureId.Armature]: { - animation: 'HighFive_Start', - loop: true + // Use autocompleteEmoteData to generate startAnimation and outcomes from available animations + if (emoteData?.animations && emoteData.animations.length > 0) { + const animationNames = emoteData.animations.map(clip => clip.name) + const autocompletedData = autocompleteEmoteData(animationNames) + + if (autocompletedData.startAnimation || autocompletedData.outcomes) { + const socialEmoteData: Partial = {} + + // Transform startAnimation if available + if (autocompletedData.startAnimation) { + socialEmoteData.startAnimation = { + [ArmatureId.Armature]: { + animation: autocompletedData.startAnimation.avatar.animation, + loop: autocompletedData.startAnimation.avatar.loop + } } - }, - randomizeOutcomes: false, - outcomes: [ - { - title: 'High Five', - clips: { - [ArmatureId.Armature]: { - animation: 'HighFive_Avatar', - loop: false - }, - [ArmatureId.Armature_Other]: { - animation: 'HighFive_AvatarOther', - loop: false - } + + // Add prop animation if available + if (autocompletedData.startAnimation.prop) { + socialEmoteData.startAnimation[ArmatureId.Armature_Prop] = { + animation: autocompletedData.startAnimation.prop.animation, + loop: autocompletedData.startAnimation.prop.loop } } - ] + } + + // Transform outcomes if available + if (autocompletedData.outcomes) { + socialEmoteData.outcomes = autocompletedData.outcomes.map(outcome => ({ + title: outcome.title, + clips: outcome.clips.reduce((clips, clip) => { + clips[clip.armature as ArmatureId] = { + animation: clip.animation, + loop: clip.loop + } + return clips + }, {} as Partial>) + })) + } + + // Add randomizeOutcomes flag + socialEmoteData.randomizeOutcomes = false + + data = { + ...data, + ...socialEmoteData + } } } } From 1dcd3063cfb6310da3307ddfe3bc4c9b5afc8122 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Fri, 26 Sep 2025 18:51:47 -0300 Subject: [PATCH 20/48] chore: Use AP1 catalyst server --- src/config/env/dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/env/dev.json b/src/config/env/dev.json index 6f9abddb5..43088e682 100644 --- a/src/config/env/dev.json +++ b/src/config/env/dev.json @@ -3,7 +3,7 @@ "ENVIRONMENT": "development", "LOCAL_STORAGE_KEY": "builder", "EMAIL_SERVER_URL": "https://subscription.decentraland.org/subscribe", - "PEER_URL": "https://peer.decentraland.zone", + "PEER_URL": "https://peer-ap1.decentraland.zone", "ERC721_COLLECTION_BASE_URI": "https://peer.decentraland.zone/lambdas/collections/standard/erc721/", "BUILDER_SERVER_URL": "https://builder-api.decentraland.zone/v1", "MARKETPLACE_URL": "https://api.decentraland.zone/v1", From cbdff8faf65f6242c2bee61ab2ddcb8e0f38aa10 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 29 Sep 2025 11:48:11 -0300 Subject: [PATCH 21/48] chore: test vercel command --- vercel.json | 1 + 1 file changed, 1 insertion(+) diff --git a/vercel.json b/vercel.json index 9ce528cf1..c33d9b226 100644 --- a/vercel.json +++ b/vercel.json @@ -9,6 +9,7 @@ "VITE_REACT_APP_DCL_DEFAULT_ENV": "dev" } }, + "buildCommand": "npm ci --legacy-peer-deps && npm run build", "rewrites": [ { "source": "/auth/:match*", From 4acd06c0ee38e571060213ddc16962bcb8733c84 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 29 Sep 2025 11:55:06 -0300 Subject: [PATCH 22/48] fix: vercel json --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index c33d9b226..5d76a7bad 100644 --- a/vercel.json +++ b/vercel.json @@ -9,7 +9,7 @@ "VITE_REACT_APP_DCL_DEFAULT_ENV": "dev" } }, - "buildCommand": "npm ci --legacy-peer-deps && npm run build", + "installCommand": "npm ci --legacy-peer-deps", "rewrites": [ { "source": "/auth/:match*", From a464eb8f81eba5b0dbcd6067634ff91c136c95fa Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 29 Sep 2025 12:43:07 -0300 Subject: [PATCH 23/48] fix: types --- .../CreateSingleItemModal.reducer.ts | 4 +- .../CreateSingleItemModal.tsx | 30 +--- .../CreateSingleItemModal.types.ts | 4 +- .../EditThumbnailStep/EditThumbnailStep.tsx | 2 +- .../CreateSingleItemModal/utils.spec.ts | 169 ++++++++++++++++++ .../Modals/CreateSingleItemModal/utils.ts | 45 +++-- 6 files changed, 204 insertions(+), 50 deletions(-) create mode 100644 src/components/Modals/CreateSingleItemModal/utils.spec.ts diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts index 24a4a9b53..396648336 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts @@ -1,6 +1,6 @@ import { AnimationClip, Object3D } from 'three' -import { EmotePlayMode, Rarity, WearableCategory, Mapping, ContractNetwork, ContractAddress } from '@dcl/schemas' -import { Item, BodyShapeType, ItemType, OutcomeGroup } from 'modules/item/types' +import { EmotePlayMode, Rarity, WearableCategory, Mapping, ContractNetwork, ContractAddress, OutcomeGroup } from '@dcl/schemas' +import { Item, BodyShapeType, ItemType } from 'modules/item/types' import { Metrics } from 'modules/models/types' import { CreateItemView, State, AcceptedFileProps, CreateSingleItemModalMetadata } from './CreateSingleItemModal.types' import { Collection } from 'modules/collection/types' diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index b5dfcb0af..280ca4232 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -8,8 +8,8 @@ import { PreviewProjection, WearableCategory, IPreviewController, - ArmatureId, - EmoteDataADR287 + EmoteDataADR287, + StartAnimation } from '@dcl/schemas' import { MAX_EMOTE_FILE_SIZE, @@ -173,34 +173,12 @@ export const CreateSingleItemModal: React.FC = props => { // Transform startAnimation if available if (autocompletedData.startAnimation) { - socialEmoteData.startAnimation = { - [ArmatureId.Armature]: { - animation: autocompletedData.startAnimation.avatar.animation, - loop: autocompletedData.startAnimation.avatar.loop - } - } - - // Add prop animation if available - if (autocompletedData.startAnimation.prop) { - socialEmoteData.startAnimation[ArmatureId.Armature_Prop] = { - animation: autocompletedData.startAnimation.prop.animation, - loop: autocompletedData.startAnimation.prop.loop - } - } + socialEmoteData.startAnimation = autocompletedData.startAnimation as StartAnimation } // Transform outcomes if available if (autocompletedData.outcomes) { - socialEmoteData.outcomes = autocompletedData.outcomes.map(outcome => ({ - title: outcome.title, - clips: outcome.clips.reduce((clips, clip) => { - clips[clip.armature as ArmatureId] = { - animation: clip.animation, - loop: clip.loop - } - return clips - }, {} as Partial>) - })) + socialEmoteData.outcomes = autocompletedData.outcomes } // Add randomizeOutcomes flag diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts index a9a6f7c97..d62bd16f5 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.types.ts @@ -1,11 +1,11 @@ import { AnimationClip, Object3D } from 'three' import { Dispatch } from 'redux' import { ModalProps } from 'decentraland-dapps/dist/providers/ModalProvider/ModalProvider.types' -import { IPreviewController, Mappings, Rarity } from '@dcl/schemas' +import { IPreviewController, Mappings, OutcomeGroup, Rarity } from '@dcl/schemas' import { Metrics } from 'modules/models/types' import { Collection } from 'modules/collection/types' import { saveItemRequest, SaveItemRequestAction } from 'modules/item/actions' -import { BodyShapeType, Item, ItemType, OutcomeGroup, SyncStatus } from 'modules/item/types' +import { BodyShapeType, Item, ItemType, SyncStatus } from 'modules/item/types' export enum CreateItemView { IMPORT = 'import', diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx index 5e7261157..34cf319ce 100644 --- a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx @@ -82,7 +82,7 @@ export default class EditThumbnailStep extends React.PureComponent { + describe('when processing animations with _Start suffix', () => { + it('should create startAnimation for animations ending with _Start', () => { + const animations = ['HighFive_Start', 'Wave_Prop_Start'] + + const result = autocompleteEmoteData(animations) + + expect(result.startAnimation).toBeDefined() + expect(result.startAnimation?.[ArmatureId.Armature]).toEqual({ + animation: 'HighFive_Start', + loop: true + }) + }) + + it('should handle prop start animations', () => { + const animations = ['HighFive_Prop_Start'] + + const result = autocompleteEmoteData(animations) + + expect(result.startAnimation).toBeDefined() + expect(result.startAnimation?.[ArmatureId.Armature_Prop]).toEqual({ + animation: 'HighFive_Prop_Start', + loop: true + }) + }) + }) + + describe('when processing animations without _Start suffix', () => { + it('should create outcomes for non-start animations', () => { + const animations = ['HighFive_Avatar', 'Wave_Avatar'] + + const result = autocompleteEmoteData(animations) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes).toHaveLength(2) + expect(result.outcomes?.[0]).toEqual({ + title: 'High Five', + clips: { + Armature: { + animation: 'HighFive_Avatar', + loop: true + } + } + }) + expect(result.outcomes?.[1]).toEqual({ + title: 'Wave', + clips: { + [ArmatureId.Armature]: { + animation: 'Wave_Avatar', + loop: true + } + } + }) + }) + + it('should handle AvatarOther animations', () => { + const animations = ['HighFive_AvatarOther'] + + const result = autocompleteEmoteData(animations) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes?.[0]).toEqual({ + title: 'High Five', + clips: { + [ArmatureId.Armature_Other]: { + animation: 'HighFive_AvatarOther', + loop: true + } + } + }) + }) + + it('should handle Prop animations', () => { + const animations = ['HighFive_Prop'] + + const result = autocompleteEmoteData(animations) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes?.[0]).toEqual({ + title: 'High Five', + clips: { + [ArmatureId.Armature_Prop]: { + animation: 'HighFive_Prop', + loop: true + } + } + }) + }) + }) + + describe('when processing mixed animations', () => { + it('should handle both start animations and outcomes', () => { + const animations = ['HighFive_Start', 'HighFive_Avatar', 'HighFive_Prop', 'Wave_Prop_Start', 'Wave_Avatar'] + + const result = autocompleteEmoteData(animations) + + expect(result.startAnimation).toBeDefined() + expect(result.startAnimation?.[ArmatureId.Armature]).toEqual({ + animation: 'HighFive_Start', + loop: true + }) + + expect(result.startAnimation?.[ArmatureId.Armature_Prop]).toEqual({ + animation: 'Wave_Prop_Start', + loop: true + }) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes).toHaveLength(2) + + // HighFive group + const highFiveOutcome = result.outcomes?.find(o => o.title === 'High Five') + expect(highFiveOutcome).toBeDefined() + expect(highFiveOutcome?.clips).toEqual({ + [ArmatureId.Armature]: { + animation: 'HighFive_Avatar', + loop: true + }, + [ArmatureId.Armature_Prop]: { + animation: 'HighFive_Prop', + loop: true + } + }) + + // Wave group + const waveOutcome = result.outcomes?.find(o => o.title === 'Wave') + expect(waveOutcome).toBeDefined() + expect(waveOutcome?.clips).toEqual({ + [ArmatureId.Armature]: { + animation: 'Wave_Avatar', + loop: true + } + }) + }) + }) + + describe('when processing animations with complex names', () => { + it('should format camelCase names correctly', () => { + const animations = ['SuperJump_Avatar', 'CamelCaseTest_Avatar'] + + const result = autocompleteEmoteData(animations) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes?.[0].title).toBe('Super Jump') + expect(result.outcomes?.[1].title).toBe('Camel Case Test') + }) + }) + + describe('when processing empty or invalid animations', () => { + it('should handle empty array', () => { + const result = autocompleteEmoteData([]) + + expect(result.startAnimation).toBeUndefined() + expect(result.outcomes).toBeUndefined() + }) + + it('should handle animations without recognized suffixes', () => { + const animations = ['UnknownAnimation', 'AnotherUnknown'] + + const result = autocompleteEmoteData(animations) + + expect(result.outcomes).toBeDefined() + expect(result.outcomes?.[0].clips[ArmatureId.Armature]).toBeDefined() // Default to Armature + }) + }) +}) diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index f690cb152..a6fded2d1 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -1,4 +1,5 @@ import { + ArmatureId, BodyShape, ContractAddress, ContractNetwork, @@ -6,6 +7,8 @@ import { EmoteWithBlobs, Mapping, MappingType, + OutcomeGroup, + StartAnimation, WearableCategory, WearableWithBlobs } from '@dcl/schemas' @@ -293,9 +296,9 @@ export const getLinkedContract = (collection: Collection | undefined | null): Li * Maps animation suffixes to their corresponding armature names */ const ANIMATION_TO_ARMATURE_MAP = { - Avatar: 'Armature', - AvatarOther: 'Armature_Other', - Prop: 'Armature_Prop' + Avatar: ArmatureId.Armature, + AvatarOther: ArmatureId.Armature_Other, + Prop: ArmatureId.Armature_Prop } as const /** @@ -317,7 +320,7 @@ const getBaseAnimationName = (animationName: string): string => { /** * Gets the armature name based on the animation name suffix */ -const getArmatureFromAnimation = (animationName: string): string => { +const getArmatureFromAnimation = (animationName: string): ArmatureId => { if (animationName.endsWith('_AvatarOther')) { return ANIMATION_TO_ARMATURE_MAP.AvatarOther } @@ -343,8 +346,8 @@ const formatAnimationTitle = (baseName: string): string => { * Autocompletes emote data based on animation naming conventions */ export const autocompleteEmoteData = (animations: string[]) => { - const startAnimations: Array<{ armature: string; animation: string; loop: boolean }> = [] - const outcomes: Array<{ title: string; clips: Array<{ armature: string; animation: string; loop: boolean }> }> = [] + let startAnimations: Partial = {} + const outcomes: OutcomeGroup[] = [] // Group animations by base name const animationGroups = new Map() @@ -365,22 +368,32 @@ export const autocompleteEmoteData = (animations: string[]) => { const startAnimation = groupAnimations.find(anim => anim.endsWith('_Start')) if (startAnimation) { const armature = getArmatureFromAnimation(startAnimation) - startAnimations.push({ - armature, - animation: startAnimation, - loop: true - }) + startAnimations = { + ...startAnimations, + [armature]: { + animation: startAnimation, + loop: true + } + } } // Find outcome animations (non-start animations) const outcomeAnimations = groupAnimations.filter(anim => !anim.endsWith('_Start')) if (outcomeAnimations.length > 0) { - const clips = outcomeAnimations.map(animation => ({ + const clipsArray = outcomeAnimations.map(animation => ({ armature: getArmatureFromAnimation(animation), animation, loop: true })) + const clips: Partial> = {} + clipsArray.forEach(clip => { + clips[clip.armature] = { + animation: clip.animation, + loop: clip.loop + } + }) + outcomes.push({ title, clips @@ -389,13 +402,7 @@ export const autocompleteEmoteData = (animations: string[]) => { }) return { - startAnimation: - startAnimations.length > 0 - ? { - avatar: startAnimations.find(s => s.armature === 'Armature') || startAnimations[0], - prop: startAnimations.find(s => s.armature === 'Armature_Prop') - } - : undefined, + startAnimation: Object.keys(startAnimations).length > 0 ? startAnimations : undefined, outcomes: outcomes.length > 0 ? outcomes : undefined } } From c16a5ea920aa184f5bda3c6b8640a7a5adfd7e3f Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:00:01 -0300 Subject: [PATCH 24/48] feat: Add DynamicInput component --- .../DynamicInput/DynamicInput.module.css | 47 +++++++++++ .../RightPanel/DynamicInput/DynamicInput.tsx | 77 +++++++++++++++++++ .../DynamicInput/DynamicInput.types.ts | 9 +++ .../RightPanel/DynamicInput/index.ts | 1 + 4 files changed, 134 insertions(+) create mode 100644 src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css create mode 100644 src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx create mode 100644 src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.types.ts create mode 100644 src/components/ItemEditorPage/RightPanel/DynamicInput/index.ts diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css new file mode 100644 index 000000000..6dfeeb91d --- /dev/null +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css @@ -0,0 +1,47 @@ +.dynamicInput { + display: flex; + align-items: center; + gap: 8px; +} + +.dynamicInput .dynamicInputField { + background: none; + border: none; + outline: none; + color: var(--text); + font-size: inherit; + font-family: inherit; + padding: 0; + margin: 0; + min-width: 1ch; +} + +.dynamicInput .dynamicInputField:disabled { + opacity: 0.45; + cursor: default; +} + +.dynamicInput .dynamicInputField:focus { + outline: 1px solid var(--primary); + outline-offset: 2px; + border-radius: 2px; +} + +.dynamicInput.isEditing .dynamicInputField { + outline: 2px solid var(--primary); + outline-offset: 1px; + border-radius: 3px; + background-color: var(--background); +} + +.dynamicInput .dynamicInputEditButton { + flex-shrink: 0; + margin: 0 !important; + padding: 4px !important; + min-width: auto !important; + height: auto !important; +} + +.dynamicInput .dynamicInputEditButton:hover { + background-color: var(--hover) !important; +} diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx new file mode 100644 index 000000000..1be205ed2 --- /dev/null +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx @@ -0,0 +1,77 @@ +import { FC, memo, useState, useRef, useCallback, ChangeEvent, KeyboardEvent } from 'react' +import classNames from 'classnames' +import { Button } from 'decentraland-ui' +import { Props } from './DynamicInput.types' +import styles from './DynamicInput.module.css' + +const DynamicInput: FC = ({ value, disabled = false, placeholder = '', editable = false, className = '', maxLength, onChange }) => { + const [isEditing, setIsEditing] = useState(false) + const inputRef = useRef(null) + + const handleChange = useCallback( + (event: ChangeEvent) => { + const newValue = event.target.value + + if (value !== newValue && onChange) { + onChange(maxLength ? newValue.slice(0, maxLength) : newValue) + } + }, + [value, maxLength, onChange] + ) + + const handleKeyDown = useCallback((event: KeyboardEvent) => { + if (event.key === 'Enter') { + setIsEditing(false) + } + }, []) + + const handleBlur = useCallback(() => { + setIsEditing(false) + }, []) + + const handleEdit = useCallback(() => { + setIsEditing(true) + }, []) + + const calculateInputWidth = useCallback(() => { + const text = value || placeholder + const textLength = text.length + + if (textLength === 0) return '1em' + + const baseWidth = textLength * 0.55 + return `${Math.max(baseWidth, 0.5)}em` + }, [value, placeholder]) + + const inputWidth = calculateInputWidth() + const canEdit = editable && !disabled + + return ( +
+ + {canEdit && ( +
+ ) +} + +export default memo(DynamicInput) diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.types.ts b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.types.ts new file mode 100644 index 000000000..d7ee18d2d --- /dev/null +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.types.ts @@ -0,0 +1,9 @@ +export type Props = { + value: string + disabled?: boolean + maxLength?: number + placeholder?: string + editable?: boolean + onChange?: (newValue: string) => void + className?: string +} diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/index.ts b/src/components/ItemEditorPage/RightPanel/DynamicInput/index.ts new file mode 100644 index 000000000..682ed6836 --- /dev/null +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/index.ts @@ -0,0 +1 @@ +export { default } from './DynamicInput' From 2c00c5b91b0e972372aed191b6f7c4caf421141a Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:00:48 -0300 Subject: [PATCH 25/48] chore: Update @dcl/schemas package --- package-lock.json | 566 ++++++++++++---------------------------------- 1 file changed, 146 insertions(+), 420 deletions(-) diff --git a/package-lock.json b/package-lock.json index 542ad08d4..cfe50be40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -652,6 +652,20 @@ "node": ">=6" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", @@ -853,6 +867,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -995,6 +1026,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", @@ -7472,7 +7524,6 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -7491,7 +7542,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -7657,8 +7707,7 @@ "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9062,7 +9111,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9072,26 +9120,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -9099,14 +9143,12 @@ "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -9114,14 +9156,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9133,7 +9173,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -9142,7 +9181,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -9150,14 +9188,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9173,7 +9209,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -9186,7 +9221,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -9198,7 +9232,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -9212,7 +9245,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -9226,7 +9258,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -9343,14 +9374,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abab": { "version": "2.0.6", @@ -9861,7 +9890,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9870,7 +9898,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9879,7 +9906,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9917,7 +9943,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9931,7 +9956,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -9942,8 +9966,7 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { "version": "2.1.0", @@ -9962,7 +9985,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9977,7 +9999,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, "funding": [ { "type": "individual", @@ -10012,7 +10033,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, "bin": { "atob": "bin/atob.js" }, @@ -10450,7 +10470,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -10476,7 +10495,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -10488,7 +10506,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10611,8 +10628,7 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/bn.js": { "version": "5.2.1", @@ -10679,7 +10695,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -10690,7 +10705,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -10702,7 +10716,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -10712,7 +10725,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", - "dev": true, "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -10732,7 +10744,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "dependencies": { "pako": "~1.0.5" } @@ -10880,8 +10891,7 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "node_modules/cac": { "version": "6.7.14", @@ -10896,7 +10906,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -10919,7 +10928,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10928,14 +10936,12 @@ "node_modules/cacache/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/cacache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10955,7 +10961,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10967,7 +10972,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -10979,7 +10983,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -11107,7 +11110,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -11199,7 +11201,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -11462,7 +11463,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -11620,8 +11620,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/component-classes": { "version": "1.2.6", @@ -11635,7 +11634,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -11669,7 +11667,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "engines": [ "node >= 0.8" ], @@ -11683,14 +11680,12 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11704,14 +11699,12 @@ "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -11796,8 +11789,7 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -11808,8 +11800,7 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -11839,7 +11830,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -11852,14 +11842,12 @@ "node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/copy-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11869,7 +11857,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11889,7 +11876,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11901,7 +11887,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11913,7 +11898,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12022,7 +12006,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -12031,8 +12014,7 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/create-hash": { "version": "1.2.0", @@ -12120,7 +12102,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -12201,8 +12182,7 @@ "node_modules/cyclist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" }, "node_modules/d": { "version": "1.0.2", @@ -12650,6 +12630,21 @@ "node": ">= 4" } }, + "node_modules/decentraland-dapps/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/decentraland-dapps/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -12908,9 +12903,9 @@ } }, "node_modules/decentraland-ui/node_modules/@dcl/schemas": { - "version": "18.5.2", - "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-18.5.2.tgz", - "integrity": "sha512-M66R114SEAwLzm/I4JfYCVJ7EbTxvclXEkQBvvco1zz+NJ4OYaseM29wrUv2FOeJHIZvi/fbn3phQaVuv4/DRA==", + "version": "18.8.0", + "resolved": "https://registry.npmjs.org/@dcl/schemas/-/schemas-18.8.0.tgz", + "integrity": "sha512-1HxbL0azB7N+kMwYyU4/Uqltc+7F8Lv8UcS3dxDNVTPn71gldIDImj58OM9Y3gIyQG5Tauacrlk5cDkXhjMkOA==", "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", @@ -13140,7 +13135,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13200,7 +13194,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -13301,7 +13294,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -13311,8 +13303,7 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -13565,7 +13556,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -13596,7 +13586,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, "dependencies": { "prr": "~1.0.1" }, @@ -13996,7 +13985,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -14008,7 +13996,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -14464,7 +14451,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -14482,7 +14468,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -14490,8 +14475,7 @@ "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/expand-template": { "version": "1.1.1", @@ -14526,7 +14510,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, "dependencies": { "is-extendable": "^0.1.0" }, @@ -14538,7 +14521,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -14557,7 +14539,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -14569,7 +14550,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -14743,8 +14723,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported.", - "dev": true + "deprecated": "This module is no longer supported." }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -14806,7 +14785,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -14820,7 +14798,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -14832,7 +14809,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -14845,7 +14821,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -14858,7 +14833,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -14873,7 +14847,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -14885,7 +14858,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, "engines": { "node": ">=4" } @@ -14894,7 +14866,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "engines": { "node": ">=6" } @@ -14903,7 +14874,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -14915,7 +14885,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -14985,7 +14954,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -14994,14 +14962,12 @@ "node_modules/flush-write-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/flush-write-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15015,14 +14981,12 @@ "node_modules/flush-write-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/flush-write-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15058,7 +15022,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15128,7 +15091,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, "dependencies": { "map-cache": "^0.2.2" }, @@ -15140,7 +15102,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -15149,14 +15110,12 @@ "node_modules/from2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15170,14 +15129,12 @@ "node_modules/from2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/from2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15204,7 +15161,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -15215,14 +15171,12 @@ "node_modules/fs-write-stream-atomic/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15236,14 +15190,12 @@ "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -15357,7 +15309,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15651,7 +15602,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -15665,7 +15615,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -15678,7 +15627,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -15690,7 +15638,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15702,7 +15649,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -15884,8 +15830,7 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -15978,8 +15923,7 @@ "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" }, "node_modules/ignore": { "version": "5.3.0", @@ -16070,7 +16014,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -16086,8 +16029,7 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", @@ -16428,7 +16370,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16509,8 +16450,7 @@ "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { "version": "1.2.7", @@ -16538,7 +16478,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -16564,7 +16503,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16591,7 +16529,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16954,7 +16891,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18308,8 +18244,7 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -18658,7 +18593,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -18667,7 +18601,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18681,7 +18614,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -18858,7 +18790,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -18867,7 +18798,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -18919,7 +18849,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18928,7 +18857,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, "dependencies": { "object-visit": "^1.0.0" }, @@ -18959,7 +18887,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -18971,14 +18898,12 @@ "node_modules/memory-fs/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/memory-fs/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18992,14 +18917,12 @@ "node_modules/memory-fs/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/memory-fs/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19053,7 +18976,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -19065,8 +18987,7 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/mime": { "version": "3.0.0", @@ -19178,7 +19099,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -19199,7 +19119,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -19210,14 +19129,12 @@ "node_modules/mississippi/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/mississippi/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -19231,14 +19148,12 @@ "node_modules/mississippi/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/mississippi/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -19252,7 +19167,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -19265,7 +19179,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19345,7 +19258,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -19358,14 +19270,12 @@ "node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/move-concurrently/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19375,7 +19285,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19395,7 +19304,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19407,7 +19315,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -19692,7 +19599,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -19710,7 +19616,6 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -19732,7 +19637,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -19745,7 +19649,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -19758,7 +19661,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -19771,7 +19673,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -19788,8 +19689,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { "version": "1.1.0", @@ -19892,7 +19792,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -19923,7 +19822,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", - "dev": true, "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" @@ -19933,7 +19831,6 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -19942,7 +19839,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -19953,7 +19849,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -19962,32 +19857,27 @@ "node_modules/node-libs-browser/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/node-libs-browser/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/node-libs-browser/node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/node-libs-browser/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20001,14 +19891,12 @@ "node_modules/node-libs-browser/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/node-libs-browser/node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -20018,7 +19906,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -20031,7 +19918,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20039,14 +19925,12 @@ "node_modules/node-libs-browser/node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" }, "node_modules/node-libs-browser/node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -20225,7 +20109,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -20239,7 +20122,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -20291,7 +20173,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, "dependencies": { "isobject": "^3.0.0" }, @@ -20320,7 +20201,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -20438,8 +20318,7 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-homedir": { "version": "1.0.2", @@ -20541,7 +20420,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -20551,14 +20429,12 @@ "node_modules/parallel-transform/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -20572,14 +20448,12 @@ "node_modules/parallel-transform/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/parallel-transform/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20599,7 +20473,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -20652,7 +20525,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -20667,7 +20539,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, "optional": true }, "node_modules/path-exists": { @@ -20970,7 +20841,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -20979,7 +20849,6 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -21208,7 +21077,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -21222,7 +21090,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -21233,8 +21100,7 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/process": { "version": "0.11.10", @@ -21288,8 +21154,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, "node_modules/prompts": { "version": "2.4.2", @@ -21391,8 +21256,7 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" }, "node_modules/psl": { "version": "1.9.0", @@ -21404,7 +21268,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21417,8 +21280,7 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/pull-batch": { "version": "1.0.0", @@ -21515,7 +21377,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -21526,7 +21387,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -21537,14 +21397,12 @@ "node_modules/pumpify/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21554,7 +21412,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -21568,14 +21425,12 @@ "node_modules/pumpify/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/pumpify/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -21763,7 +21618,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -21942,7 +21796,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -22663,7 +22516,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -22676,7 +22528,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -22689,7 +22540,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -22717,14 +22567,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true, "optional": true }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -22733,7 +22581,6 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, "engines": { "node": ">=0.10" } @@ -22837,8 +22684,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/resolve.exports": { "version": "2.0.2", @@ -22853,7 +22699,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, "engines": { "node": ">=0.12" } @@ -23117,7 +22962,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, "dependencies": { "aproba": "^1.1.1" } @@ -23125,8 +22969,7 @@ "node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/rxjs": { "version": "7.8.1", @@ -23160,7 +23003,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, "dependencies": { "ret": "~0.1.10" } @@ -23177,8 +23019,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/saxes": { "version": "6.0.0", @@ -23354,7 +23195,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -23396,7 +23236,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -23564,7 +23403,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -23583,7 +23421,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -23597,7 +23434,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.0" }, @@ -23609,7 +23445,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -23622,7 +23457,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "dependencies": { "kind-of": "^3.2.0" }, @@ -23634,7 +23468,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -23646,7 +23479,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -23654,8 +23486,7 @@ "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/socket.io-client": { "version": "4.7.4", @@ -23695,8 +23526,7 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.5.7", @@ -23710,7 +23540,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23720,7 +23549,6 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -23733,7 +23561,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, "engines": { "node": ">=0.10" } @@ -23742,7 +23569,6 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23752,7 +23578,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23761,8 +23586,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" }, "node_modules/sourcemap-codec": { "version": "1.4.8", @@ -23798,7 +23622,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -23810,7 +23633,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -23823,7 +23645,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -23850,7 +23671,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" } @@ -23897,7 +23717,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -23945,7 +23764,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -24198,7 +24016,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, "engines": { "node": ">=6" } @@ -24376,7 +24193,6 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -24399,7 +24215,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24415,7 +24230,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -24424,7 +24238,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -24433,7 +24246,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, "engines": { "node": ">=4" } @@ -24441,14 +24253,12 @@ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -24462,7 +24272,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -24471,7 +24280,6 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -24598,7 +24406,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -24607,14 +24414,12 @@ "node_modules/through2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24628,14 +24433,12 @@ "node_modules/through2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -24652,7 +24455,6 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -24691,8 +24493,7 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" }, "node_modules/to-buffer": { "version": "1.1.1", @@ -24713,7 +24514,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -24725,7 +24525,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -24746,7 +24545,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -24772,7 +24570,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -24785,7 +24582,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -24798,7 +24594,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -24811,7 +24606,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -25373,8 +25167,7 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -25540,7 +25333,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -25555,7 +25347,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -25564,7 +25355,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -25581,7 +25371,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -25594,7 +25383,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -25608,7 +25396,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, "dependencies": { "isarray": "1.0.0" }, @@ -25620,7 +25407,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -25628,8 +25414,7 @@ "node_modules/unset-value/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/unstorage": { "version": "1.12.0", @@ -25729,7 +25514,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, "optional": true, "engines": { "node": ">=4", @@ -25784,14 +25568,12 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true + "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/url": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -25898,14 +25680,12 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -26536,8 +26316,7 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -26572,7 +26351,6 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -26586,7 +26364,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -26596,7 +26373,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -26607,7 +26383,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -26620,7 +26395,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -26630,7 +26404,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -26653,7 +26426,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -26676,7 +26448,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "optional": true, "dependencies": { "is-descriptor": "^1.0.2", @@ -26690,7 +26461,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -26707,7 +26477,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -26725,7 +26494,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -26736,7 +26504,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -26749,7 +26516,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -26762,7 +26528,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "optional": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", @@ -26776,7 +26541,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "optional": true, "dependencies": { "is-plain-object": "^2.0.4" @@ -26789,7 +26553,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -26802,7 +26565,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "optional": true, "dependencies": { "is-buffer": "^1.1.5" @@ -26815,14 +26577,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "optional": true, "dependencies": { "arr-diff": "^4.0.0", @@ -26847,7 +26607,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "optional": true, "dependencies": { "assign-symbols": "^1.0.0", @@ -26861,7 +26620,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "optional": true, "dependencies": { "core-util-is": "~1.0.0", @@ -26877,7 +26635,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -26892,14 +26649,12 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, "optional": true }, "node_modules/watchpack-chokidar2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "optional": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -26909,7 +26664,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -27111,7 +26865,6 @@ "version": "4.47.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -27160,7 +26913,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -27170,7 +26922,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -27179,7 +26930,6 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -27191,7 +26941,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -27207,7 +26956,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, "peerDependencies": { "ajv": ">=5.0.0" } @@ -27216,7 +26964,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -27225,7 +26972,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -27246,7 +26992,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -27259,7 +27004,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -27272,7 +27016,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -27281,7 +27024,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -27296,7 +27038,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -27309,7 +27050,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -27321,7 +27061,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, "dependencies": { "kind-of": "^3.0.2" }, @@ -27333,7 +27072,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, "dependencies": { "is-buffer": "^1.1.5" }, @@ -27344,20 +27082,17 @@ "node_modules/webpack/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/webpack/node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -27367,7 +27102,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -27391,7 +27125,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -27404,7 +27137,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -27418,14 +27150,12 @@ "node_modules/webpack/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -27439,7 +27169,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -27448,7 +27177,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -27641,7 +27369,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, "dependencies": { "errno": "~0.1.7" } @@ -27832,8 +27559,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", From abe52e85cdc3bdf62651a2d8cd738e610b9a7fae Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:02:36 -0300 Subject: [PATCH 26/48] fix: Refactor buildEmoteMetadata to properly handle outcomeType --- .../CreateSingleItemModal.tsx | 2 +- .../Modals/CreateSingleItemModal/utils.ts | 3 +- src/lib/getModelData.ts | 1 + src/modules/editor/utils.ts | 1 + src/modules/item/export.ts | 1 + src/modules/item/utils.ts | 71 ++++++++++++++----- 6 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 280ca4232..bf6974082 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -162,7 +162,7 @@ export const CreateSingleItemModal: React.FC = props => { representations: [...representations] } as EmoteData - // ADR 287 - Social Emotes + // TODO: ADR 287 - Social Emotes // Use autocompleteEmoteData to generate startAnimation and outcomes from available animations if (emoteData?.animations && emoteData.animations.length > 0) { const animationNames = emoteData.animations.map(clip => clip.name) diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index a6fded2d1..c990ab312 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -396,7 +396,8 @@ export const autocompleteEmoteData = (animations: string[]) => { outcomes.push({ title, - clips + clips, + loop: false }) } }) diff --git a/src/lib/getModelData.ts b/src/lib/getModelData.ts index d1cea80c2..b6b674bdf 100644 --- a/src/lib/getModelData.ts +++ b/src/lib/getModelData.ts @@ -235,6 +235,7 @@ export async function getEmoteData(url: string, options: Partial = {}) throw new EmoteWithMeshError() } + // TODO: ADR287 // For social emotes, we need to count the number of additional armatures, currently only one additional armature is supported const additionalArmatures = armatures.some(({ name }) => name === ARMATURES.OTHER) ? 1 : 0 diff --git a/src/modules/editor/utils.ts b/src/modules/editor/utils.ts index 181d5010e..c02774be1 100644 --- a/src/modules/editor/utils.ts +++ b/src/modules/editor/utils.ts @@ -324,6 +324,7 @@ export function toEmote(item: Item): EmoteDefinition { text: item.name } ], + // TODO: ADR287 ...(isEmoteDataADR287(item.data) ? { emoteDataADR287: { diff --git a/src/modules/item/export.ts b/src/modules/item/export.ts index fc0128755..d17619ed6 100644 --- a/src/modules/item/export.ts +++ b/src/modules/item/export.ts @@ -235,6 +235,7 @@ function buildADR287EmoteEntityMetadata(collection: Collection, item: Item): string } export function getEmoteOutcomeType(item: Item): string { - // Validates is a Social Emote - if (!('startAnimation' in item.data)) { + if (!isEmoteDataADR287(item.data)) { return '' } @@ -237,6 +237,21 @@ export function buildItemMetadata( } export function buildEmoteMetada( + version: number, + type: ItemMetadataType, + name: string, + description: string, + category: string, + bodyShapeTypes: string, + loop: number, + additionalProperties?: string +): string { + return `${version}:${type}:${name}:${description}:${category}:${bodyShapeTypes}:${loop}${ + additionalProperties ? `:${additionalProperties}` : '' + }` +} + +export function buildADR287EmoteMetadata( version: number, type: ItemMetadataType, name: string, @@ -245,11 +260,12 @@ export function buildEmoteMetada( bodyShapeTypes: string, loop: number, additionalProperties?: string, - outcomeType?: string + _outcomeType?: string ): string { + // TODO: ADR287 we need to add the outcomeType once the subgraph is updated- ${outcomeType ? `:${outcomeType}` : ''} return `${version}:${type}:${name}:${description}:${category}:${bodyShapeTypes}:${loop}${ additionalProperties ? `:${additionalProperties}` : '' - }${outcomeType ? `:${outcomeType}` : ''}` + }` } // Metadata looks like this: @@ -274,17 +290,29 @@ export function getMetadata(item: Item) { } const additionalProperties = getEmoteAdditionalProperties(item as unknown as Item) const outcomeType = getEmoteOutcomeType(item as unknown as Item) - return buildEmoteMetada( - 1, - getItemMetadataType(item), - item.name, - item.description, - data.category, - bodyShapeTypes, - data.loop ? 1 : 0, - additionalProperties, - outcomeType - ) + // TODO: ADR287 + return isEmoteDataADR287(data) + ? buildADR287EmoteMetadata( + 1, + getItemMetadataType(item), + item.name, + item.description, + data.category, + bodyShapeTypes, + data.loop ? 1 : 0, + additionalProperties, + outcomeType + ) + : buildEmoteMetada( + 1, + getItemMetadataType(item), + item.name, + item.description, + data.category, + bodyShapeTypes, + data.loop ? 1 : 0, + additionalProperties + ) } default: throw new Error(`Unknown item.type "${item.type as unknown as string}"`) @@ -501,6 +529,11 @@ export function isModelFile(fileName: string) { return fileName.endsWith('.gltf') || fileName.endsWith('.glb') } +export function isAudioFile(fileName: string) { + fileName = fileName.toLowerCase() + return fileName.endsWith('.mp3') || fileName.endsWith('.ogg') +} + export function isModelPath(fileName: string) { fileName = fileName.toLowerCase() // we ignore PNG files that end with "_mask", since those are auxiliary @@ -609,7 +642,7 @@ export function isEmoteSynced(item: Item | Item, entity: Entity) throw new Error('Item must be EMOTE') } - // check if metadata has the new schema from ADR 74 or ADR 287 + // check if metadata has the new schema from ADR74 or ADR287 const isADR74 = 'emoteDataADR74' in entity.metadata const isADR287 = 'emoteDataADR287' in entity.metadata if (!isADR74 && !isADR287) { @@ -880,3 +913,7 @@ export async function createItemOrderTrade( return { ...tradeToSign, signature: await getTradeSignature(tradeToSign) } } + +export const itemHasAudio = (item: Item): boolean => { + return Object.keys(item.contents).some(content => isAudioFile(content)) +} From a4a58d1e24da031c070a3c0a0577b2cfa6639af4 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:03:28 -0300 Subject: [PATCH 27/48] feat: Add panels to edit social emote outcomes in the RightPanel --- .../ItemEditorPage/RightPanel/RightPanel.css | 85 +++++ .../ItemEditorPage/RightPanel/RightPanel.tsx | 359 +++++++++++++++++- .../RightPanel/RightPanel.types.ts | 6 +- src/modules/item/types.ts | 4 +- 4 files changed, 442 insertions(+), 12 deletions(-) diff --git a/src/components/ItemEditorPage/RightPanel/RightPanel.css b/src/components/ItemEditorPage/RightPanel/RightPanel.css index c6277710e..3f656ad2f 100644 --- a/src/components/ItemEditorPage/RightPanel/RightPanel.css +++ b/src/components/ItemEditorPage/RightPanel/RightPanel.css @@ -227,3 +227,88 @@ align-items: center; color: var(--secondary-text); } + +.dcl.box.emote-request-state-box, +.dcl.box.outcome-box { + padding: 10px 10px 0 10px; + width: 100%; + border-width: 1px; + border-color: var(--text-area-border); + margin-bottom: 10px; +} + +.dcl.box.emote-request-state-box .ui.dropdown.Select, +.dcl.box.outcome-box .ui.dropdown.Select { + border: none; + padding: 0; +} + +.dcl.box.emote-request-state-box .box-header, +.dcl.box.outcome-box .box-header { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-bottom: 0; +} + +.dcl.box.emote-request-state-box .box-header::after, +.dcl.box.outcome-box .box-header::after { + content: ''; + margin-left: -10px; + display: block; + width: calc(100% + 20px); + height: 1px; + background-color: var(--gray); + margin-top: 10px; +} + +.dcl.box.outcome-box .box-header .dcl.box-header-text { + width: 100%; +} + +.dcl.box.emote-request-state-box .emote-start-header, +.dcl.box.outcome-box .outcome-header { + font-size: 1rem; + font-weight: 700; +} + +.dcl.box.outcome-box .outcome-header { + display: flex; + align-items: center; +} + +.dcl.box.outcome-box .outcome-header .outcome-edit-button .icon { + color: var(--secondary-text); +} + +.dcl.box.outcome-box .outcome-header .outcome-remove-button { + margin-left: auto; +} + +.dcl.box.outcome-box .outcome-header .outcome-remove-button .icon { + color: var(--secondary-text); +} + +.dcl.box.outcome-box .outcome-header .Input { + border: none; + padding: 0; + margin: 0; + height: unset; +} + +.dcl.box.outcome-box .outcome-header .Input input { + text-align: left; + flex: 0; +} + +.dcl.box.outcome-box .outcome-header .outcome-title-input > input { + font-weight: 700; + color: var(--text); + &:disabled { + opacity: 1; + } +} + +.dcl.box.outcome-box .outcome-header .outcome-title-input .ui.button.basic { + color: var(--secondary-text) !important; +} diff --git a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx index 1223cd69b..d7fcf1287 100644 --- a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx +++ b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx @@ -1,7 +1,18 @@ +import { AnimationClip } from 'three' import * as React from 'react' import equal from 'fast-deep-equal' -import { Loader, Dropdown, Button, Checkbox, CheckboxProps, TextAreaField, TextAreaProps } from 'decentraland-ui' -import { BodyPartCategory, EmoteCategory, Rarity, EmoteDataADR74, HideableWearableCategory, Network, WearableCategory } from '@dcl/schemas' +import { Loader, Dropdown, Button, Checkbox, CheckboxProps, TextAreaField, TextAreaProps, Row, Box, Header } from 'decentraland-ui' +import { + BodyPartCategory, + EmoteCategory, + Rarity, + EmoteDataADR74, + HideableWearableCategory, + Network, + WearableCategory, + EmoteDataADR287, + ArmatureId +} from '@dcl/schemas' import { NetworkButton } from 'decentraland-dapps/dist/containers' import { t } from 'decentraland-dapps/dist/modules/translation/utils' import { getAnalytics } from 'decentraland-dapps/dist/modules/analytics/utils' @@ -17,7 +28,9 @@ import { getHideableWearableCategories, isSmart, hasVideo, - isWearable + isWearable, + isAudioFile, + itemHasAudio } from 'modules/item/utils' import { isLocked } from 'modules/collection/utils' import { computeHashes } from 'modules/deployment/contentUtils' @@ -28,12 +41,15 @@ import { ItemType, ITEM_DESCRIPTION_MAX_LENGTH, ITEM_NAME_MAX_LENGTH, + OUTCOME_TITLE_MAX_LENGTH, THUMBNAIL_PATH, WearableData, VIDEO_PATH, SyncStatus, - ITEM_UTILITY_MAX_LENGTH + ITEM_UTILITY_MAX_LENGTH, + EmoteData } from 'modules/item/types' +import { isSocialEmoteMetrics } from 'modules/models/types' import { dataURLToBlob } from 'modules/media/utils' import Collapsable from 'components/Collapsable' import ConfirmDelete from 'components/ConfirmDelete' @@ -41,10 +57,12 @@ import Icon from 'components/Icon' import Info from 'components/Info' import ItemImage from 'components/ItemImage' import ItemProvider from 'components/ItemProvider' +import { AnimationData } from 'components/ItemProvider/ItemProvider.types' import ItemVideo from 'components/ItemVideo' import ItemProperties from 'components/ItemProperties' import ItemRequiredPermission from 'components/ItemRequiredPermission' import { EditVideoModalMetadata } from 'components/Modals/EditVideoModal/EditVideoModal.types' +import DynamicInput from './DynamicInput/DynamicInput' import Input from './Input' import Select from './Select' import MultiSelect from './MultiSelect' @@ -52,6 +70,8 @@ import Tags from './Tags' import { Props, State } from './RightPanel.types' import './RightPanel.css' +const MAX_OUTCOMES = 3 + export default class RightPanel extends React.PureComponent { analytics = getAnalytics() state: State = this.getInitialState() @@ -177,11 +197,11 @@ export default class RightPanel extends React.PureComponent { handleChangeCategory = (category: HideableWearableCategory | EmoteCategory) => { let data - if (isEmoteData(this.state.data!)) { + if (isEmoteData(this.state.data)) { data = { ...this.state.data, category - } as EmoteDataADR74 + } as EmoteData } else { data = { ...this.state.data, @@ -204,6 +224,132 @@ export default class RightPanel extends React.PureComponent { this.setState({ data, isDirty: this.isDirty({ data }) }) } + handleEmoteRequestStateChange = (prop: ArmatureId.Armature | ArmatureId.Armature_Prop, field: string, value: string) => { + const data = this.state.data as any + const startAnimation = { ...(data.startAnimation || {}) } + + if (!startAnimation[prop]) { + startAnimation[prop] = { armature: '', animation: '', loop: true } + } + + startAnimation[prop] = { + ...startAnimation[prop], + [field]: value + } + + this.setState({ + data: { ...data, startAnimation }, + isDirty: this.isDirty({ data: { ...data, startAnimation } }) + }) + } + + handleStartAnimationAudioClipChange = (audio: string) => { + const data = this.state.data as EmoteDataADR287 + const startAnimation = { ...(data.startAnimation || {}) } + startAnimation.audio = audio + this.setState({ data: { ...data, startAnimation }, isDirty: this.isDirty({ data: { ...data, startAnimation } }) }) + } + + handleStartAnimationPlayModeChange = (loop: boolean) => { + const data = this.state.data as EmoteDataADR287 + const startAnimation = { ...(data.startAnimation || {}) } + startAnimation.loop = loop + this.setState({ data: { ...data, startAnimation }, isDirty: this.isDirty({ data: { ...data, startAnimation } }) }) + } + + handleRandomizeOutcomesChange = (randomize: boolean) => { + const data = { + ...this.state.data, + randomizeOutcomes: randomize + } as EmoteData + this.setState({ data, isDirty: this.isDirty({ data }) }) + } + + handleOutcomeChange = (outcomeIndex: number, field: string, value: string) => { + const data = this.state.data as any + const outcomes = [...data.outcomes] + outcomes[outcomeIndex] = { + ...outcomes[outcomeIndex], + [field]: value + } + this.setState({ + data: { ...data, outcomes }, + isDirty: this.isDirty({ data: { ...data, outcomes } }) + }) + } + + handleOutcomeClipChange = (outcomeIndex: number, armatureId: ArmatureId, field: string, value: string) => { + const data = this.state.data as unknown as EmoteDataADR287 + const outcomes = [...data.outcomes] + const clips = { ...outcomes[outcomeIndex].clips } + if (!clips[armatureId]) { + clips[armatureId] = { + animation: '' + } + } + clips[armatureId] = { + ...clips[armatureId], + [field]: value + } + + outcomes[outcomeIndex] = { + ...outcomes[outcomeIndex], + clips + } + this.setState({ + data: { ...data, outcomes }, + isDirty: this.isDirty({ data: { ...data, outcomes } }) + }) + } + + handleOutcomeAudioClipChange = (outcomeIndex: number, audio: string) => { + const data = this.state.data as EmoteDataADR287 + const outcomes = [...data.outcomes] + outcomes[outcomeIndex].audio = audio + this.setState({ data: { ...data, outcomes }, isDirty: this.isDirty({ data: { ...data, outcomes } }) }) + } + + handleOutcomePlayModeChange = (outcomeIndex: number, loop: boolean) => { + const data = this.state.data as EmoteDataADR287 + const outcomes = [...data.outcomes] + outcomes[outcomeIndex].loop = loop + this.setState({ + data: { ...data, outcomes }, + isDirty: this.isDirty({ data: { ...data, outcomes } }) + }) + } + + handleAddOutcome = () => { + const data = this.state.data as EmoteDataADR287 + if (!data.outcomes) { + data.outcomes = [] + } + const newOutcome = { + title: `Outcome ${data.outcomes.length + 1}`, + clips: {}, + loop: false + } + const outcomes = [...data.outcomes, newOutcome] + this.setState({ + data: { ...data, outcomes }, + isDirty: this.isDirty({ data: { ...data, outcomes } }) + }) + } + + handleRemoveOutcome = (outcomeIndex: number) => { + const data = this.state.data as any + const outcomes = data.outcomes.filter((_: any, index: number) => index !== outcomeIndex) + this.setState({ + data: { ...data, outcomes }, + isDirty: this.isDirty({ data: { ...data, outcomes } }) + }) + } + + handleEditOutcomeTitle = (outcomeIndex: number, value: string) => { + // Update the outcome title + this.handleOutcomeChange(outcomeIndex, 'title', value) + } + setReplaces(data: WearableData, replaces: HideableWearableCategory[]) { return { ...data, @@ -398,6 +544,45 @@ export default class RightPanel extends React.PureComponent { })) } + getAnimationOptions(animationData: AnimationData): Array<{ value: string; text: string }> { + if (!animationData.isLoaded) { + return [] + } + + if (animationData.error) { + console.warn('Animation data error:', animationData.error) + return [] + } + + return animationData.animations.map((animation: AnimationClip) => ({ + value: animation.name, + text: animation.name + })) + } + + getAudioOptions(values: Item['contents']): Array<{ value: string; text: string }> { + const audioFiles = new Set() + + return Object.keys(values) + .map(key => { + if (isAudioFile(key)) { + // Extract filename without male/ or female/ prefix + const fileName = key.replace(/^(male|female)\//, '') + + // Only add if we haven't seen this filename before + if (!audioFiles.has(fileName)) { + audioFiles.add(fileName) + return { + value: fileName, + text: fileName + } + } + } + return null + }) + .filter(Boolean) as { value: string; text: string }[] + } + renderOverrides(item: Item) { const canEditItemMetadata = this.canEditItemMetadata(item) const data = this.state.data as WearableData @@ -539,7 +724,7 @@ export default class RightPanel extends React.PureComponent {
{isConnected ? ( - {(item, collection, isLoading) => { + {(item, collection, isLoading, animationData) => { const isItemLocked = collection && isLocked(collection) const canEditItemMetadata = this.canEditItemMetadata(item) @@ -647,7 +832,165 @@ export default class RightPanel extends React.PureComponent { {this.renderOverrides(item)} )} - {item?.type === ItemType.EMOTE && ( + {item?.type === ItemType.EMOTE && + item?.metrics && + isSocialEmoteMetrics(item.metrics) && + !!item.metrics.additionalArmatures ? ( + +
+ Emote Start}> + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.avatar')} 1`} + value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature].animation} + options={this.getAnimationOptions(animationData)} + disabled={isLoading} + onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature, 'animation', value)} + /> + {(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop] ? ( + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.props')} (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop]?.animation || ''} + options={this.getAnimationOptions(animationData)} + disabled={isLoading} + onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature_Prop, 'animation', value)} + /> + ) : null} + {Object.values(item.contents).length > 0 && itemHasAudio(item) ? ( + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.audio')} (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={(data as EmoteDataADR287).startAnimation.audio} + options={this.getAudioOptions(item.contents)} + onChange={value => this.handleStartAnimationAudioClipChange(value)} + /> + ) : null} + + itemId={item.id} + label={t('create_single_item_modal.play_mode_label')} + value={(data as EmoteDataADR287).startAnimation.loop ? EmotePlayMode.LOOP : EmotePlayMode.SIMPLE} + options={this.asPlayModeSelect(playModes)} + onChange={value => this.handleStartAnimationPlayModeChange(value === EmotePlayMode.LOOP)} + disabled // For now play mode for start animation is always loop + /> + + + {(data as EmoteDataADR287).outcomes && (data as EmoteDataADR287).outcomes.length > 1 ? ( + + itemId={item.id} + label={t('item_editor.right_panel.social_emote.randomize_outcomes')} + value={(data as EmoteDataADR287).randomizeOutcomes ? 'true' : 'false'} + options={[ + { value: 'true', text: 'True' }, + { value: 'false', text: 'False' } + ]} + disabled={isLoading} + onChange={value => this.handleRandomizeOutcomesChange(value === 'true')} + /> + ) : null} + + {(data as EmoteDataADR287).outcomes && + (data as EmoteDataADR287).outcomes.length > 0 && + (data as EmoteDataADR287).outcomes.map((outcome, outcomeIndex) => ( + + this.handleEditOutcomeTitle(outcomeIndex, value)} + /> + {(data as EmoteDataADR287).outcomes.length > 1 ? ( +
+ } + > + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.avatar')} 1`} + value={outcome.clips[ArmatureId.Armature]?.animation || ''} + options={this.getAnimationOptions(animationData)} + disabled={isLoading} + onChange={value => this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature, 'animation', value)} + /> + + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.avatar')} 2 (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={outcome.clips[ArmatureId.Armature_Other]?.animation || ''} + options={this.getAnimationOptions(animationData)} + disabled={isLoading} + onChange={value => + this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature_Other, 'animation', value) + } + /> + + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.props')} (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={outcome.clips[ArmatureId.Armature_Prop]?.animation || ''} + options={this.getAnimationOptions(animationData)} + disabled={isLoading} + onChange={value => + this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature_Prop, 'animation', value) + } + /> + + {Object.values(item.contents).length > 0 && itemHasAudio(item) ? ( + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.audio')} (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={outcome.audio} + options={this.getAudioOptions(item.contents)} + onChange={value => this.handleOutcomeAudioClipChange(outcomeIndex, value)} + /> + ) : null} + + + itemId={item.id} + label={t('create_single_item_modal.play_mode_label')} + value={outcome?.loop ? EmotePlayMode.LOOP : EmotePlayMode.SIMPLE} + options={this.asPlayModeSelect(playModes)} + disabled={isLoading} + onChange={value => this.handleOutcomePlayModeChange(outcomeIndex, value === EmotePlayMode.LOOP)} + /> + + ))} + + {((data as EmoteDataADR287).outcomes ?? []).length < MAX_OUTCOMES ? ( + + + + ) : null} +
+ + ) : ( {item ? ( diff --git a/src/components/ItemEditorPage/RightPanel/RightPanel.types.ts b/src/components/ItemEditorPage/RightPanel/RightPanel.types.ts index f245c4cb1..0e3247ead 100644 --- a/src/components/ItemEditorPage/RightPanel/RightPanel.types.ts +++ b/src/components/ItemEditorPage/RightPanel/RightPanel.types.ts @@ -1,5 +1,5 @@ import { Dispatch } from 'redux' -import { EmoteDataADR74, Rarity } from '@dcl/schemas' +import { Rarity } from '@dcl/schemas' import { deleteItemRequest, DeleteItemRequestAction, @@ -8,7 +8,7 @@ import { downloadItemRequest, DownloadItemRequestAction } from 'modules/item/actions' -import { Item, SyncStatus, WearableData } from 'modules/item/types' +import { Item, SyncStatus, WearableData, EmoteData } from 'modules/item/types' import { Collection } from 'modules/collection/types' import { openModal, OpenModalAction } from 'decentraland-dapps/dist/modules/modal/actions' @@ -42,7 +42,7 @@ export type State = { video: string rarity?: Rarity contents: Record - data?: WearableData | EmoteDataADR74 + data?: WearableData | EmoteData hasItem: boolean isDirty: boolean } diff --git a/src/modules/item/types.ts b/src/modules/item/types.ts index 12f303598..db834e3ec 100644 --- a/src/modules/item/types.ts +++ b/src/modules/item/types.ts @@ -141,7 +141,8 @@ export type Item = Omit & { export const isEmoteItemType = (item: Item | Item): item is Item => (item as Item).type === ItemType.EMOTE -export const isEmoteDataADR287 = (data: EmoteData): data is EmoteDataADR287 => (data as EmoteDataADR287).outcomes !== undefined +export const isEmoteDataADR287 = (data: EmoteData): data is EmoteDataADR287 => + (data as EmoteDataADR287).startAnimation !== undefined && (data as EmoteDataADR287).outcomes !== undefined export const isEmoteData = (data: WearableData | EmoteData | undefined): data is EmoteData => !!data && (data as unknown as EmoteData).loop !== undefined @@ -171,6 +172,7 @@ export const SCENE_LOGIC_PATH = 'bin/game.js' export const ITEM_NAME_MAX_LENGTH = 32 export const ITEM_DESCRIPTION_MAX_LENGTH = 64 export const ITEM_UTILITY_MAX_LENGTH = 64 +export const OUTCOME_TITLE_MAX_LENGTH = 24 export const MODEL_EXTENSIONS = ['.zip', '.gltf', '.glb'] export const IMAGE_EXTENSIONS = ['.zip', '.png'] export const VIDEO_EXTENSIONS = ['.mp4'] From adfdde923d3138303cb928df5797be773252e760 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:07:41 -0300 Subject: [PATCH 28/48] feat: Add translations --- src/modules/translation/languages/en.json | 9 +++++++++ src/modules/translation/languages/es.json | 9 +++++++++ src/modules/translation/languages/zh.json | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/src/modules/translation/languages/en.json b/src/modules/translation/languages/en.json index 7b2c142c7..eba055e32 100644 --- a/src/modules/translation/languages/en.json +++ b/src/modules/translation/languages/en.json @@ -2109,6 +2109,7 @@ "wearables": "Wearables", "wearables_info": "The elements you choose from the wearables dropdown menu will be hidden.", "animation": "Animation", + "animations": "Animations", "tags": "Tags", "event_tag": "Use the {event_tag} tag if you want to include this item in the {event_name} event.", "select_placeholder": "Select an option", @@ -2128,6 +2129,14 @@ "enabled": "Enabled", "disabled": "Disabled", "info": "Nice Wearable! Allow owners of your item to include it in VRM Avatar Exports so they can show it off outside of Decentraland." + }, + "social_emote": { + "avatar": "Avatar", + "props": "Props", + "audio": "Audio", + "optional": "optional", + "randomize_outcomes": "Randomize outcomes", + "add_outcome": "Add an outcome" } } }, diff --git a/src/modules/translation/languages/es.json b/src/modules/translation/languages/es.json index e9c5c2bcd..825bbb1b4 100644 --- a/src/modules/translation/languages/es.json +++ b/src/modules/translation/languages/es.json @@ -2127,6 +2127,7 @@ "wearables": "Wearables", "wearables_info": "Los elementos que elija del menú desplegable estarán ocultos.", "animation": "Animación", + "animations": "Animationes", "tags": "Etiquetas", "event_tag": "Usa la etiqueta {event_tag} si quieres incluir este item en el {event_name}. {learn_more}", "select_placeholder": "Selecciona una opción", @@ -2146,6 +2147,14 @@ "enabled": "Activada", "disabled": "Desactivada", "info": "¡Bonito wearable! Permitir que los propietarios de su artículo lo incluyan en las exportaciones de avatar de VRM para que puedan mostrarlo fuera de Decentraland." + }, + "social_emote": { + "avatar": "Avatar", + "props": "Props", + "audio": "Audio", + "optional": "opcional", + "randomize_outcomes": "Aleatorizar opciones", + "add_outcome": "Agregar una opción" } } }, diff --git a/src/modules/translation/languages/zh.json b/src/modules/translation/languages/zh.json index aaa50332a..b5d9e19fe 100644 --- a/src/modules/translation/languages/zh.json +++ b/src/modules/translation/languages/zh.json @@ -2108,6 +2108,7 @@ "wearables": "可穿戴设备", "wearables_info": "您从可穿戴设备下拉菜单中选择的元素将被隐藏。", "animation": "动画", + "animations": "动画", "tags": "标签", "event_tag": "如果您想将此项目包含在 {event_tag} 中,请使用 {event_name} 标签。{learn_more}", "select_placeholder": "选择一个选项", @@ -2127,6 +2128,14 @@ "enabled": "启用", "disabled": "禁用", "info": "漂亮的可穿戴!允许您的物品的所有者将其包含在VRM Avatar出口中,以便他们可以在分散的外部出现。" + }, + "social_emote": { + "avatar": "阿凡达", + "props": "道具", + "audio": "音频", + "optional": "可选", + "randomize_outcomes": "随机化结果", + "add_outcome": "添加结果" } } }, From 1f08c5259c77fa4e3b9979c5af39c7df59fa127e Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:24:41 -0300 Subject: [PATCH 29/48] fix: Autocomplete social emote data --- .../CreateSingleItemModal.tsx | 8 +-- .../CreateSingleItemModal/utils.spec.ts | 71 +++++++++---------- .../Modals/CreateSingleItemModal/utils.ts | 16 ++--- 3 files changed, 45 insertions(+), 50 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index bf6974082..9263b6227 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -68,7 +68,7 @@ import { areMappingsValid } from 'modules/thirdParty/utils' import { Authorization } from 'lib/api/auth' import { BUILDER_SERVER_URL, BuilderAPI } from 'lib/api/builder' import { - autocompleteEmoteData, + autocompleteSocialEmoteData, buildRepresentations, buildRepresentationsZipBothBodyshape, getLinkedContract, @@ -163,10 +163,10 @@ export const CreateSingleItemModal: React.FC = props => { } as EmoteData // TODO: ADR 287 - Social Emotes - // Use autocompleteEmoteData to generate startAnimation and outcomes from available animations + // Use autocompleteSocialEmoteData to generate startAnimation and outcomes from available animations if (emoteData?.animations && emoteData.animations.length > 0) { const animationNames = emoteData.animations.map(clip => clip.name) - const autocompletedData = autocompleteEmoteData(animationNames) + const autocompletedData = autocompleteSocialEmoteData(animationNames) if (autocompletedData.startAnimation || autocompletedData.outcomes) { const socialEmoteData: Partial = {} @@ -717,7 +717,7 @@ export const CreateSingleItemModal: React.FC = props => { const animationNames = (data.animations ?? []).map(clip => clip.name) // Autocomplete emote data based on animation naming conventions - const autocompletedData = autocompleteEmoteData(animationNames) + const autocompletedData = autocompleteSocialEmoteData(animationNames) if (autocompletedData.outcomes) { dispatch(createItemActions.setOutcomes(autocompletedData.outcomes)) diff --git a/src/components/Modals/CreateSingleItemModal/utils.spec.ts b/src/components/Modals/CreateSingleItemModal/utils.spec.ts index 664d09b7d..b07f31058 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.spec.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.spec.ts @@ -1,30 +1,30 @@ import { ArmatureId } from '@dcl/schemas' -import { autocompleteEmoteData } from './utils' +import { autocompleteSocialEmoteData } from './utils' -describe('autocompleteEmoteData', () => { +describe('autocompleteSocialEmoteData', () => { describe('when processing animations with _Start suffix', () => { it('should create startAnimation for animations ending with _Start', () => { const animations = ['HighFive_Start', 'Wave_Prop_Start'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.startAnimation).toBeDefined() expect(result.startAnimation?.[ArmatureId.Armature]).toEqual({ - animation: 'HighFive_Start', - loop: true + animation: 'HighFive_Start' }) + expect(result.startAnimation?.loop).toEqual(true) }) it('should handle prop start animations', () => { const animations = ['HighFive_Prop_Start'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.startAnimation).toBeDefined() expect(result.startAnimation?.[ArmatureId.Armature_Prop]).toEqual({ - animation: 'HighFive_Prop_Start', - loop: true + animation: 'HighFive_Prop_Start' }) + expect(result.startAnimation?.loop).toEqual(true) }) }) @@ -32,7 +32,7 @@ describe('autocompleteEmoteData', () => { it('should create outcomes for non-start animations', () => { const animations = ['HighFive_Avatar', 'Wave_Avatar'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.outcomes).toBeDefined() expect(result.outcomes).toHaveLength(2) @@ -40,53 +40,53 @@ describe('autocompleteEmoteData', () => { title: 'High Five', clips: { Armature: { - animation: 'HighFive_Avatar', - loop: true + animation: 'HighFive_Avatar' } - } + }, + loop: false }) expect(result.outcomes?.[1]).toEqual({ title: 'Wave', clips: { [ArmatureId.Armature]: { - animation: 'Wave_Avatar', - loop: true + animation: 'Wave_Avatar' } - } + }, + loop: false }) }) it('should handle AvatarOther animations', () => { const animations = ['HighFive_AvatarOther'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.outcomes).toBeDefined() expect(result.outcomes?.[0]).toEqual({ title: 'High Five', clips: { [ArmatureId.Armature_Other]: { - animation: 'HighFive_AvatarOther', - loop: true + animation: 'HighFive_AvatarOther' } - } + }, + loop: false }) }) it('should handle Prop animations', () => { const animations = ['HighFive_Prop'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.outcomes).toBeDefined() expect(result.outcomes?.[0]).toEqual({ title: 'High Five', clips: { [ArmatureId.Armature_Prop]: { - animation: 'HighFive_Prop', - loop: true + animation: 'HighFive_Prop' } - } + }, + loop: false }) }) }) @@ -95,19 +95,19 @@ describe('autocompleteEmoteData', () => { it('should handle both start animations and outcomes', () => { const animations = ['HighFive_Start', 'HighFive_Avatar', 'HighFive_Prop', 'Wave_Prop_Start', 'Wave_Avatar'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.startAnimation).toBeDefined() expect(result.startAnimation?.[ArmatureId.Armature]).toEqual({ - animation: 'HighFive_Start', - loop: true + animation: 'HighFive_Start' }) expect(result.startAnimation?.[ArmatureId.Armature_Prop]).toEqual({ - animation: 'Wave_Prop_Start', - loop: true + animation: 'Wave_Prop_Start' }) + expect(result.startAnimation?.loop).toEqual(true) + expect(result.outcomes).toBeDefined() expect(result.outcomes).toHaveLength(2) @@ -116,12 +116,10 @@ describe('autocompleteEmoteData', () => { expect(highFiveOutcome).toBeDefined() expect(highFiveOutcome?.clips).toEqual({ [ArmatureId.Armature]: { - animation: 'HighFive_Avatar', - loop: true + animation: 'HighFive_Avatar' }, [ArmatureId.Armature_Prop]: { - animation: 'HighFive_Prop', - loop: true + animation: 'HighFive_Prop' } }) @@ -130,8 +128,7 @@ describe('autocompleteEmoteData', () => { expect(waveOutcome).toBeDefined() expect(waveOutcome?.clips).toEqual({ [ArmatureId.Armature]: { - animation: 'Wave_Avatar', - loop: true + animation: 'Wave_Avatar' } }) }) @@ -141,7 +138,7 @@ describe('autocompleteEmoteData', () => { it('should format camelCase names correctly', () => { const animations = ['SuperJump_Avatar', 'CamelCaseTest_Avatar'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.outcomes).toBeDefined() expect(result.outcomes?.[0].title).toBe('Super Jump') @@ -151,7 +148,7 @@ describe('autocompleteEmoteData', () => { describe('when processing empty or invalid animations', () => { it('should handle empty array', () => { - const result = autocompleteEmoteData([]) + const result = autocompleteSocialEmoteData([]) expect(result.startAnimation).toBeUndefined() expect(result.outcomes).toBeUndefined() @@ -160,7 +157,7 @@ describe('autocompleteEmoteData', () => { it('should handle animations without recognized suffixes', () => { const animations = ['UnknownAnimation', 'AnotherUnknown'] - const result = autocompleteEmoteData(animations) + const result = autocompleteSocialEmoteData(animations) expect(result.outcomes).toBeDefined() expect(result.outcomes?.[0].clips[ArmatureId.Armature]).toBeDefined() // Default to Armature diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index c990ab312..dd6e785de 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -4,6 +4,7 @@ import { ContractAddress, ContractNetwork, EmoteCategory, + EmoteClip, EmoteWithBlobs, Mapping, MappingType, @@ -345,7 +346,7 @@ const formatAnimationTitle = (baseName: string): string => { /** * Autocompletes emote data based on animation naming conventions */ -export const autocompleteEmoteData = (animations: string[]) => { +export const autocompleteSocialEmoteData = (animations: string[]) => { let startAnimations: Partial = {} const outcomes: OutcomeGroup[] = [] @@ -371,8 +372,7 @@ export const autocompleteEmoteData = (animations: string[]) => { startAnimations = { ...startAnimations, [armature]: { - animation: startAnimation, - loop: true + animation: startAnimation } } } @@ -382,15 +382,13 @@ export const autocompleteEmoteData = (animations: string[]) => { if (outcomeAnimations.length > 0) { const clipsArray = outcomeAnimations.map(animation => ({ armature: getArmatureFromAnimation(animation), - animation, - loop: true + animation })) - const clips: Partial> = {} + const clips: Partial> = {} clipsArray.forEach(clip => { clips[clip.armature] = { - animation: clip.animation, - loop: clip.loop + animation: clip.animation } }) @@ -403,7 +401,7 @@ export const autocompleteEmoteData = (animations: string[]) => { }) return { - startAnimation: Object.keys(startAnimations).length > 0 ? startAnimations : undefined, + startAnimation: Object.keys(startAnimations).length > 0 ? { ...startAnimations, loop: true } : undefined, outcomes: outcomes.length > 0 ? outcomes : undefined } } From e8e3799c40523f0f62582235883defd83c3f2b8c Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 17:28:41 -0300 Subject: [PATCH 30/48] fix: Remove unused var --- .../ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx index 1be205ed2..91a24d6e7 100644 --- a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx @@ -1,4 +1,4 @@ -import { FC, memo, useState, useRef, useCallback, ChangeEvent, KeyboardEvent } from 'react' +import { FC, memo, useState, useCallback, ChangeEvent, KeyboardEvent } from 'react' import classNames from 'classnames' import { Button } from 'decentraland-ui' import { Props } from './DynamicInput.types' @@ -6,7 +6,6 @@ import styles from './DynamicInput.module.css' const DynamicInput: FC = ({ value, disabled = false, placeholder = '', editable = false, className = '', maxLength, onChange }) => { const [isEditing, setIsEditing] = useState(false) - const inputRef = useRef(null) const handleChange = useCallback( (event: ChangeEvent) => { @@ -49,7 +48,6 @@ const DynamicInput: FC = ({ value, disabled = false, placeholder = '', ed return (
Date: Wed, 1 Oct 2025 18:55:23 -0300 Subject: [PATCH 31/48] fix: Add empty option for audio --- src/components/ItemEditorPage/RightPanel/RightPanel.tsx | 8 +++++--- src/modules/translation/languages/en.json | 1 + src/modules/translation/languages/es.json | 1 + src/modules/translation/languages/zh.json | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx index d7fcf1287..52c91cd53 100644 --- a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx +++ b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx @@ -246,7 +246,7 @@ export default class RightPanel extends React.PureComponent { handleStartAnimationAudioClipChange = (audio: string) => { const data = this.state.data as EmoteDataADR287 const startAnimation = { ...(data.startAnimation || {}) } - startAnimation.audio = audio + startAnimation.audio = audio || undefined this.setState({ data: { ...data, startAnimation }, isDirty: this.isDirty({ data: { ...data, startAnimation } }) }) } @@ -305,7 +305,7 @@ export default class RightPanel extends React.PureComponent { handleOutcomeAudioClipChange = (outcomeIndex: number, audio: string) => { const data = this.state.data as EmoteDataADR287 const outcomes = [...data.outcomes] - outcomes[outcomeIndex].audio = audio + outcomes[outcomeIndex].audio = audio || undefined this.setState({ data: { ...data, outcomes }, isDirty: this.isDirty({ data: { ...data, outcomes } }) }) } @@ -563,7 +563,7 @@ export default class RightPanel extends React.PureComponent { getAudioOptions(values: Item['contents']): Array<{ value: string; text: string }> { const audioFiles = new Set() - return Object.keys(values) + const options = Object.keys(values) .map(key => { if (isAudioFile(key)) { // Extract filename without male/ or female/ prefix @@ -581,6 +581,8 @@ export default class RightPanel extends React.PureComponent { return null }) .filter(Boolean) as { value: string; text: string }[] + + return [{ value: '', text: t('item_editor.right_panel.social_emote.no_audio') }, ...options] } renderOverrides(item: Item) { diff --git a/src/modules/translation/languages/en.json b/src/modules/translation/languages/en.json index eba055e32..25ad14464 100644 --- a/src/modules/translation/languages/en.json +++ b/src/modules/translation/languages/en.json @@ -2134,6 +2134,7 @@ "avatar": "Avatar", "props": "Props", "audio": "Audio", + "no_audio": "No audio", "optional": "optional", "randomize_outcomes": "Randomize outcomes", "add_outcome": "Add an outcome" diff --git a/src/modules/translation/languages/es.json b/src/modules/translation/languages/es.json index 825bbb1b4..f1ac62193 100644 --- a/src/modules/translation/languages/es.json +++ b/src/modules/translation/languages/es.json @@ -2152,6 +2152,7 @@ "avatar": "Avatar", "props": "Props", "audio": "Audio", + "no_audio": "Sin audio", "optional": "opcional", "randomize_outcomes": "Aleatorizar opciones", "add_outcome": "Agregar una opción" diff --git a/src/modules/translation/languages/zh.json b/src/modules/translation/languages/zh.json index b5d9e19fe..503b144dc 100644 --- a/src/modules/translation/languages/zh.json +++ b/src/modules/translation/languages/zh.json @@ -2133,6 +2133,7 @@ "avatar": "阿凡达", "props": "道具", "audio": "音频", + "no_audio": "没有音频", "optional": "可选", "randomize_outcomes": "随机化结果", "add_outcome": "添加结果" From 689b41e723ae6584d74fac68df5fa2ee0cc87bc8 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 19:12:44 -0300 Subject: [PATCH 32/48] fix: Remove unused translation --- src/modules/translation/languages/en.json | 1 - src/modules/translation/languages/es.json | 1 - src/modules/translation/languages/zh.json | 1 - 3 files changed, 3 deletions(-) diff --git a/src/modules/translation/languages/en.json b/src/modules/translation/languages/en.json index 25ad14464..eba055e32 100644 --- a/src/modules/translation/languages/en.json +++ b/src/modules/translation/languages/en.json @@ -2134,7 +2134,6 @@ "avatar": "Avatar", "props": "Props", "audio": "Audio", - "no_audio": "No audio", "optional": "optional", "randomize_outcomes": "Randomize outcomes", "add_outcome": "Add an outcome" diff --git a/src/modules/translation/languages/es.json b/src/modules/translation/languages/es.json index f1ac62193..825bbb1b4 100644 --- a/src/modules/translation/languages/es.json +++ b/src/modules/translation/languages/es.json @@ -2152,7 +2152,6 @@ "avatar": "Avatar", "props": "Props", "audio": "Audio", - "no_audio": "Sin audio", "optional": "opcional", "randomize_outcomes": "Aleatorizar opciones", "add_outcome": "Agregar una opción" diff --git a/src/modules/translation/languages/zh.json b/src/modules/translation/languages/zh.json index 503b144dc..b5d9e19fe 100644 --- a/src/modules/translation/languages/zh.json +++ b/src/modules/translation/languages/zh.json @@ -2133,7 +2133,6 @@ "avatar": "阿凡达", "props": "道具", "audio": "音频", - "no_audio": "没有音频", "optional": "可选", "randomize_outcomes": "随机化结果", "add_outcome": "添加结果" From 212fa8cd0a1c9d942b25784b2cfde1861d5cebd8 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 1 Oct 2025 19:13:48 -0300 Subject: [PATCH 33/48] fix: Optional value for audio and animations --- .../ItemEditorPage/RightPanel/RightPanel.tsx | 77 +++++++++++-------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx index 52c91cd53..06928d79e 100644 --- a/src/components/ItemEditorPage/RightPanel/RightPanel.tsx +++ b/src/components/ItemEditorPage/RightPanel/RightPanel.tsx @@ -228,13 +228,18 @@ export default class RightPanel extends React.PureComponent { const data = this.state.data as any const startAnimation = { ...(data.startAnimation || {}) } - if (!startAnimation[prop]) { - startAnimation[prop] = { armature: '', animation: '', loop: true } - } + // For optional fields (Armature_Prop), remove the entire prop if value is empty + if (value === '' && prop === ArmatureId.Armature_Prop) { + delete startAnimation[prop] + } else { + if (!startAnimation[prop]) { + startAnimation[prop] = { armature: '', animation: '', loop: true } + } - startAnimation[prop] = { - ...startAnimation[prop], - [field]: value + startAnimation[prop] = { + ...startAnimation[prop], + [field]: value + } } this.setState({ @@ -282,15 +287,21 @@ export default class RightPanel extends React.PureComponent { const data = this.state.data as unknown as EmoteDataADR287 const outcomes = [...data.outcomes] const clips = { ...outcomes[outcomeIndex].clips } - if (!clips[armatureId]) { + + if (value === '') { + // Remove the entire armatureId if value is empty + delete clips[armatureId] + } else { + if (!clips[armatureId]) { + clips[armatureId] = { + animation: '' + } + } clips[armatureId] = { - animation: '' + ...clips[armatureId], + [field]: value } } - clips[armatureId] = { - ...clips[armatureId], - [field]: value - } outcomes[outcomeIndex] = { ...outcomes[outcomeIndex], @@ -544,7 +555,7 @@ export default class RightPanel extends React.PureComponent { })) } - getAnimationOptions(animationData: AnimationData): Array<{ value: string; text: string }> { + getAnimationOptions(animationData: AnimationData, optional = false): Array<{ value: string; text: string }> { if (!animationData.isLoaded) { return [] } @@ -554,10 +565,12 @@ export default class RightPanel extends React.PureComponent { return [] } - return animationData.animations.map((animation: AnimationClip) => ({ + const options = animationData.animations.map((animation: AnimationClip) => ({ value: animation.name, text: animation.name })) + + return optional ? [{ value: '', text: '--' }, ...options] : options } getAudioOptions(values: Item['contents']): Array<{ value: string; text: string }> { @@ -582,7 +595,7 @@ export default class RightPanel extends React.PureComponent { }) .filter(Boolean) as { value: string; text: string }[] - return [{ value: '', text: t('item_editor.right_panel.social_emote.no_audio') }, ...options] + return [{ value: '', text: '--' }, ...options] } renderOverrides(item: Item) { @@ -849,18 +862,18 @@ export default class RightPanel extends React.PureComponent { disabled={isLoading} onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature, 'animation', value)} /> - {(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop] ? ( - - itemId={item.id} - label={`${t('item_editor.right_panel.social_emote.props')} (${t( - 'item_editor.right_panel.social_emote.optional' - )})`} - value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop]?.animation || ''} - options={this.getAnimationOptions(animationData)} - disabled={isLoading} - onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature_Prop, 'animation', value)} - /> - ) : null} + + + itemId={item.id} + label={`${t('item_editor.right_panel.social_emote.props')} (${t( + 'item_editor.right_panel.social_emote.optional' + )})`} + value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop]?.animation} + options={this.getAnimationOptions(animationData, true)} + disabled={isLoading} + onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature_Prop, 'animation', value)} + /> + {Object.values(item.contents).length > 0 && itemHasAudio(item) ? ( itemId={item.id} @@ -928,7 +941,7 @@ export default class RightPanel extends React.PureComponent { itemId={item.id} label={`${t('item_editor.right_panel.social_emote.avatar')} 1`} - value={outcome.clips[ArmatureId.Armature]?.animation || ''} + value={outcome.clips[ArmatureId.Armature]?.animation} options={this.getAnimationOptions(animationData)} disabled={isLoading} onChange={value => this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature, 'animation', value)} @@ -939,8 +952,8 @@ export default class RightPanel extends React.PureComponent { label={`${t('item_editor.right_panel.social_emote.avatar')} 2 (${t( 'item_editor.right_panel.social_emote.optional' )})`} - value={outcome.clips[ArmatureId.Armature_Other]?.animation || ''} - options={this.getAnimationOptions(animationData)} + value={outcome.clips[ArmatureId.Armature_Other]?.animation} + options={this.getAnimationOptions(animationData, true)} disabled={isLoading} onChange={value => this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature_Other, 'animation', value) @@ -952,8 +965,8 @@ export default class RightPanel extends React.PureComponent { label={`${t('item_editor.right_panel.social_emote.props')} (${t( 'item_editor.right_panel.social_emote.optional' )})`} - value={outcome.clips[ArmatureId.Armature_Prop]?.animation || ''} - options={this.getAnimationOptions(animationData)} + value={outcome.clips[ArmatureId.Armature_Prop]?.animation} + options={this.getAnimationOptions(animationData, true)} disabled={isLoading} onChange={value => this.handleOutcomeClipChange(outcomeIndex, ArmatureId.Armature_Prop, 'animation', value) From add5acd0772686defc4da14ea0dfc2dbf47f7a47 Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 13 Oct 2025 18:12:23 -0300 Subject: [PATCH 34/48] fix: Send outcomeType to the metadata --- src/modules/item/utils.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/modules/item/utils.ts b/src/modules/item/utils.ts index 453dae885..a9c6e14fb 100644 --- a/src/modules/item/utils.ts +++ b/src/modules/item/utils.ts @@ -260,12 +260,11 @@ export function buildADR287EmoteMetadata( bodyShapeTypes: string, loop: number, additionalProperties?: string, - _outcomeType?: string + outcomeType?: string ): string { - // TODO: ADR287 we need to add the outcomeType once the subgraph is updated- ${outcomeType ? `:${outcomeType}` : ''} return `${version}:${type}:${name}:${description}:${category}:${bodyShapeTypes}:${loop}${ additionalProperties ? `:${additionalProperties}` : '' - }` + }${outcomeType ? `:${outcomeType}` : ''}` } // Metadata looks like this: From 1deff3e2bd782b06eed74ffcf12995847bf0579f Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 13 Oct 2025 19:15:32 -0300 Subject: [PATCH 35/48] chore: Update CI/CD node version to 22 --- .github/workflows/audit.yml | 6 +++--- .github/workflows/build-release.yaml | 6 +++--- .github/workflows/test.yaml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 28d7613e6..81552fc6f 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -6,11 +6,11 @@ jobs: audit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Use Node.js 20.x + - uses: actions/checkout@v2 + - name: Use Node.js 22.x uses: actions/setup-node@v4.0.1 with: - node-version: 20.x + node-version: 22.x cache: 'npm' - name: Upgrade npm run: npm i -g npm diff --git a/.github/workflows/build-release.yaml b/.github/workflows/build-release.yaml index 33f594704..d1a0c0415 100644 --- a/.github/workflows/build-release.yaml +++ b/.github/workflows/build-release.yaml @@ -14,11 +14,11 @@ jobs: id-token: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Use Node.js 20.x + - uses: actions/checkout@v2 + - name: Use Node.js 22.x uses: actions/setup-node@v4.0.1 with: - node-version: 20.x + node-version: 22.x cache: 'npm' - name: Set package.json version uses: decentraland/oddish-action@master diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 14e3b95ed..5fdc21e11 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,11 +6,11 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Use Node.js 20.x - uses: actions/setup-node@v1 + - uses: actions/checkout@v2 + - name: Use Node.js 22.x + uses: actions/setup-node@v4.0.1 with: - node-version: 20.x + node-version: 22.x - name: Install run: npm ci --legacy-peer-deps - name: Test From 267792532f93866eb132cbd40437c923d8e0fbbe Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 13 Oct 2025 19:15:46 -0300 Subject: [PATCH 36/48] chore: Remove custom install command --- vercel.json | 1 - 1 file changed, 1 deletion(-) diff --git a/vercel.json b/vercel.json index 5d76a7bad..9ce528cf1 100644 --- a/vercel.json +++ b/vercel.json @@ -9,7 +9,6 @@ "VITE_REACT_APP_DCL_DEFAULT_ENV": "dev" } }, - "installCommand": "npm ci --legacy-peer-deps", "rewrites": [ { "source": "/auth/:match*", From 05a757e38b8a37598cf8948204c0e60e5141befb Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Wed, 15 Oct 2025 18:55:20 -0300 Subject: [PATCH 37/48] fix: Dyanmic input --- .../DynamicInput/DynamicInput.module.css | 35 +++++++- .../RightPanel/DynamicInput/DynamicInput.tsx | 79 ++++++++++++++----- 2 files changed, 91 insertions(+), 23 deletions(-) diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css index 6dfeeb91d..d24f3ffb2 100644 --- a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.module.css @@ -1,7 +1,8 @@ .dynamicInput { - display: flex; + display: inline-flex; align-items: center; gap: 8px; + position: relative; } .dynamicInput .dynamicInputField { @@ -11,9 +12,19 @@ color: var(--text); font-size: inherit; font-family: inherit; + line-height: inherit; padding: 0; margin: 0; - min-width: 1ch; + box-sizing: content-box; + width: auto; + min-width: 16px; + max-width: 100%; + transition: width 120ms ease; + letter-spacing: inherit; +} + +.dynamicInput .noTransition { + transition: none !important; } .dynamicInput .dynamicInputField:disabled { @@ -45,3 +56,23 @@ .dynamicInput .dynamicInputEditButton:hover { background-color: var(--hover) !important; } + +.dynamicInput .mirrorSpan { + position: absolute; + visibility: hidden; + pointer-events: none; + white-space: pre; + font-size: inherit; + font-family: inherit; + line-height: inherit; + letter-spacing: inherit; + padding: 0; + border: 0; + margin: 0; + direction: inherit; + unicode-bidi: plaintext; +} + +.dynamicInput .dynamicInputField::placeholder { + color: var(--text-secondary, #9aa0a6); +} diff --git a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx index 91a24d6e7..3e88b5e17 100644 --- a/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx +++ b/src/components/ItemEditorPage/RightPanel/DynamicInput/DynamicInput.tsx @@ -1,63 +1,100 @@ -import { FC, memo, useState, useCallback, ChangeEvent, KeyboardEvent } from 'react' +import { FC, memo, useState, useCallback, useRef, useLayoutEffect, ChangeEvent, KeyboardEvent, CompositionEvent } from 'react' import classNames from 'classnames' import { Button } from 'decentraland-ui' import { Props } from './DynamicInput.types' import styles from './DynamicInput.module.css' +const EXTRA_CURSOR_SPACE = 6 // px + const DynamicInput: FC = ({ value, disabled = false, placeholder = '', editable = false, className = '', maxLength, onChange }) => { const [isEditing, setIsEditing] = useState(false) + const inputRef = useRef(null) + const mirrorRef = useRef(null) + const typingTimerRef = useRef(null) + const isComposingRef = useRef(false) + + const applyNoTransitionBriefly = useCallback(() => { + const el = inputRef.current + if (!el) return + el.classList.add(styles.noTransition) + if (typingTimerRef.current) window.clearTimeout(typingTimerRef.current) + typingTimerRef.current = window.setTimeout(() => { + el.classList.remove(styles.noTransition) + typingTimerRef.current = null + }, 120) as unknown as number + }, []) + + const measureAndApplyWidth = useCallback(() => { + const mirror = mirrorRef.current + const input = inputRef.current + if (!mirror || !input) return + + if (isComposingRef.current) return + + mirror.textContent = value && value.length > 0 ? value : placeholder || '\u200B' + const rect = mirror.getBoundingClientRect() + const width = rect.width + EXTRA_CURSOR_SPACE + input.style.width = `${width}px` + }, [value, placeholder]) + + useLayoutEffect(() => { + measureAndApplyWidth() + }, [measureAndApplyWidth]) const handleChange = useCallback( (event: ChangeEvent) => { const newValue = event.target.value - if (value !== newValue && onChange) { onChange(maxLength ? newValue.slice(0, maxLength) : newValue) } + applyNoTransitionBriefly() + requestAnimationFrame(measureAndApplyWidth) }, - [value, maxLength, onChange] + [value, maxLength, onChange, applyNoTransitionBriefly, measureAndApplyWidth] ) - const handleKeyDown = useCallback((event: KeyboardEvent) => { - if (event.key === 'Enter') { - setIsEditing(false) - } + const handleCompositionStart = useCallback((_: CompositionEvent) => { + isComposingRef.current = true }, []) - const handleBlur = useCallback(() => { - setIsEditing(false) + const handleCompositionEnd = useCallback( + (_: CompositionEvent) => { + isComposingRef.current = false + requestAnimationFrame(measureAndApplyWidth) + }, + [measureAndApplyWidth] + ) + + const handleKeyDown = useCallback((event: KeyboardEvent) => { + if (event.key === 'Enter') setIsEditing(false) }, []) + const handleBlur = useCallback(() => setIsEditing(false), []) const handleEdit = useCallback(() => { setIsEditing(true) + setTimeout(() => inputRef.current?.focus(), 0) }, []) - const calculateInputWidth = useCallback(() => { - const text = value || placeholder - const textLength = text.length - - if (textLength === 0) return '1em' - - const baseWidth = textLength * 0.55 - return `${Math.max(baseWidth, 0.5)}em` - }, [value, placeholder]) - - const inputWidth = calculateInputWidth() const canEdit = editable && !disabled return (
+ +
+ {isRenderingAnEmote && !isLoading && wearableController ? ( + ) : null} {isLoading && (
@@ -334,7 +312,19 @@ export default class CenterPanel extends React.PureComponent {
- {isRenderingAnEmote ? null : this.renderEmoteSelector()} + {isRenderingAnEmote ? ( + !isLoading && wearableController ? ( + + ) : null + ) : ( + this.renderEmoteSelector() + )}
Date: Mon, 3 Nov 2025 21:55:47 -0300 Subject: [PATCH 41/48] fix: Pass startAnimation and outcomes properties to EmoteDataADR74 --- .../Modals/CreateSingleItemModal/utils.ts | 17 +++- src/lib/getModelData.ts | 1 - src/modules/editor/utils.ts | 41 ++++------ src/modules/item/export.ts | 50 ++---------- src/modules/item/types.ts | 9 ++- src/modules/item/utils.ts | 77 ++++++------------- 6 files changed, 63 insertions(+), 132 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/utils.ts b/src/components/Modals/CreateSingleItemModal/utils.ts index 3577a19fc..e5a87f69c 100644 --- a/src/components/Modals/CreateSingleItemModal/utils.ts +++ b/src/components/Modals/CreateSingleItemModal/utils.ts @@ -80,7 +80,17 @@ export function toWearableWithBlobs({ contents, file }: { contents?: Record; file?: File }): EmoteWithBlobs { +export function toEmoteWithBlobs({ + contents, + file, + startAnimation, + outcomes +}: { + contents?: Record + file?: File + startAnimation?: StartAnimation + outcomes?: OutcomeGroup[] +}): EmoteWithBlobs { const mainFile = contents && Object.keys(contents).find(content => isModelFile(content)) if (contents && !mainFile) { throw Error('Not valid main content') @@ -111,7 +121,10 @@ export function toEmoteWithBlobs({ contents, file }: { contents?: Record = {}) throw new EmoteWithMeshError() } - // TODO: ADR287 // For social emotes, we need to count the number of additional armatures, currently only one additional armature is supported const additionalArmatures = armatures.some(({ name }) => name === ARMATURES.OTHER) ? 1 : 0 diff --git a/src/modules/editor/utils.ts b/src/modules/editor/utils.ts index c02774be1..05c09b998 100644 --- a/src/modules/editor/utils.ts +++ b/src/modules/editor/utils.ts @@ -1,6 +1,6 @@ import type { Wearable } from 'decentraland-ecs' import { Locale, BodyShape, WearableCategory, WearableDefinition, EmoteDefinition } from '@dcl/schemas' -import { isEmoteDataADR287, Item, ItemType } from 'modules/item/types' +import { Item, ItemType } from 'modules/item/types' import { CatalystWearable, EditorScene, UnityKeyboardEvent } from 'modules/editor/types' import { Project } from 'modules/project/types' import { getSceneDefinition } from 'modules/project/export' @@ -324,33 +324,18 @@ export function toEmote(item: Item): EmoteDefinition { text: item.name } ], - // TODO: ADR287 - ...(isEmoteDataADR287(item.data) - ? { - emoteDataADR287: { - ...item.data, - category: item.data.category, - representations: item.data.representations.map(representation => ({ - ...representation, - contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) - })), - loop: item.data.loop, - startAnimation: item.data.startAnimation, - randomizeOutcomes: item.data.randomizeOutcomes, - outcomes: item.data.outcomes - } - } - : { - emoteDataADR74: { - ...item.data, - category: item.data.category, - representations: item.data.representations.map(representation => ({ - ...representation, - contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) - })), - loop: item.data.loop - } - }) + emoteDataADR74: { + ...item.data, + category: item.data.category, + representations: item.data.representations.map(representation => ({ + ...representation, + contents: representation.contents.map(path => ({ key: path, url: getContentsStorageUrl(item.contents[path]) })) + })), + loop: item.data.loop, + startAnimation: item.data.startAnimation, + randomizeOutcomes: item.data.randomizeOutcomes, + outcomes: item.data.outcomes + } } } diff --git a/src/modules/item/export.ts b/src/modules/item/export.ts index d17619ed6..c2f26d3c7 100644 --- a/src/modules/item/export.ts +++ b/src/modules/item/export.ts @@ -1,4 +1,4 @@ -import { Emote, EmoteDataADR287, EntityType, Locale, Rarity, Wearable, WearableCategory, WearableRepresentation } from '@dcl/schemas' +import { Emote, EntityType, Locale, Rarity, Wearable, WearableCategory, WearableRepresentation } from '@dcl/schemas' import { DeploymentPreparationData, buildEntity } from 'dcl-catalyst-client/dist/client/utils/DeploymentBuilder' import { MerkleDistributorInfo } from '@dcl/content-hash-tree/dist/types' import { calculateMultipleHashesADR32, calculateMultipleHashesADR32LegacyQmHash } from '@dcl/hashing' @@ -6,7 +6,7 @@ import { BuilderAPI } from 'lib/api/builder' import { buildCatalystItemURN } from 'lib/urn' import { makeContentFiles, computeHashes } from 'modules/deployment/contentUtils' import { Collection } from 'modules/collection/types' -import { Item, IMAGE_PATH, THUMBNAIL_PATH, ItemType, EntityHashingType, isEmoteItemType, VIDEO_PATH, isEmoteDataADR287 } from './types' +import { Item, IMAGE_PATH, THUMBNAIL_PATH, ItemType, EntityHashingType, isEmoteItemType, VIDEO_PATH } from './types' import { EMPTY_ITEM_METRICS, generateCatalystImage, generateImage } from './utils' /** @@ -209,47 +209,19 @@ function buildADR74EmoteEntityMetadata(collection: Collection, item: Item): Emote { - if (!collection.contractAddress || !item.tokenId) { - throw new Error('You need the collection and item to be published') - } - - // The order of the metadata properties can't be changed. Changing it will result in a different content hash. - const catalystItem: Emote = { - id: buildCatalystItemURN(collection.contractAddress, item.tokenId), - name: item.name, - description: item.description, - collectionAddress: collection.contractAddress, - rarity: item.rarity! as unknown as Rarity, - i18n: [{ code: Locale.EN, text: item.name }], - // TODO: ADR287 - emoteDataADR287: { category: item.data.category, representations: item.data.representations, tags: item.data.tags, loop: item.data.loop, - startAnimation: (item.data as EmoteDataADR287).startAnimation, - randomizeOutcomes: (item.data as EmoteDataADR287).randomizeOutcomes, - outcomes: (item.data as EmoteDataADR287).outcomes + startAnimation: item.data.startAnimation, + randomizeOutcomes: item.data.randomizeOutcomes, + outcomes: item.data.outcomes }, image: IMAGE_PATH, thumbnail: THUMBNAIL_PATH, metrics: EMPTY_ITEM_METRICS } - console.log('generating emote metadata for ADR 287', { catalystItem }) + return catalystItem } @@ -291,9 +263,7 @@ export async function buildItemEntity( let metadata const isEmote = isEmoteItemType(item) //TODO: @Emotes remove this FF once launched if (isEmote) { - metadata = isEmoteDataADR287(item.data) - ? buildADR287EmoteEntityMetadata(collection, item) - : buildADR74EmoteEntityMetadata(collection, item) + metadata = buildADR74EmoteEntityMetadata(collection, item) } else if (tree && itemHash) { metadata = buildTPItemEntityMetadata(item, itemHash, tree) } else { @@ -334,11 +304,7 @@ export async function buildStandardWearableContentHash( ): Promise { const hashes = await buildItemEntityContent(item) const content = Object.keys(hashes).map(file => ({ file, hash: hashes[file] })) - const metadata = isEmoteItemType(item) - ? isEmoteDataADR287(item.data) - ? buildADR287EmoteEntityMetadata(collection, item) - : buildADR74EmoteEntityMetadata(collection, item) - : buildWearableEntityMetadata(collection, item) + const metadata = isEmoteItemType(item) ? buildADR74EmoteEntityMetadata(collection, item) : buildWearableEntityMetadata(collection, item) if (hashingType === EntityHashingType.V0) { return (await calculateMultipleHashesADR32LegacyQmHash(content, metadata)).hash } else { diff --git a/src/modules/item/types.ts b/src/modules/item/types.ts index db834e3ec..1757afae5 100644 --- a/src/modules/item/types.ts +++ b/src/modules/item/types.ts @@ -2,7 +2,6 @@ import { BuiltItem, Content } from '@dcl/builder-client' import { BodyShape, EmoteDataADR74, - EmoteDataADR287, Wearable, WearableCategory, Rarity, @@ -90,7 +89,7 @@ export type WearableData = { outlineCompatible?: boolean } -export type EmoteData = EmoteDataADR74 | EmoteDataADR287 +export type EmoteData = EmoteDataADR74 type BaseItem = { id: string // uuid @@ -141,8 +140,10 @@ export type Item = Omit & { export const isEmoteItemType = (item: Item | Item): item is Item => (item as Item).type === ItemType.EMOTE -export const isEmoteDataADR287 = (data: EmoteData): data is EmoteDataADR287 => - (data as EmoteDataADR287).startAnimation !== undefined && (data as EmoteDataADR287).outcomes !== undefined +export const isSocialEmote = (data: WearableData | EmoteData | undefined): boolean => { + return !!data && (data as unknown as EmoteData).startAnimation !== undefined && (data as unknown as EmoteData).outcomes !== undefined +} + export const isEmoteData = (data: WearableData | EmoteData | undefined): data is EmoteData => !!data && (data as unknown as EmoteData).loop !== undefined diff --git a/src/modules/item/utils.ts b/src/modules/item/utils.ts index a9c6e14fb..81a71ba94 100644 --- a/src/modules/item/utils.ts +++ b/src/modules/item/utils.ts @@ -11,7 +11,6 @@ import { BodyPartCategory, BodyShape, EmoteCategory, - EmoteDataADR287, Wearable, Rarity, WearableCategory, @@ -54,7 +53,7 @@ import { VIDEO_PATH, EmoteOutcomeMetadataType, EmoteData, - isEmoteDataADR287 + isSocialEmote } from './types' import { getChainIdByNetwork, getSigner } from 'decentraland-dapps/dist/lib' import { getOffChainMarketplaceContract, getTradeSignature } from 'decentraland-dapps/dist/lib/trades' @@ -134,15 +133,15 @@ export function getEmoteAdditionalProperties(item: Item): string } export function getEmoteOutcomeType(item: Item): string { - if (!isEmoteDataADR287(item.data)) { + if (!isSocialEmote(item.data)) { return '' } - if (item.data.outcomes.length === 1) { + if ((item.data as unknown as EmoteData).outcomes!.length === 1) { return EmoteOutcomeMetadataType.SIMPLE_OUTCOME } - if (item.data.outcomes.length > 1 && item.data.randomizeOutcomes) { + if ((item.data as unknown as EmoteData).outcomes!.length > 1 && (item.data as unknown as EmoteData).randomizeOutcomes) { return EmoteOutcomeMetadataType.RANDOM_OUTCOME } @@ -237,21 +236,6 @@ export function buildItemMetadata( } export function buildEmoteMetada( - version: number, - type: ItemMetadataType, - name: string, - description: string, - category: string, - bodyShapeTypes: string, - loop: number, - additionalProperties?: string -): string { - return `${version}:${type}:${name}:${description}:${category}:${bodyShapeTypes}:${loop}${ - additionalProperties ? `:${additionalProperties}` : '' - }` -} - -export function buildADR287EmoteMetadata( version: number, type: ItemMetadataType, name: string, @@ -289,29 +273,17 @@ export function getMetadata(item: Item) { } const additionalProperties = getEmoteAdditionalProperties(item as unknown as Item) const outcomeType = getEmoteOutcomeType(item as unknown as Item) - // TODO: ADR287 - return isEmoteDataADR287(data) - ? buildADR287EmoteMetadata( - 1, - getItemMetadataType(item), - item.name, - item.description, - data.category, - bodyShapeTypes, - data.loop ? 1 : 0, - additionalProperties, - outcomeType - ) - : buildEmoteMetada( - 1, - getItemMetadataType(item), - item.name, - item.description, - data.category, - bodyShapeTypes, - data.loop ? 1 : 0, - additionalProperties - ) + return buildEmoteMetada( + 1, + getItemMetadataType(item), + item.name, + item.description, + data.category, + bodyShapeTypes, + data.loop ? 1 : 0, + additionalProperties, + outcomeType + ) } default: throw new Error(`Unknown item.type "${item.type as unknown as string}"`) @@ -641,20 +613,15 @@ export function isEmoteSynced(item: Item | Item, entity: Entity) throw new Error('Item must be EMOTE') } - // check if metadata has the new schema from ADR74 or ADR287 + // check if metadata has the new schema from ADR74 const isADR74 = 'emoteDataADR74' in entity.metadata - const isADR287 = 'emoteDataADR287' in entity.metadata - if (!isADR74 && !isADR287) { + if (!isADR74) { return false } // check if metadata is synced const catalystItem = entity.metadata - const catalystItemMetadataData = isADR74 - ? entity.metadata.emoteDataADR74 - : isADR287 - ? entity.metadata.emoteDataADR287 - : entity.metadata.data + const catalystItemMetadataData = isADR74 ? entity.metadata.emoteDataADR74 : entity.metadata.data const data = item.data as unknown as EmoteData let hasMetadataChanged = @@ -664,12 +631,12 @@ export function isEmoteSynced(item: Item | Item, entity: Entity) data.loop !== catalystItemMetadataData.loop || data.tags.toString() !== catalystItemMetadataData.tags.toString() - if (isADR287) { + if (isSocialEmote(data)) { hasMetadataChanged = hasMetadataChanged || - !deepEqual((data as EmoteDataADR287).startAnimation, catalystItemMetadataData.startAnimation) || - (data as EmoteDataADR287).randomizeOutcomes !== catalystItemMetadataData.randomizeOutcomes || - !deepEqual((data as EmoteDataADR287).outcomes, catalystItemMetadataData.outcomes) + !deepEqual(data.startAnimation, catalystItemMetadataData.startAnimation) || + data.randomizeOutcomes !== catalystItemMetadataData.randomizeOutcomes || + !deepEqual(data.outcomes, catalystItemMetadataData.outcomes) } if (hasMetadataChanged) { From a733a617998a7934d4aeac0339d4d3686b8bd45a Mon Sep 17 00:00:00 2001 From: Gabriel Diaz Date: Mon, 3 Nov 2025 22:46:39 -0300 Subject: [PATCH 42/48] feat: Send startAnimation to the createSingleItemModal reducer --- .../CreateSingleItemModal.css | 3 +- .../CreateSingleItemModal.reducer.ts | 24 +++++++++++++--- .../CreateSingleItemModal.tsx | 28 ++++++++----------- .../CreateSingleItemModal.types.ts | 3 +- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css index eb6a3edb9..dd7cf0812 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.css @@ -227,7 +227,8 @@ background-color: var(--secondary-text); } -.CreateSingleItemModal .importer-thumbnail-container .WearablePreview { +.CreateSingleItemModal .importer-thumbnail-container .WearablePreview, +.CreateSingleItemModal .importer-thumbnail-container #thumbnail-picker { display: none; } diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts index 396648336..e23339f55 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.reducer.ts @@ -1,5 +1,14 @@ import { AnimationClip, Object3D } from 'three' -import { EmotePlayMode, Rarity, WearableCategory, Mapping, ContractNetwork, ContractAddress, OutcomeGroup } from '@dcl/schemas' +import { + EmotePlayMode, + Rarity, + WearableCategory, + Mapping, + ContractNetwork, + ContractAddress, + OutcomeGroup, + StartAnimation +} from '@dcl/schemas' import { Item, BodyShapeType, ItemType } from 'modules/item/types' import { Metrics } from 'modules/models/types' import { CreateItemView, State, AcceptedFileProps, CreateSingleItemModalMetadata } from './CreateSingleItemModal.types' @@ -78,6 +87,7 @@ export const CREATE_ITEM_ACTIONS = { SET_IS_REPRESENTATION: 'SET_IS_REPRESENTATION', SET_MAPPINGS: 'SET_MAPPINGS', SET_REQUIRED_PERMISSIONS: 'SET_REQUIRED_PERMISSIONS', + SET_START_ANIMATION: 'SET_START_ANIMATION', SET_OUTCOMES: 'SET_OUTCOMES', SET_EMOTE_DATA: 'SET_EMOTE_DATA', SET_TAGS: 'SET_TAGS', @@ -120,6 +130,7 @@ export type CreateItemAction = payload: Partial>> | undefined } | { type: typeof CREATE_ITEM_ACTIONS.SET_REQUIRED_PERMISSIONS; payload: string[] } + | { type: typeof CREATE_ITEM_ACTIONS.SET_START_ANIMATION; payload: Partial } | { type: typeof CREATE_ITEM_ACTIONS.SET_OUTCOMES; payload: OutcomeGroup[] | ((prevOutcomes: OutcomeGroup[]) => OutcomeGroup[]) } | { type: typeof CREATE_ITEM_ACTIONS.SET_EMOTE_DATA; payload: { animations: AnimationClip[]; armatures: Object3D[] } } | { type: typeof CREATE_ITEM_ACTIONS.SET_TAGS; payload: string[] } @@ -242,6 +253,11 @@ export const createItemActions = { payload: requiredPermissions }), + setStartAnimation: (startAnimation: Partial): CreateItemAction => ({ + type: CREATE_ITEM_ACTIONS.SET_START_ANIMATION, + payload: startAnimation + }), + setOutcomes: (outcomes: OutcomeGroup[] | ((prevOutcomes: OutcomeGroup[]) => OutcomeGroup[])): CreateItemAction => ({ type: CREATE_ITEM_ACTIONS.SET_OUTCOMES, payload: outcomes @@ -339,9 +355,6 @@ export const createItemReducer = (state: State, action: CreateItemAction | null) case CREATE_ITEM_ACTIONS.SET_MODEL_SIZE: return { ...state, modelSize: action.payload } - // case CREATE_ITEM_ACTIONS.SET_PREVIEW_CONTROLLER: - // return { ...state, previewController: action.payload } - case CREATE_ITEM_ACTIONS.SET_ITEM: return { ...state, item: action.payload } @@ -378,6 +391,9 @@ export const createItemReducer = (state: State, action: CreateItemAction | null) case CREATE_ITEM_ACTIONS.SET_REQUIRED_PERMISSIONS: return { ...state, requiredPermissions: action.payload } + case CREATE_ITEM_ACTIONS.SET_START_ANIMATION: + return { ...state, startAnimation: action.payload as StartAnimation } + case CREATE_ITEM_ACTIONS.SET_OUTCOMES: return { ...state, diff --git a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx index 9263b6227..79d887210 100644 --- a/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx +++ b/src/components/Modals/CreateSingleItemModal/CreateSingleItemModal.tsx @@ -8,7 +8,6 @@ import { PreviewProjection, WearableCategory, IPreviewController, - EmoteDataADR287, StartAnimation } from '@dcl/schemas' import { @@ -18,7 +17,7 @@ import { MAX_WEARABLE_FILE_SIZE, MAX_SMART_WEARABLE_FILE_SIZE } from '@dcl/builder-client/dist/files/constants' -import { WearablePreview } from 'decentraland-ui' +import { WearablePreview } from 'decentraland-ui2' import { t } from 'decentraland-dapps/dist/modules/translation/utils' import Modal from 'decentraland-dapps/dist/containers/Modal' import { isErrorWithMessage } from 'decentraland-dapps/dist/lib/error' @@ -162,32 +161,24 @@ export const CreateSingleItemModal: React.FC = props => { representations: [...representations] } as EmoteData - // TODO: ADR 287 - Social Emotes // Use autocompleteSocialEmoteData to generate startAnimation and outcomes from available animations if (emoteData?.animations && emoteData.animations.length > 0) { const animationNames = emoteData.animations.map(clip => clip.name) const autocompletedData = autocompleteSocialEmoteData(animationNames) if (autocompletedData.startAnimation || autocompletedData.outcomes) { - const socialEmoteData: Partial = {} - // Transform startAnimation if available if (autocompletedData.startAnimation) { - socialEmoteData.startAnimation = autocompletedData.startAnimation as StartAnimation + data.startAnimation = autocompletedData.startAnimation as StartAnimation } // Transform outcomes if available if (autocompletedData.outcomes) { - socialEmoteData.outcomes = autocompletedData.outcomes + data.outcomes = autocompletedData.outcomes } // Add randomizeOutcomes flag - socialEmoteData.randomizeOutcomes = false - - data = { - ...data, - ...socialEmoteData - } + data.randomizeOutcomes = false } } } @@ -303,9 +294,9 @@ export const CreateSingleItemModal: React.FC = props => { category: category as EmoteCategory } as EmoteData - // ADR 287 - Social Emotes + // TODO: Autocomplete animations when modifying an emote if (outcomes && outcomes.length > 0) { - ;(data as EmoteDataADR287).outcomes = outcomes + data.outcomes = outcomes } } @@ -700,6 +691,7 @@ export const CreateSingleItemModal: React.FC = props => { contents, category }) + let view = CreateItemView.DETAILS if (isSmart({ type, contents })) { // TODO: await setTimeout(() => {}, ITEM_LOADED_CHECK_DELAY) @@ -719,6 +711,9 @@ export const CreateSingleItemModal: React.FC = props => { // Autocomplete emote data based on animation naming conventions const autocompletedData = autocompleteSocialEmoteData(animationNames) + if (autocompletedData.startAnimation) { + dispatch(createItemActions.setStartAnimation(autocompletedData.startAnimation)) + } if (autocompletedData.outcomes) { dispatch(createItemActions.setOutcomes(autocompletedData.outcomes)) } @@ -778,8 +773,9 @@ export const CreateSingleItemModal: React.FC = props => { return ( Date: Mon, 3 Nov 2025 22:47:19 -0300 Subject: [PATCH 43/48] feat: Pass startAnimation and outcomes to the WearablePreview emote metadata --- .../EditThumbnailStep/EditThumbnailStep.css | 225 ++++-------------- .../EditThumbnailStep/EditThumbnailStep.tsx | 117 ++++----- .../EditThumbnailStep.types.ts | 20 +- .../CreateSingleItemModal/Steps/Steps.tsx | 6 +- .../EditThumbnailModal/EditThumbnailModal.tsx | 9 +- 5 files changed, 104 insertions(+), 273 deletions(-) diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.css b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.css index b9516cebd..4a7a10f09 100644 --- a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.css +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.css @@ -1,192 +1,57 @@ -.EditThumbnailStep .zoom-controls { - display: flex; - flex-direction: column; - position: absolute; - top: 12px; - left: 12px; -} - -.EditThumbnailStep .ui.button.zoom-control { - width: 32px; - height: 32px; - padding: 0; - min-width: unset; - background-color: rgba(0, 0, 0, 0.64) !important; - border-radius: 0; - display: flex; - justify-content: center; - align-items: center; -} - -.EditThumbnailStep .ui.button.zoom-control i.icon { - margin: 0 !important; -} - -.ui.modal .EditThumbnailStep .ui.button.sound-control { - background: transparent; -} - -.EditThumbnailStep .ui.button.zoom-in-control { - width: 32px; - height: 32px; - padding: 0; - min-width: unset; -} - -.EditThumbnailStep .ui.button.play-control { - width: 56px; - height: 44px; - padding: 0; - min-width: unset; - margin-right: 16px; -} - -.EditThumbnailStep .EmoteControls .ui.button.play-control .play.icon { - padding-bottom: 18px; - padding-left: 3px; - margin: 0; -} - -.EditThumbnailStep .EmoteControls .ui.button.play-control .pause.icon { - padding-left: 0; - padding-bottom: 16px; - margin: 0; -} - -.EditThumbnailStep .Preview canvas { - background: rgba(22, 20, 26, 0.48); -} - -.EditThumbnailStep .dcl.sliderfield p { - display: none; -} - -.EditThumbnailStep .play-controls { - display: flex; - margin: 16px 0; -} - -.EditThumbnailStep .rotate-control { - position: absolute; - bottom: 40px; - left: 7px; -} - -.EditThumbnailStep .dcl.sliderfield-wrapper .dcl.sliderfield-track, -.EditThumbnailStep .dcl.sliderfield-wrapper .dcl.sliderfield-mark { - background-color: #736e7d; -} - -.EditThumbnailStep input[type='range'] { - background: none; -} - -.EditThumbnailStep .play-controls input[type='range'] { - width: 100%; -} - -.EditThumbnailStep input[type='range'] { - -webkit-appearance: none; -} - -.EditThumbnailStep input[type='range']:focus { - outline: none; -} - -.EditThumbnailStep .play-controls input[type='range']::-webkit-slider-thumb { - -webkit-appearance: none; - width: 24px; - height: 24px; - border-radius: 10px; - background-color: #736e7d; - overflow: visible; - cursor: pointer; - padding-bottom: 5px; - margin-top: -4px; -} - -.EditThumbnailStep input[type='range']::-webkit-slider-thumb { - -webkit-appearance: none; - width: 32px; - height: 8px; - border-radius: 10px; - background: #736e7d; - box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.16), inset 0px 1px 0px rgba(255, 255, 255, 0.16); - border-radius: 4px; - overflow: visible; - cursor: pointer; - padding-bottom: 5px; - margin-top: -3px; -} - -.EditThumbnailStep input[type='range']::-moz-range-thumb { - width: 24px; - height: 24px; - border-radius: 20px; - background-color: #736e7d; - overflow: visible; - cursor: pointer; -} - -.EditThumbnailStep input[type='range']::-ms-thumb { - width: 24px; - height: 24px; - border-radius: 20px; - background-color: #736e7d; - overflow: visible; - cursor: pointer; -} - -.EditThumbnailStep .play-controls input[type='range']::-webkit-slider-runnable-track { - width: 300px; - height: 15px; - background: rgba(115, 110, 125, 0.32); - border: none; - border-radius: 10px; -} - -.EditThumbnailStep input[type='range']::-webkit-slider-runnable-track { - width: 300px; - height: 2px; - background: #000000; - border: none; - border-radius: 10px; -} - -.EditThumbnailStep input[type='range']::-moz-range-track { - width: 100%; - height: 15px; - border-radius: 10px; - cursor: pointer; - background: rgba(115, 110, 125, 0.32); -} - -.EditThumbnailStep .WearablePreview { +.EditThumbnailStep .WearablePreview, +.EditThumbnailStep #preview { background: #43404a; height: 364px; border-radius: 8px; } -.EditThumbnailStep .y-slider-container { - position: absolute; - transform: rotate(-90deg); - right: -105px; - top: 181px; - width: 280px; - display: flex; - flex-direction: row-reverse; -} - -.EditThumbnailStep .y-slider { - width: 229px; +.EditThumbnailStep .Preview canvas { + background: rgba(22, 20, 26, 0.48); } -.EditThumbnailStep .y-slider-container i.icon { - margin-top: -6px; - margin-left: 12px; +.EditThumbnailStep .zoom-controls { + & .MuiButtonBase-root.MuiButton-root { + & .MuiSvgIcon-root { + fill: white; + } + & .MuiTouchRipple-root { + color: white; + } + } } -.EditThumbnailStep .EmoteControls { +.EditThumbnailStep .emote-controls { padding: 0; bottom: 0; + & .MuiButtonBase-root.MuiButton-root { + background-color: transparent; + margin: 0; + & .MuiSvgIcon-root { + fill: white; + } + & .MuiTouchRipple-root { + color: white; + } + } +} + +.EditThumbnailStep .translation-controls { + align-items: flex-start; +} + +.EditThumbnailStep .animation-controls { + & .MuiButtonBase-root { + background-color: #726e7c !important; + } +} + +.EditThumbnailStep .animation-controls__popper { + & .MuiPaper-root { + background-color: #726e7c; + & .MuiList-root { + & .MuiButtonBase-root.MuiMenuItem-root.Mui-selected { + background-color: #24212933; + } + } + } } diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx index 34cf319ce..cb0491f8d 100644 --- a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.tsx @@ -1,27 +1,18 @@ import * as React from 'react' -import { ModalNavigation, Row, Button, Icon, Loader, EmoteControls, WearablePreview } from 'decentraland-ui' +import { ModalNavigation, Row, Button, Loader } from 'decentraland-ui' +import { AnimationControls, EmoteControls, TranslationControls, WearablePreview, ZoomControls } from 'decentraland-ui2' import { t } from 'decentraland-dapps/dist/modules/translation/utils' import Modal from 'decentraland-dapps/dist/containers/Modal' -import { ControlOptionAction, Props, State } from './EditThumbnailStep.types' +import { Props, State } from './EditThumbnailStep.types' import './EditThumbnailStep.css' - -const DEFAULT_ZOOM = 2 -const ZOOM_DELTA = 0.1 +import { SocialEmoteAnimation } from 'decentraland-ui2/dist/components/WearablePreview/WearablePreview.types' export default class EditThumbnailStep extends React.PureComponent { - previewRef = React.createRef() state: State = { - zoom: DEFAULT_ZOOM, blob: this.props.blob, previewController: this.props.wearablePreviewController, - hasBeenUpdated: false - } - - componentWillUnmount() { - const { playingIntervalId } = this.state - if (playingIntervalId) { - clearInterval(playingIntervalId) - } + hasBeenUpdated: false, + socialEmote: undefined } handleFileLoad = async () => { @@ -41,38 +32,25 @@ export default class EditThumbnailStep extends React.PureComponent await previewController?.scene.getScreenshot(1024, 1024).then(screenshot => onSave(screenshot)) } - handleControlActionChange = async (action: ControlOptionAction, value?: number) => { - const { previewController } = this.state - const iframeContentWindow = this.previewRef.current?.iframe?.contentWindow - if (iframeContentWindow) { - await previewController?.emote.pause() - switch (action) { - case ControlOptionAction.PAN_CAMERA_Y: { - this.setState({ offsetY: value }) - await previewController?.scene.panCamera({ y: value! * -1 }) - break - } - case ControlOptionAction.ZOOM_IN: { - await previewController?.scene.changeZoom(ZOOM_DELTA) - break - } - case ControlOptionAction.ZOOM_OUT: { - await previewController?.scene.changeZoom(-ZOOM_DELTA) - break - } - default: - break - } - } - } - - handleZoomOut = () => { - this.setState(prevState => ({ zoom: (prevState.zoom || DEFAULT_ZOOM) - 1 })) + handleSocialEmoteSelect = (animation: SocialEmoteAnimation) => { + this.setState({ socialEmote: animation }) } render() { const { onClose, onBack, title, isLoading, base64s } = this.props - const { blob, hasBeenUpdated } = this.state + const { blob, hasBeenUpdated, socialEmote, previewController } = this.state + + let emoteData = undefined + if (base64s && base64s.length > 0) { + emoteData = JSON.parse(atob(base64s[0]))?.emoteDataADR74 + } else if (blob?.emoteDataADR74) { + emoteData = blob?.emoteDataADR74 + } + + let _socialEmote = undefined + if (!socialEmote && emoteData?.startAnimation) { + _socialEmote = { title: 'Start Animation', ...emoteData.startAnimation } + } return ( <> @@ -80,9 +58,9 @@ export default class EditThumbnailStep extends React.PureComponent
skin="000000" zoom={100} wheelZoom={2} + socialEmote={socialEmote || _socialEmote} onLoad={this.handleFileLoad} onUpdate={() => this.setState({ hasBeenUpdated: true })} /> - {hasBeenUpdated ? ( + {hasBeenUpdated && previewController ? ( <> -
- - -
-
- - this.handleControlActionChange(ControlOptionAction.PAN_CAMERA_Y, Number(e.target.value))} - > -
+ + + -
- -
+ ) : ( @@ -137,6 +97,15 @@ export default class EditThumbnailStep extends React.PureComponent + {hasBeenUpdated && previewController ? ( + + ) : null} diff --git a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.types.ts b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.types.ts index 1157ba2cc..47a944cdb 100644 --- a/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.types.ts +++ b/src/components/Modals/CreateSingleItemModal/EditThumbnailStep/EditThumbnailStep.types.ts @@ -1,19 +1,7 @@ +import React from 'react' import { EmoteWithBlobs, IPreviewController } from '@dcl/schemas' +import { SocialEmoteAnimation } from 'decentraland-ui2/dist/components/WearablePreview/WearablePreview.types' import { Item } from 'modules/item/types' -import React from 'react' - -export enum CreateItemView { - IMPORT = 'import', - DETAILS = 'details', - THUMBNAIL = 'thumbnail' -} - -export enum ControlOptionAction { - ZOOM_IN, - ZOOM_OUT, - PAN_CAMERA_Y, - CHANGE_CAMERA_ALPHA -} export type Props = { title: string @@ -29,11 +17,9 @@ export type Props = { export type State = { hasBeenUpdated: boolean - playingIntervalId?: ReturnType previewController?: IPreviewController blob?: EmoteWithBlobs - zoom: number - offsetY?: number + socialEmote?: SocialEmoteAnimation } export type CreateSingleItemModalMetadata = { diff --git a/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx index c24f8d607..75631dc34 100644 --- a/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx +++ b/src/components/Modals/CreateSingleItemModal/Steps/Steps.tsx @@ -76,7 +76,11 @@ export const Steps: React.FC = ({ modalContainer }) => { return ( Date: Mon, 3 Nov 2025 22:49:37 -0300 Subject: [PATCH 44/48] fix: Types and use emoteDataADR74 --- .../CenterPanel/CenterPanel.tsx | 2 +- .../ItemEditorPage/RightPanel/RightPanel.tsx | 77 +++++++++---------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/components/ItemEditorPage/CenterPanel/CenterPanel.tsx b/src/components/ItemEditorPage/CenterPanel/CenterPanel.tsx index 9f50a54b6..c988ddc37 100644 --- a/src/components/ItemEditorPage/CenterPanel/CenterPanel.tsx +++ b/src/components/ItemEditorPage/CenterPanel/CenterPanel.tsx @@ -258,7 +258,7 @@ export default class CenterPanel extends React.PureComponent { return (
{ this.setState({ data, isDirty: this.isDirty({ data }) }) } - handleEmoteRequestStateChange = (prop: ArmatureId.Armature | ArmatureId.Armature_Prop, field: string, value: string) => { - const data = this.state.data as any + handleStartAnimationArmatureAnimationChange = (prop: ArmatureId.Armature | ArmatureId.Armature_Prop, value: string) => { + const data = this.state.data as EmoteData const startAnimation = { ...(data.startAnimation || {}) } // For optional fields (Armature_Prop), remove the entire prop if value is empty if (value === '' && prop === ArmatureId.Armature_Prop) { delete startAnimation[prop] } else { - if (!startAnimation[prop]) { - startAnimation[prop] = { armature: '', animation: '', loop: true } - } - - startAnimation[prop] = { - ...startAnimation[prop], - [field]: value - } + startAnimation[prop] = { animation: value } } this.setState({ - data: { ...data, startAnimation }, - isDirty: this.isDirty({ data: { ...data, startAnimation } }) + data: { ...data, startAnimation: startAnimation as StartAnimation }, + isDirty: this.isDirty({ data: { ...data, startAnimation: startAnimation as StartAnimation } }) }) } handleStartAnimationAudioClipChange = (audio: string) => { - const data = this.state.data as EmoteDataADR287 + const data = this.state.data as EmoteData const startAnimation = { ...(data.startAnimation || {}) } startAnimation.audio = audio || undefined - this.setState({ data: { ...data, startAnimation }, isDirty: this.isDirty({ data: { ...data, startAnimation } }) }) + this.setState({ + data: { ...data, startAnimation: startAnimation as StartAnimation }, + isDirty: this.isDirty({ data: { ...data, startAnimation: startAnimation as StartAnimation } }) + }) } handleStartAnimationPlayModeChange = (loop: boolean) => { - const data = this.state.data as EmoteDataADR287 + const data = this.state.data as EmoteData const startAnimation = { ...(data.startAnimation || {}) } startAnimation.loop = loop - this.setState({ data: { ...data, startAnimation }, isDirty: this.isDirty({ data: { ...data, startAnimation } }) }) + this.setState({ + data: { ...data, startAnimation: startAnimation as StartAnimation }, + isDirty: this.isDirty({ data: { ...data, startAnimation: startAnimation as StartAnimation } }) + }) } handleRandomizeOutcomesChange = (randomize: boolean) => { @@ -284,8 +283,8 @@ export default class RightPanel extends React.PureComponent { } handleOutcomeClipChange = (outcomeIndex: number, armatureId: ArmatureId, field: string, value: string) => { - const data = this.state.data as unknown as EmoteDataADR287 - const outcomes = [...data.outcomes] + const data = this.state.data as EmoteData + const outcomes = [...(data.outcomes || [])] const clips = { ...outcomes[outcomeIndex].clips } if (value === '') { @@ -314,15 +313,15 @@ export default class RightPanel extends React.PureComponent { } handleOutcomeAudioClipChange = (outcomeIndex: number, audio: string) => { - const data = this.state.data as EmoteDataADR287 - const outcomes = [...data.outcomes] + const data = this.state.data as EmoteData + const outcomes = [...(data.outcomes || [])] outcomes[outcomeIndex].audio = audio || undefined this.setState({ data: { ...data, outcomes }, isDirty: this.isDirty({ data: { ...data, outcomes } }) }) } handleOutcomePlayModeChange = (outcomeIndex: number, loop: boolean) => { - const data = this.state.data as EmoteDataADR287 - const outcomes = [...data.outcomes] + const data = this.state.data as EmoteData + const outcomes = [...(data.outcomes || [])] outcomes[outcomeIndex].loop = loop this.setState({ data: { ...data, outcomes }, @@ -331,8 +330,8 @@ export default class RightPanel extends React.PureComponent { } handleAddOutcome = () => { - const data = this.state.data as EmoteDataADR287 - if (!data.outcomes) { + const data = this.state.data as EmoteData + if (!data || !data.outcomes) { data.outcomes = [] } const newOutcome = { @@ -857,10 +856,10 @@ export default class RightPanel extends React.PureComponent { itemId={item.id} label={`${t('item_editor.right_panel.social_emote.avatar')} 1`} - value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature].animation} + value={(data as unknown as EmoteData)?.startAnimation?.[ArmatureId.Armature]?.animation} options={this.getAnimationOptions(animationData)} disabled={isLoading} - onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature, 'animation', value)} + onChange={value => this.handleStartAnimationArmatureAnimationChange(ArmatureId.Armature, value)} /> @@ -868,10 +867,10 @@ export default class RightPanel extends React.PureComponent { label={`${t('item_editor.right_panel.social_emote.props')} (${t( 'item_editor.right_panel.social_emote.optional' )})`} - value={(data as EmoteDataADR287).startAnimation[ArmatureId.Armature_Prop]?.animation} + value={(data as unknown as EmoteData)?.startAnimation?.[ArmatureId.Armature_Prop]?.animation} options={this.getAnimationOptions(animationData, true)} disabled={isLoading} - onChange={value => this.handleEmoteRequestStateChange(ArmatureId.Armature_Prop, 'animation', value)} + onChange={value => this.handleStartAnimationArmatureAnimationChange(ArmatureId.Armature_Prop, value)} /> {Object.values(item.contents).length > 0 && itemHasAudio(item) ? ( @@ -880,7 +879,7 @@ export default class RightPanel extends React.PureComponent { label={`${t('item_editor.right_panel.social_emote.audio')} (${t( 'item_editor.right_panel.social_emote.optional' )})`} - value={(data as EmoteDataADR287).startAnimation.audio} + value={(data as unknown as EmoteData)?.startAnimation?.audio} options={this.getAudioOptions(item.contents)} onChange={value => this.handleStartAnimationAudioClipChange(value)} /> @@ -888,18 +887,18 @@ export default class RightPanel extends React.PureComponent { itemId={item.id} label={t('create_single_item_modal.play_mode_label')} - value={(data as EmoteDataADR287).startAnimation.loop ? EmotePlayMode.LOOP : EmotePlayMode.SIMPLE} + value={(data as unknown as EmoteData)?.startAnimation?.loop ? EmotePlayMode.LOOP : EmotePlayMode.SIMPLE} options={this.asPlayModeSelect(playModes)} onChange={value => this.handleStartAnimationPlayModeChange(value === EmotePlayMode.LOOP)} disabled // For now play mode for start animation is always loop /> - {(data as EmoteDataADR287).outcomes && (data as EmoteDataADR287).outcomes.length > 1 ? ( + {(data as unknown as EmoteData)?.outcomes && (data as unknown as EmoteData).outcomes!.length > 1 ? ( itemId={item.id} label={t('item_editor.right_panel.social_emote.randomize_outcomes')} - value={(data as EmoteDataADR287).randomizeOutcomes ? 'true' : 'false'} + value={(data as unknown as EmoteData)?.randomizeOutcomes ? 'true' : 'false'} options={[ { value: 'true', text: 'True' }, { value: 'false', text: 'False' } @@ -909,9 +908,9 @@ export default class RightPanel extends React.PureComponent { /> ) : null} - {(data as EmoteDataADR287).outcomes && - (data as EmoteDataADR287).outcomes.length > 0 && - (data as EmoteDataADR287).outcomes.map((outcome, outcomeIndex) => ( + {(data as unknown as EmoteData)?.outcomes && + (data as unknown as EmoteData).outcomes!.length > 0 && + (data as unknown as EmoteData).outcomes!.map((outcome, outcomeIndex) => ( { maxLength={OUTCOME_TITLE_MAX_LENGTH} onChange={(value: string) => this.handleEditOutcomeTitle(outcomeIndex, value)} /> - {(data as EmoteDataADR287).outcomes.length > 1 ? ( + {(data as unknown as EmoteData).outcomes!.length > 1 ? (