diff --git a/.gitignore b/.gitignore index 28f1ba75..dd8ace40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -.DS_Store \ No newline at end of file +.DS_Store +.parcel-cache diff --git a/.prettierignore b/.prettierignore index 1a8daea8..524a0696 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ dist storybook-static -.cache \ No newline at end of file +.cache +.parcel-cache \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..a2a24e02 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "printWidth": 100, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "semi": false, + "overrides": [ + { + "files": ["*.md", "*.mdx"], + "options": { + "printWidth": 80, + "proseWrap": "always" + } + } + ] +} diff --git a/package.json b/package.json index 5e47daae..322e385e 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,13 @@ "prepare": "husky install" }, "devDependencies": { + "@parcel/packager-ts": "^2.2.0", + "@parcel/transformer-typescript-types": "^2.2.0", "husky": ">=6", "lint-staged": ">=10", "prettier": "^2.5.1", - "prettier-plugin-organize-imports": "^2.3.4" + "prettier-plugin-organize-imports": "^2.3.4", + "typescript": ">=3.0.0" }, "lint-staged": { "*.{js,css,md,mdx,jsx,tsx,ts,json}": "prettier --write" diff --git a/packages/gatsby-mdx-codesandbox/.gitignore b/packages/gatsby-mdx-codesandbox/.gitignore new file mode 100644 index 00000000..76add878 --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/packages/gatsby-mdx-codesandbox/README.md b/packages/gatsby-mdx-codesandbox/README.md new file mode 100644 index 00000000..52173009 --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/README.md @@ -0,0 +1,5 @@ +# gatsby-mdx-codesandbox + +`[code:HelloWorld.tsx]` will prettify and inline the code for the file named `HelloWorld.tsx` in the same directory as your `mdx` file. + +`[demo:HelloWorld.tsx]` will show a Codesandbox iframe using the template you have specified. When running on localhost, it will also show run the component locally, presumably using local packages. diff --git a/packages/gatsby-mdx-codesandbox/package.json b/packages/gatsby-mdx-codesandbox/package.json new file mode 100644 index 00000000..f8c1ed62 --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/package.json @@ -0,0 +1,36 @@ +{ + "name": "gatsby-mdx-codesandbox", + "version": "0.0.1", + "source": "./src/index.ts", + "main": "dist/index.js", + "engines": { + "node": ">12" + }, + "types": "dist/index.d.ts", + "license": "MIT", + "scripts": { + "build": "parcel build", + "watch": "chokidar 'src/*' -c 'yarn build'" + }, + "dependencies": { + "@s-libs/micro-dash": "12", + "@types/prettier": "^2.4.3", + "codesandbox": "^2.2.3", + "prettier": "^2.5.1", + "remark-codesandbox": "^0.10.0", + "typescript": "^4.5.4", + "unist-util-visit": "2" + }, + "peerDependencies": { + "gatsby": "^4.0", + "react-codesandbox-viewer": "*" + }, + "devDependencies": { + "@babel/core": "^7.16.7", + "@types/prettier": "^2.4.3", + "babel-loader": "^8.2.3", + "parcel": "^2.2.0", + "type-fest": "^2.9.0", + "typescript": "^4.5.4" + } +} diff --git a/packages/static/codesandbox-template/.codesandbox/workspace.json b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/.codesandbox/workspace.json similarity index 100% rename from packages/static/codesandbox-template/.codesandbox/workspace.json rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/.codesandbox/workspace.json diff --git a/packages/static/codesandbox-template/.prettierrc b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/.prettierrc similarity index 100% rename from packages/static/codesandbox-template/.prettierrc rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/.prettierrc diff --git a/packages/static/codesandbox-template/package.json b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/package.json similarity index 94% rename from packages/static/codesandbox-template/package.json rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/package.json index 8f4ae712..74b2d1f4 100644 --- a/packages/static/codesandbox-template/package.json +++ b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/package.json @@ -1,5 +1,5 @@ { - "name": "react-babylonjs-codesandbox", + "name": "@react-babylonjs/codesandbox-demo", "version": "1.0.0", "description": "", "keywords": [], diff --git a/packages/static/codesandbox-template/src/App.tsx b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/App.tsx similarity index 100% rename from packages/static/codesandbox-template/src/App.tsx rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/App.tsx diff --git a/packages/static/codesandbox-template/src/index.tsx b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/index.tsx similarity index 100% rename from packages/static/codesandbox-template/src/index.tsx rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/index.tsx diff --git a/packages/static/codesandbox-template/src/styles.css b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/styles.css similarity index 100% rename from packages/static/codesandbox-template/src/styles.css rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/src/styles.css diff --git a/packages/static/codesandbox-template/tsconfig.json b/packages/gatsby-mdx-codesandbox/src/codesandbox-template/tsconfig.json similarity index 100% rename from packages/static/codesandbox-template/tsconfig.json rename to packages/gatsby-mdx-codesandbox/src/codesandbox-template/tsconfig.json diff --git a/packages/gatsby-mdx-codesandbox/src/index.ts b/packages/gatsby-mdx-codesandbox/src/index.ts new file mode 100644 index 00000000..399fe34f --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/src/index.ts @@ -0,0 +1,370 @@ +import { forEach } from '@s-libs/micro-dash' +import { existsSync, readFileSync } from 'fs' +import { basename, dirname, resolve } from 'path' +import prettier, { Options as PrettierOptions } from 'prettier' +import { env } from 'process' +import { CSSProperties } from 'react' +//@ts-ignore Can't figure out ambient module declaration for a subpackage +import codesandbox from 'remark-codesandbox/gatsby' +import { PartialDeep, SetOptional } from 'type-fest' +import * as ts from 'typescript' +import visit from 'unist-util-visit' +import type { Code, Content, Jsx, LinkReference, Parent, Tsx } from './mdast' + +type ShortcodeNames = 'demo' | 'code' + +const IS_DEVELOPMENT_MODE = env['NODE_ENV'] === 'development' + +type MaybeParent = SetOptional + +type CustomTemplate = { + extends: string + entry: string +} + +export type PluginOptions = { + development: { + style: CSSProperties + } + prettier: PrettierOptions + codesandbox: { + mode: 'iframe' | 'button' | 'meta' + defaultQuery: CodeSandBoxQuery + customTemplates: { + [_: string]: CustomTemplate + default: CustomTemplate + } + } +} + +type CodeSandBoxQuery = { + template: string + fontsize: string + hidenavigation: '0' | '1' + theme: 'dark' | 'light' + entry: string + module: string + style: string +} + +type MarkdownAST = Parent + +type GatsbyMdxNodeId = string + +type GatsbyMdxNode = { + id: GatsbyMdxNodeId + children: GatsbyMdxNode[] + parent: GatsbyMdxNodeId + internal: { + content: any + type: `Mdx` | 'File' + } + frontmatter: { + title: string + [key: string]: string + } + excerpt: string + exports: any + rawBody: string +} + +type GatsbyMdxFileNode = GatsbyMdxNode & { + internal: GatsbyMdxNode['internal'] & { + type: 'File' + } + fileAbsolutePath: string +} + +type GatsbyMdxPluginMeta = { + markdownAST: MarkdownAST + markdownNode: GatsbyMdxFileNode +} + +type GatsbyMdxPlugin = ( + meta: GatsbyMdxPluginMeta, + pluginOptions: PartialDeep +) => Promise + +const guid = (() => { + let id = +new Date() + return () => `g${++id}` +})() + +const plugin: GatsbyMdxPlugin = async (meta, pluginOptions) => { + const _options: PluginOptions = { + development: { + style: (pluginOptions?.development?.style as CSSProperties | undefined) || { + marginTop: '20px', + padding: '16px', + border: '15px solid rgb(245, 247, 249)', + backgroundColor: 'black', + color: 'white', + marginBottom: '20px', + }, + }, + prettier: { + jsxBracketSameLine: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'es5', + semi: false, + printWidth: 80, + proseWrap: 'always', + parser: 'typescript', + }, + codesandbox: { + mode: pluginOptions?.codesandbox?.mode || 'meta', + defaultQuery: { + template: 'default', + entry: 'src/App.tsx', + fontsize: '14px', + hidenavigation: '0', + theme: 'dark', + module: '', + style: '', + }, + customTemplates: { + //@ts-ignore + default: (pluginOptions.codesandbox?.customTemplates?.default as + | CustomTemplate + | undefined) || { + extends: `file:${__dirname}/../src/codesandbox-template`, + entry: 'src/App.tsx', + }, + ...pluginOptions.codesandbox?.customTemplates, + }, + }, + } + // console.log('options', _options) + const { markdownAST, markdownNode } = meta + + // Import the Demo component + { + const node: Content = { + type: 'import', + value: `import {Demo} from 'react-codesandbox-viewer'`, + } + markdownAST.children.unshift(node) + console.log(`Adding: ${node.value}`) + } + + const seen: { [_: string]: boolean } = {} + + const isCodeOrDemo = (type: string): type is ShortcodeNames => { + const shortcodeNames: ShortcodeNames[] = ['code', 'demo'] + return shortcodeNames.includes(type as ShortcodeNames) + } + + const isLinkReference = (node: Content): node is LinkReference => { + return node.type === 'linkReference' + } + + const isParent = (node: MaybeParent): node is Parent => { + return !!node.children + } + + const isSoloChild = (node: Parent) => { + return node.children.length === 1 + } + + const ALLOWED_EXT = ['tsx'] + const isAllowedExt = (ext: string): ext is Tsx['type'] => ALLOWED_EXT.includes(ext) + + const promises: Promise[] = [] + visit(markdownAST, 'paragraph', (paragraphNode: MaybeParent, idx) => { + promises.push( + (async () => { + // Only process paragraph nodes + if (!isParent(paragraphNode)) return + + // Only allow the shortcode by itself in a paragraph + if (!isSoloChild(paragraphNode)) return + + // The [shortcode] syntax shows up as a linkReference node - filter out all others + const [linkRefNode] = paragraphNode.children + if (!isLinkReference(linkRefNode)) return + + // The 'label' is the shortcode. Filter out any empty links + const { label } = linkRefNode + if (!label) return + + // Shortcode format: (demo|code):fname.ext[?params...] + const [shortCodeType, fnameWithQuery] = label.split(':') + const [fname, querystring] = fnameWithQuery.split('?') + const [moduleName, ext] = fname.split('.') + + // Filter out any shortcode that is not ours + if (!isCodeOrDemo(shortCodeType)) return + + // Error on any file type not currently supported + if (!isAllowedExt(ext)) { + throw new Error(`${fname} is not supported. Only jsx and tsx are supported.`) + } + + // Copy default values into query + const query = new URLSearchParams() + forEach(_options.codesandbox.defaultQuery, (v, k) => { + if (!!v) query.set(k, v) + }) + + // Calculate the template name + const parsed = new URLSearchParams(querystring) + const templateName = parsed.get('template') || query.get('template') + parsed.delete('template') + query.delete('template') + console.log(`Template name is ${templateName}`) + + // Overwrite defaults with tempalte defaults if available + const { customTemplates } = _options.codesandbox + if (templateName && customTemplates[templateName]) { + forEach(customTemplates[templateName], (v, k) => { + if (!!v) query.set(k, v) + }) + } + + // Overwrite default value union with values specified on querystring + parsed.forEach((v, k) => { + if (!!v) query.set(k, v) + }) + + // Compute the new querystring + const computedQuerystring = decodeURIComponent(query.toString()) + console.log(`full query: ${templateName}?${computedQuerystring}`) + + // Calculate the full path to the code file name and error out if it doesn't exist + const { fileAbsolutePath } = markdownNode + const absoluteDir = dirname(fileAbsolutePath) + const codeFileAbsolutePath = resolve(absoluteDir, fname) + if (!existsSync(codeFileAbsolutePath)) { + throw new Error(`${fname} was not found at ${codeFileAbsolutePath}.`) + } + console.log(codeFileAbsolutePath) + + // Read the source file + const source = readFileSync(codeFileAbsolutePath, { encoding: 'utf-8' }) + + // Prettify it so it displays nicely in the site + const lines = [ + `// ${basename(codeFileAbsolutePath)}`, + '', + ...(IS_DEVELOPMENT_MODE + ? [ + `/* `, + ` ********* WARNING ********`, + ` * THIS CODE WAS LAUNCHED FROM LOCALHOST.`, + ` * LOCAL PACKAGES MAY NOT MATCH THE DEPENDENCIES`, + ` * USED IN THIS SANDBOX.`, + ` * `, + ` * TEST SANDBOX FOR BACKWARD COMPATIBLITY IF DESIRED.`, + ` ********* WARNING ********`, + ` */`, + '', + ] + : []), + source, + ] + const unformattedTsx = lines.join('\n') + const formattedSourceTsx = prettier.format(unformattedTsx, _options.prettier) + + // Transpile to JS + const formattedSourceJsx = prettier.format( + ts.transpileModule(unformattedTsx, { + compilerOptions: { + strict: false, + esModuleInterop: true, + jsx: ts.JsxEmit.Preserve, + module: ts.ModuleKind.ESNext, + }, + }).outputText, + _options.prettier + ) + + // Generate the sandbox URL link + const codesandboxUrl = await (async () => { + const node: Code = { + type: 'code', + lang: 'tsx', + meta: `codesandbox=${templateName}?${computedQuerystring}`, + value: source, + } + await codesandbox({ ...meta, markdownAST: node }, _options.codesandbox) + + // console.log(JSON.stringify(node, null, 2)) + const url = (node.data?.hProperties as { dataCodesandboxUrl?: string }) + ?.dataCodesandboxUrl + if (!url) { + throw new Error(`Failed to create sandbox URL from ${node.meta}`) + } + // console.log(`converted node to sandbox url ${url}`) + return url + })() + + switch (shortCodeType) { + // The 'code' case is where we do normal inline code + case 'code': + { + // Typescript kung fu to convert to a Code node + ;((node: Code) => { + node.type = 'code' + node.lang = 'tsx' + // node.meta = `codesandbox=${templateName}?${computedQuerystring}` + node.value = formattedSourceTsx + console.log(`converted node to code`) + // console.log(JSON.stringify(node, null, 2)) + })(linkRefNode as unknown as Code) + } + break + + // The 'demo' case is a codesandbox and, if in dev/localhost mode, a working demo running aginst local code + case 'demo': + { + // Wire up demo harness + const importSymbol = `Component_${moduleName}` + + // Splice in a run container before the code listing, warn if in dev mode + const demoComponent = [ + ``, + ].join('\n') + console.log(demoComponent) + + // Typescript kung fu to convert to a Code node + ;((node: Jsx) => { + node.type = 'jsx' + node.value = demoComponent + console.log(`converted node to runtime container`) + // console.log(JSON.stringify(node, null, 2)) + })(linkRefNode as unknown as Jsx) + + // Insert an import if this component hasn't been seen yet + if (!seen[moduleName]) { + const node: Content = { + type: 'import', + value: `import ${importSymbol} from './${moduleName}'`, + } + markdownAST.children.unshift(node) + console.log(`Adding: ${node.value}`) + seen[moduleName] = true + } + } + break + } + })() + ) + }) + await Promise.all(promises) + + // console.log('calling codesandbox', _options.codesandbox) + + await codesandbox(meta, _options.codesandbox) + // console.log(JSON.stringify(markdownAST, null, 2)) + return markdownAST +} + +module.exports = plugin diff --git a/packages/gatsby-mdx-codesandbox/src/mdast.d.ts b/packages/gatsby-mdx-codesandbox/src/mdast.d.ts new file mode 100644 index 00000000..d3969ec8 --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/src/mdast.d.ts @@ -0,0 +1,371 @@ +// Type definitions for Mdast 3.0 +// Project: https://github.com/syntax-tree/mdast, https://github.com/wooorm/mdast +// Definitions by: Christian Murphy +// Jun Lu +// Remco Haszing +// Titus Wormer +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.0 + +import { Literal as UnistLiteral, Node, Parent as UnistParent } from "unist"; + +export type AlignType = "left" | "right" | "center" | null; + +export type ReferenceType = "shortcut" | "collapsed" | "full"; + +/** + * This map registers all node types that may be used where markdown block content is accepted. + * + * These types are accepted inside block quotes, list items, footnotes, and roots. + * + * This interface can be augmented to register custom node types. + * + * @example + * declare module 'mdast' { + * interface BlockContentMap { + * // Allow using math nodes defined by `remark-math`. + * math: Math; + * } + * } + */ +export interface BlockContentMap { + tsx: Tsx; + jsx: Jsx; + import: Import; + paragraph: Paragraph; + heading: Heading; + thematicbreak: ThematicBreak; + blockquote: Blockquote; + list: List; + table: Table; + html: HTML; + code: Code; +} + +/** + * This map registers all frontmatter node types. + * + * This interface can be augmented to register custom node types. + * + * @example + * declare module 'mdast' { + * interface FrontmatterContentMap { + * // Allow using toml nodes defined by `remark-frontmatter`. + * toml: TOML; + * } + * } + */ +export interface FrontmatterContentMap { + yaml: YAML; +} + +/** + * This map registers all node definition types. + * + * This interface can be augmented to register custom node types. + * + * @example + * declare module 'mdast' { + * interface DefinitionContentMap { + * custom: Custom; + * } + * } + */ +export interface DefinitionContentMap { + definition: Definition; + footnoteDefinition: FootnoteDefinition; +} + +/** + * This map registers all node types that are acceptable in a static phrasing context. + * + * This interface can be augmented to register custom node types in a phrasing context, including links and link + * references. + * + * @example + * declare module 'mdast' { + * interface StaticPhrasingContentMap { + * mdxJsxTextElement: MDXJSXTextElement; + * } + * } + */ +export interface StaticPhrasingContentMap { + text: Text; + emphasis: Emphasis; + strong: Strong; + delete: Delete; + html: HTML; + inlinecode: InlineCode; + break: Break; + image: Image; + imagereference: ImageReference; + footnote: Footnote; + footnotereference: FootnoteReference; +} + +/** + * This map registers all node types that are acceptable in a (interactive) phrasing context (so not in links). + * + * This interface can be augmented to register custom node types in a phrasing context, excluding links and link + * references. + * + * @example + * declare module 'mdast' { + * interface PhrasingContentMap { + * custom: Custom; + * } + * } + */ +export interface PhrasingContentMap extends StaticPhrasingContentMap { + link: Link; + linkReference: LinkReference; +} + +/** + * This map registers all node types that are acceptable inside lists. + * + * This interface can be augmented to register custom node types that are acceptable inside lists. + * + * @example + * declare module 'mdast' { + * interface ListContentMap { + * custom: Custom; + * } + * } + */ +export interface ListContentMap { + listItem: ListItem; +} + +/** + * This map registers all node types that are acceptable inside tables (not table cells). + * + * This interface can be augmented to register custom node types that are acceptable inside tables. + * + * @example + * declare module 'mdast' { + * interface TableContentMap { + * custom: Custom; + * } + * } + */ +export interface TableContentMap { + tableRow: TableRow; +} + +/** + * This map registers all node types that are acceptable inside tables rows (not table cells). + * + * This interface can be augmented to register custom node types that are acceptable inside table rows. + * + * @example + * declare module 'mdast' { + * interface RowContentMap { + * custom: Custom; + * } + * } + */ +export interface RowContentMap { + tableCell: TableCell; +} + +export type Content = + | TopLevelContent + | ListContent + | TableContent + | RowContent + | PhrasingContent; + +export type TopLevelContent = + | BlockContent + | FrontmatterContent + | DefinitionContent; + +export type BlockContent = BlockContentMap[keyof BlockContentMap]; + +export type FrontmatterContent = + FrontmatterContentMap[keyof FrontmatterContentMap]; + +export type DefinitionContent = + DefinitionContentMap[keyof DefinitionContentMap]; + +export type ListContent = ListContentMap[keyof ListContentMap]; + +export type TableContent = TableContentMap[keyof TableContentMap]; + +export type RowContent = RowContentMap[keyof RowContentMap]; + +export type PhrasingContent = PhrasingContentMap[keyof PhrasingContentMap]; + +export type StaticPhrasingContent = + StaticPhrasingContentMap[keyof StaticPhrasingContentMap]; + +export interface Parent extends UnistParent { + children: Content[]; +} + +export interface Literal extends UnistLiteral { + value: string; +} + +export interface Root extends Parent { + type: "root"; +} + +export interface Tsx extends Literal { + type: "tsx"; +} +export interface Jsx extends Literal { + type: "jsx"; +} + +export interface Import extends Literal { + type: "import"; +} + +export interface Paragraph extends Parent { + type: "paragraph"; + children: PhrasingContent[]; +} + +export interface Heading extends Parent { + type: "heading"; + depth: 1 | 2 | 3 | 4 | 5 | 6; + children: PhrasingContent[]; +} + +export interface ThematicBreak extends Node { + type: "thematicBreak"; +} + +export interface Blockquote extends Parent { + type: "blockquote"; + children: Array; +} + +export interface List extends Parent { + type: "list"; + ordered?: boolean | null | undefined; + start?: number | null | undefined; + spread?: boolean | null | undefined; + children: ListContent[]; +} + +export interface ListItem extends Parent { + type: "listItem"; + checked?: boolean | null | undefined; + spread?: boolean | null | undefined; + children: Array; +} + +export interface Table extends Parent { + type: "table"; + align?: AlignType[] | null | undefined; + children: TableContent[]; +} + +export interface TableRow extends Parent { + type: "tableRow"; + children: RowContent[]; +} + +export interface TableCell extends Parent { + type: "tableCell"; + children: PhrasingContent[]; +} + +export interface HTML extends Literal { + type: "html"; +} + +export interface Code extends Literal { + type: "code"; + lang?: string | null | undefined; + meta?: string | null | undefined; +} + +export interface YAML extends Literal { + type: "yaml"; +} + +export interface Definition extends Node, Association, Resource { + type: "definition"; +} + +export interface FootnoteDefinition extends Parent, Association { + type: "footnoteDefinition"; + children: Array; +} + +export interface Text extends Literal { + type: "text"; +} + +export interface Emphasis extends Parent { + type: "emphasis"; + children: PhrasingContent[]; +} + +export interface Strong extends Parent { + type: "strong"; + children: PhrasingContent[]; +} + +export interface Delete extends Parent { + type: "delete"; + children: PhrasingContent[]; +} + +export interface InlineCode extends Literal { + type: "inlineCode"; +} + +export interface Break extends Node { + type: "break"; +} + +export interface Link extends Parent, Resource { + type: "link"; + children: StaticPhrasingContent[]; +} + +export interface Image extends Node, Resource, Alternative { + type: "image"; +} + +export interface LinkReference extends Parent, Reference { + type: "linkReference"; + children: StaticPhrasingContent[]; +} + +export interface ImageReference extends Node, Reference, Alternative { + type: "imageReference"; +} + +export interface Footnote extends Parent { + type: "footnote"; + children: PhrasingContent[]; +} + +export interface FootnoteReference extends Node, Association { + type: "footnoteReference"; +} + +// Mixin +export interface Resource { + url: string; + title?: string | null | undefined; +} + +export interface Association { + identifier: string; + label?: string | null | undefined; +} + +export interface Reference extends Association { + referenceType: ReferenceType; +} + +export interface Alternative { + alt?: string | null | undefined; +} diff --git a/packages/gatsby-mdx-codesandbox/tsconfig.json b/packages/gatsby-mdx-codesandbox/tsconfig.json new file mode 100644 index 00000000..34c569d9 --- /dev/null +++ b/packages/gatsby-mdx-codesandbox/tsconfig.json @@ -0,0 +1,107 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [ + // "./src/@types", + // "./node_modules/@types", + // "../../node_modules/@types" + // ] /* Specify multiple folders that act like `./node_modules/@types`. */, + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src"], + "exclude": ["src/codesandbox-template"] +} diff --git a/packages/react-codesandbox-viewer/.gitignore b/packages/react-codesandbox-viewer/.gitignore new file mode 100644 index 00000000..76add878 --- /dev/null +++ b/packages/react-codesandbox-viewer/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/packages/react-codesandbox-viewer/.storybook/main.js b/packages/react-codesandbox-viewer/.storybook/main.js new file mode 100644 index 00000000..5ea17a0c --- /dev/null +++ b/packages/react-codesandbox-viewer/.storybook/main.js @@ -0,0 +1,5 @@ +module.exports = { + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + framework: '@storybook/react', +} diff --git a/packages/react-codesandbox-viewer/.storybook/preview.js b/packages/react-codesandbox-viewer/.storybook/preview.js new file mode 100644 index 00000000..750f637c --- /dev/null +++ b/packages/react-codesandbox-viewer/.storybook/preview.js @@ -0,0 +1,9 @@ +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +} diff --git a/packages/react-codesandbox-viewer/package.json b/packages/react-codesandbox-viewer/package.json new file mode 100644 index 00000000..a5bc93d5 --- /dev/null +++ b/packages/react-codesandbox-viewer/package.json @@ -0,0 +1,52 @@ +{ + "name": "react-codesandbox-viewer", + "version": "0.0.1", + "source": "src/index.ts", + "main": "dist/index.js", + "browserslist": "> 0.5%, last 2 versions, not dead", + "types": "dist/index.d.ts", + "license": "MIT", + "scripts": { + "build": "parcel build", + "watch": "chokidar 'src/*' -c 'yarn build'", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook" + }, + "dependencies": { + "@emotion/css": "^11.7.1", + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@fontsource/roboto": "^4.5.1", + "@mui/icons-material": "^5.2.5", + "@mui/material": "^5.2.8", + "@s-libs/micro-dash": "12", + "@swc/helpers": "^0.3.2", + "@types/prettier": "^2.4.3", + "@types/react-tabs": "^2.3.4", + "bootstrap": "5.1.3", + "prettier": "^2.5.1", + "rc-slider": "^9.7.5", + "react-bootstrap": "^2.1.1", + "react-codesandbox-viewer": "*", + "react-cookie": "^4.1.1", + "react-icons": "^4.3.1", + "react-syntax-highlighter": "^15.4.5", + "react-tabs": "^3.2.3", + "remark-codesandbox": "^0.10.0" + }, + "peerDependencies": { + "@types/react": "^17.0", + "react": "^17.0" + }, + "devDependencies": { + "@babel/core": "^7.16.7", + "@storybook/addon-actions": "^6.4.13", + "@storybook/addon-essentials": "^6.4.13", + "@storybook/addon-links": "^6.4.13", + "@storybook/react": "^6.4.13", + "@types/prettier": "^2.4.3", + "babel-loader": "^8.2.3", + "parcel": "^2.2.0", + "typescript": "^4.5.4" + } +} diff --git a/packages/react-codesandbox-viewer/src/App.jsx b/packages/react-codesandbox-viewer/src/App.jsx new file mode 100644 index 00000000..cf7ce942 --- /dev/null +++ b/packages/react-codesandbox-viewer/src/App.jsx @@ -0,0 +1,126 @@ +// FullImperitive.tsx +var __assign = + (this && this.__assign) || + function () { + __assign = + Object.assign || + function (t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i] + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p] + } + return t + } + return __assign.apply(this, arguments) + } +var __rest = + (this && this.__rest) || + function (s, e) { + var t = {} + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p] + if (s != null && typeof Object.getOwnPropertySymbols === 'function') + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]] + } + return t + } +/* + ********* WARNING ******** + * THIS CODE WAS LAUNCHED FROM LOCALHOST. + * LOCAL PACKAGES MAY NOT MATCH THE DEPENDENCIES + * USED IN THIS SANDBOX. + * + * TEST SANDBOX FOR BACKWARD COMPATIBLITY IF DESIRED. + ********* WARNING ******** + */ +import { Engine, FreeCamera, HemisphericLight, MeshBuilder, Scene, Vector3 } from '@babylonjs/core' +import { useEffect, useRef } from 'react' +var SceneComponent = function (props) { + var reactCanvas = useRef(null) + var _props = __assign({ canvasId: 'babylonjs-canvas' }, props) + var canvasId = _props.canvasId, + antialias = _props.antialias, + engineOptions = _props.engineOptions, + adaptToDeviceRatio = _props.adaptToDeviceRatio, + sceneOptions = _props.sceneOptions, + onRender = _props.onRender, + onSceneReady = _props.onSceneReady, + rest = __rest(_props, [ + 'canvasId', + 'antialias', + 'engineOptions', + 'adaptToDeviceRatio', + 'sceneOptions', + 'onRender', + 'onSceneReady', + ]) + useEffect( + function () { + if (!reactCanvas.current) return + var engine = new Engine(reactCanvas.current, antialias, engineOptions, adaptToDeviceRatio) + var scene = new Scene(engine, sceneOptions) + if (scene.isReady()) { + onSceneReady(scene) + } else { + scene.onReadyObservable.addOnce(onSceneReady) + } + engine.runRenderLoop(function () { + onRender(scene) + scene.render() + }) + var resize = function () { + scene.getEngine().resize() + } + if (window) { + window.addEventListener('resize', resize) + } + return function () { + scene.getEngine().dispose() + if (window) { + window.removeEventListener('resize', resize) + } + } + }, + [antialias, engineOptions, adaptToDeviceRatio, sceneOptions, onRender, onSceneReady] + ) + return +} +var box +var onSceneReady = function (scene) { + // This creates and positions a free camera (non-mesh) + var camera = new FreeCamera('camera1', new Vector3(0, 5, -10), scene) + // This targets the camera to scene origin + camera.setTarget(Vector3.Zero()) + var canvas = scene.getEngine().getRenderingCanvas() + // This attaches the camera to the canvas + camera.attachControl(canvas, true) + // This creates a light, aiming 0,1,0 - to the sky (non-mesh) + var light = new HemisphericLight('light', new Vector3(0, 1, 0), scene) + // Default intensity is 1. Let's dim the light a small amount + light.intensity = 0.7 + // Our built-in 'box' shape. + box = MeshBuilder.CreateBox('box', { size: 2 }, scene) + // Move the box upward 1/2 its height + box.position.y = 1 + // Our built-in 'ground' shape. + MeshBuilder.CreateGround('ground', { width: 6, height: 6 }, scene) +} +/** + * Will run on every frame render. We are spinning the box on y-axis. + */ +var onRender = function (scene) { + if (box !== undefined) { + var deltaTimeInMillis = scene.getEngine().getDeltaTime() + var rpm = 10 + box.rotation.y += (rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) + } +} +var App = function () { + return ( +
+ +
+ ) +} +export default App diff --git a/packages/react-codesandbox-viewer/src/App.tsx b/packages/react-codesandbox-viewer/src/App.tsx new file mode 100644 index 00000000..577beb85 --- /dev/null +++ b/packages/react-codesandbox-viewer/src/App.tsx @@ -0,0 +1,145 @@ +// FullImperitive.tsx + +/* + ********* WARNING ******** + * THIS CODE WAS LAUNCHED FROM LOCALHOST. + * LOCAL PACKAGES MAY NOT MATCH THE DEPENDENCIES + * USED IN THIS SANDBOX. + * + * TEST SANDBOX FOR BACKWARD COMPATIBLITY IF DESIRED. + ********* WARNING ******** + */ + +import { + Engine, + EngineOptions, + FreeCamera, + HemisphericLight, + Mesh, + MeshBuilder, + Scene, + SceneOptions, + Vector3, +} from '@babylonjs/core' +import { FC, useEffect, useRef } from 'react' +import { SetRequired } from 'type-fest' +type OnSceneReadyHandler = (scene: Scene) => void + +type OnRenderHandler = (scene: Scene) => void + +// import SceneComponent from 'babylonjs-hook'; // if you install 'babylonjs-hook' NPM. + +type SceneComponentProps = { + canvasId: string + antialias?: boolean + engineOptions?: EngineOptions + adaptToDeviceRatio?: boolean + sceneOptions?: SceneOptions + onRender: OnRenderHandler + onSceneReady: OnSceneReadyHandler +} + +type SceneComponentPropsIn = SetRequired, 'onRender' | 'onSceneReady'> + +const SceneComponent: FC = (props) => { + const reactCanvas = useRef(null) + const _props: SceneComponentProps = { + canvasId: 'babylonjs-canvas', + ...props, + } + + const { + canvasId, + antialias, + engineOptions, + adaptToDeviceRatio, + sceneOptions, + onRender, + onSceneReady, + ...rest + } = _props + + useEffect(() => { + if (!reactCanvas.current) return + const engine = new Engine(reactCanvas.current, antialias, engineOptions, adaptToDeviceRatio) + const scene = new Scene(engine, sceneOptions) + if (scene.isReady()) { + onSceneReady(scene) + } else { + scene.onReadyObservable.addOnce(onSceneReady) + } + + engine.runRenderLoop(() => { + onRender(scene) + scene.render() + }) + + const resize = () => { + scene.getEngine().resize() + } + + if (window) { + window.addEventListener('resize', resize) + } + + return () => { + scene.getEngine().dispose() + + if (window) { + window.removeEventListener('resize', resize) + } + } + }, [antialias, engineOptions, adaptToDeviceRatio, sceneOptions, onRender, onSceneReady]) + + return +} + +let box: Mesh + +const onSceneReady: OnSceneReadyHandler = (scene) => { + // This creates and positions a free camera (non-mesh) + var camera = new FreeCamera('camera1', new Vector3(0, 5, -10), scene) + + // This targets the camera to scene origin + camera.setTarget(Vector3.Zero()) + + const canvas = scene.getEngine().getRenderingCanvas() + + // This attaches the camera to the canvas + camera.attachControl(canvas, true) + + // This creates a light, aiming 0,1,0 - to the sky (non-mesh) + var light = new HemisphericLight('light', new Vector3(0, 1, 0), scene) + + // Default intensity is 1. Let's dim the light a small amount + light.intensity = 0.7 + + // Our built-in 'box' shape. + box = MeshBuilder.CreateBox('box', { size: 2 }, scene) + + // Move the box upward 1/2 its height + box.position.y = 1 + + // Our built-in 'ground' shape. + MeshBuilder.CreateGround('ground', { width: 6, height: 6 }, scene) +} + +/** + * Will run on every frame render. We are spinning the box on y-axis. + */ +const onRender: OnRenderHandler = (scene) => { + if (box !== undefined) { + var deltaTimeInMillis = scene.getEngine().getDeltaTime() + + const rpm = 10 + box.rotation.y += (rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) + } +} + +const App: FC = () => ( +
+ +
+) + +export default App diff --git a/packages/react-codesandbox-viewer/src/Demo.stories.tsx b/packages/react-codesandbox-viewer/src/Demo.stories.tsx new file mode 100644 index 00000000..031342f9 --- /dev/null +++ b/packages/react-codesandbox-viewer/src/Demo.stories.tsx @@ -0,0 +1,76 @@ +import { ComponentMeta, ComponentStory } from '@storybook/react' +import React from 'react' +import App from './App' +import { Demo } from './Demo' + +// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export +export default { + title: 'Demo', + component: Demo, + // More on argTypes: https://storybook.js.org/docs/react/api/argtypes + argTypes: { + backgroundColor: { control: 'color' }, + }, +} as ComponentMeta + +// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args +const Template: ComponentStory = (args) => + +export const Primary = Template.bind({}) + +// More on args: https://storybook.js.org/docs/react/writing-stories/args +Primary.args = { + prefix: `g${+new Date()}`, + isDevelopmentMode: true, + container: App, + typescript: `/** + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + + import React, { FC } from 'react' + + const App: FC = () =>
'hello world'
+ + export default App + + `, +} diff --git a/packages/react-codesandbox-viewer/src/Demo.tsx b/packages/react-codesandbox-viewer/src/Demo.tsx new file mode 100644 index 00000000..dde6c4d4 --- /dev/null +++ b/packages/react-codesandbox-viewer/src/Demo.tsx @@ -0,0 +1,209 @@ +import { css } from '@emotion/css' +import '@fontsource/roboto/300.css' +import '@fontsource/roboto/400.css' +import '@fontsource/roboto/500.css' +import '@fontsource/roboto/700.css' +import 'bootstrap/dist/css/bootstrap.min.css' +import { Options } from 'prettier' +import typescript from 'prettier/parser-typescript' +import prettier from 'prettier/standalone' +import Slider from 'rc-slider' +import 'rc-slider/assets/index.css' +import React, { ComponentType, FC, useMemo, useState } from 'react' +import Button from 'react-bootstrap/Button' +import ButtonGroup from 'react-bootstrap/ButtonGroup' +import Modal from 'react-bootstrap/Modal' +import { FaCog } from 'react-icons/fa' +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' +import { dark } from 'react-syntax-highlighter/dist/esm/styles/prism' +import { Tab, TabList, TabPanel, Tabs } from 'react-tabs' +import 'react-tabs/style/react-tabs.css' +import { createCookieHooker } from './cookieHook' + +const plugins = [typescript] + +const PRETTIER_OPTS: Options = { + parser: 'typescript', + plugins, + singleQuote: true, + semi: false, + printWidth: 100, + jsxBracketSameLine: false, + tabWidth: 2, + trailingComma: 'es5', +} + +const useRememberFontSize = createCookieHooker('fontsize') +const useRememberTabIdx = createCookieHooker('tabidx') +const useRememberLanguage = createCookieHooker<'ts' | 'js'>('language') +const useRememberWrapWidth = createCookieHooker('wrapwidth') + +export type DemoProps = { + isDevelopmentMode: boolean + container: ComponentType + typescript: string + javascript: string + codesandboxUrl: string + prefix: string +} + +export const Demo: FC> = (props) => { + const _props: DemoProps = { + container: () =>
Render me
, + javascript: `import React from 'react' + + const App = () =>
'hello world'
+ + export default App + `, + typescript: `import React, { FC } from 'react' + + const App: FC = () =>
'hello world'
+ + export default App + `, + codesandboxUrl: 'https://codesandbox.io', + isDevelopmentMode: false, + prefix: '', + ...props, + } + const { container, typescript, javascript, codesandboxUrl, isDevelopmentMode, prefix } = _props + + const [language, setLanguage] = useRememberLanguage('ts') + const [tabIdx, setTabIdx] = useRememberTabIdx(0, prefix) + const [fontSize, setFontSize] = useRememberFontSize(10) + const [printWidth, setPrintWidth] = useRememberWrapWidth(80) + const [showSettings, setShowSettings] = useState(false) + + const source = useMemo(() => { + return prettier.format(language === 'ts' ? typescript : javascript, { + ...PRETTIER_OPTS, + printWidth, + }) + }, [language, printWidth]) + + return ( +
+ {isDevelopmentMode && ( +
+ Development mode detected. Running local code against local packages. +
+ )} + + setTabIdx(idx)}> + + Demo + Code +
+ + + + +
+ + +
+ + {React.createElement(container)} + + + {source} + + +
+ setShowSettings(false)}> + + Editor Settings + + +
+ Font Size + setFontSize(v as number)} + /> +
+
+ Wrap Width + setPrintWidth(v as number)} + /> +
+
+
+
+ ) +} diff --git a/packages/react-codesandbox-viewer/src/cookieHook.ts b/packages/react-codesandbox-viewer/src/cookieHook.ts new file mode 100644 index 00000000..ed126b7b --- /dev/null +++ b/packages/react-codesandbox-viewer/src/cookieHook.ts @@ -0,0 +1,38 @@ +import { useCookies } from 'react-cookie' + +export const useRememberCookieState = ( + defaultValue: TValue, + key = '' +): [value: TValue, setValue: (value: TValue) => void] => { + const [cookies, setCookies] = useCookies() + + const _set = (value: TValue) => { + const save = { _v: value } + // console.log(key, 'setting', save) + setCookies(key, save) + } + + const _v = (() => { + const _v = cookies[key] + // console.log(key, 'get', 'existing', { _v }) + if (typeof _v === 'undefined') { + // console.log(key, 'get', 'default', defaultValue) + return defaultValue + } + return _v._v + })() + + return [_v, _set] +} +type CookieState = ( + defaultValue: TValue, + guid?: string +) => [TValue, (value: TValue) => void] +export const createCookieHooker = (name: string) => { + const useFunc: CookieState = (defaultValue, guid = '') => { + const [value, set] = useRememberCookieState(defaultValue, `${guid}_${name}`) + + return [value, set] + } + return useFunc +} diff --git a/packages/react-codesandbox-viewer/src/index.ts b/packages/react-codesandbox-viewer/src/index.ts new file mode 100644 index 00000000..46ea0af4 --- /dev/null +++ b/packages/react-codesandbox-viewer/src/index.ts @@ -0,0 +1 @@ +export * from './Demo' diff --git a/packages/react-codesandbox-viewer/tsconfig.json b/packages/react-codesandbox-viewer/tsconfig.json new file mode 100644 index 00000000..879726d1 --- /dev/null +++ b/packages/react-codesandbox-viewer/tsconfig.json @@ -0,0 +1,107 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "typeRoots": [ + "./src/@types", + "./node_modules/@types", + "../../node_modules/@types" + ] /* Specify multiple folders that act like `./node_modules/@types`. */, + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src"], + "exclude": ["src/plugin/codesandbox-template"] +} diff --git a/packages/static/.eslintrc.json b/packages/static/.eslintrc.json index 074b9f85..60e17be5 100755 --- a/packages/static/.eslintrc.json +++ b/packages/static/.eslintrc.json @@ -1,11 +1,5 @@ { - "extends": [ - "eslint:recommended", - "plugin:import/errors", - "plugin:react/recommended", - "plugin:jsx-a11y/recommended", - "prettier" - ], + "extends": ["react-app", "prettier"], "plugins": ["react", "import", "jsx-a11y"], "settings": { "react": { @@ -23,19 +17,9 @@ "react/prop-types": 0, "react/react-in-jsx-scope": "off", "lines-between-class-members": ["error", "always"], - "padding-line-between-statements": [ - "error", - { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*" }, - { - "blankLine": "always", - "prev": ["const", "let", "var"], - "next": ["const", "let", "var"] - }, - { "blankLine": "always", "prev": "directive", "next": "*" }, - { "blankLine": "any", "prev": "directive", "next": "directive" } - ] + "padding-line-between-statements": 0 }, - "parser": "babel-eslint", + "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": 10, "sourceType": "module", @@ -49,6 +33,7 @@ "node": true }, "globals": { - "graphql": false + "graphql": false, + "JSX": true } } diff --git a/packages/static/.prettierignore b/packages/static/.prettierignore index 16d3c4db..4849e0ab 100644 --- a/packages/static/.prettierignore +++ b/packages/static/.prettierignore @@ -1 +1,2 @@ .cache +public diff --git a/packages/static/.prettierrc b/packages/static/.prettierrc index 48bb2e78..a2a24e02 100644 --- a/packages/static/.prettierrc +++ b/packages/static/.prettierrc @@ -1,6 +1,5 @@ { "printWidth": 100, - "jsxBracketSameLine": false, "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", diff --git a/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/HelloReact.tsx b/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/HelloReact.tsx new file mode 100644 index 00000000..0a2cc268 --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/HelloReact.tsx @@ -0,0 +1,5 @@ +import { FC } from 'react' + +const App: FC = () =>
Hello, React!
+ +export default App diff --git a/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate.mdx b/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/index.mdx similarity index 65% rename from packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate.mdx rename to packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/index.mdx index afd5cb72..9deb4377 100644 --- a/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate.mdx +++ b/packages/static/content/3-hello-react-babylonjs/1-react-boiler-plate/index.mdx @@ -18,12 +18,4 @@ yarn create react-app my-app Once you have a project, you'll find a setup that looks a little like this: -```tsx codesandbox=rbjs?entry=./src/App.tsx -import { FC } from 'react' - -const App: FC = () => ( -
Hello, React!
-) - -export default App -``` +[demo:HelloReact.tsx] diff --git a/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs.mdx b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/FullImperitive.tsx similarity index 51% rename from packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs.mdx rename to packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/FullImperitive.tsx index f3b21649..a71e2820 100644 --- a/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs.mdx +++ b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/FullImperitive.tsx @@ -1,17 +1,3 @@ ---- -title: 'Plain Old React + Babylon.js' -slug: 'react-with-imperitive-babylonjs' ---- - -Once you have a React project set up, you can program Babylon.js imperitively -just like they tell you in the -[official Babylon.js + React guide](https://doc.babylonjs.com/extensions/Babylon.js+ExternalLibraries/BabylonJS_and_ReactJS). - -Wow, it takes **almost 150 lines of code** to make a box show up on a screen! -But do not be scared. We are showing you how much coding it actually takes so -you'll fully appreciate the next section. - -```tsx codesandbox=rbjs?entry=./src/App.tsx import { Engine, EngineOptions, @@ -41,10 +27,7 @@ type SceneComponentProps = { onSceneReady: OnSceneReadyHandler } -type SceneComponentPropsIn = SetRequired< - Partial, - 'onRender' | 'onSceneReady' -> +type SceneComponentPropsIn = SetRequired, 'onRender' | 'onSceneReady'> const SceneComponent: FC = (props) => { const reactCanvas = useRef(null) @@ -66,12 +49,7 @@ const SceneComponent: FC = (props) => { useEffect(() => { if (!reactCanvas.current) return - const engine = new Engine( - reactCanvas.current, - antialias, - engineOptions, - adaptToDeviceRatio - ) + const engine = new Engine(reactCanvas.current, antialias, engineOptions, adaptToDeviceRatio) const scene = new Scene(engine, sceneOptions) if (scene.isReady()) { onSceneReady(scene) @@ -99,14 +77,7 @@ const SceneComponent: FC = (props) => { window.removeEventListener('resize', resize) } } - }, [ - antialias, - engineOptions, - adaptToDeviceRatio, - sceneOptions, - onRender, - onSceneReady, - ]) + }, [antialias, engineOptions, adaptToDeviceRatio, sceneOptions, onRender, onSceneReady]) return } @@ -160,73 +131,3 @@ const App: FC = () => ( ) export default App -``` - -Now to be completely fair, Babylon.js has created a helpful -[babylonjs-hook](https://www.npmjs.com/package/babylonjs-hook) package which -replaces `SceneComponent`. If you use this, you can get down to about **60 lines -of code**. But next, I'll show you how to do it in **under 30**. - -```tsx codesandbox=rbjs?entry=./src/App.tsx -import { - FreeCamera, - HemisphericLight, - Mesh, - MeshBuilder, - Scene, - Vector3, -} from '@babylonjs/core' -import SceneComponent from 'babylonjs-hook' - -type OnSceneReadyHandler = (scene: Scene) => void - -type OnRenderHandler = (scene: Scene) => void - -let box: Mesh - -const onSceneReady: OnSceneReadyHandler = (scene) => { - // This creates and positions a free camera (non-mesh) - var camera = new FreeCamera('camera1', new Vector3(0, 5, -10), scene) - - // This targets the camera to scene origin - camera.setTarget(Vector3.Zero()) - - const canvas = scene.getEngine().getRenderingCanvas() - - // This attaches the camera to the canvas - camera.attachControl(canvas, true) - - // This creates a light, aiming 0,1,0 - to the sky (non-mesh) - var light = new HemisphericLight('light', new Vector3(0, 1, 0), scene) - - // Default intensity is 1. Let's dim the light a small amount - light.intensity = 0.7 - - // Our built-in 'box' shape. - box = MeshBuilder.CreateBox('box', { size: 2 }, scene) - - // Move the box upward 1/2 its height - box.position.y = 1 - - // Our built-in 'ground' shape. - MeshBuilder.CreateGround('ground', { width: 6, height: 6 }, scene) -} - -/** - * Will run on every frame render. We are spinning the box on y-axis. - */ -const onRender: OnRenderHandler = (scene) => { - if (box !== undefined) { - var deltaTimeInMillis = scene.getEngine().getDeltaTime() - - const rpm = 10 - box.rotation.y += (rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) - } -} - -export default () => ( -
- -
-) -``` diff --git a/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/WithHooks.tsx b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/WithHooks.tsx new file mode 100644 index 00000000..8d72fb6c --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/WithHooks.tsx @@ -0,0 +1,57 @@ +import { FreeCamera, HemisphericLight, Mesh, MeshBuilder, Scene, Vector3 } from '@babylonjs/core' +import SceneComponent from 'babylonjs-hook' +import { FC } from 'react' + +type OnSceneReadyHandler = (scene: Scene) => void + +type OnRenderHandler = (scene: Scene) => void + +let box: Mesh + +const onSceneReady: OnSceneReadyHandler = (scene) => { + // This creates and positions a free camera (non-mesh) + var camera = new FreeCamera('camera1', new Vector3(0, 5, -10), scene) + + // This targets the camera to scene origin + camera.setTarget(Vector3.Zero()) + + const canvas = scene.getEngine().getRenderingCanvas() + + // This attaches the camera to the canvas + camera.attachControl(canvas, true) + + // This creates a light, aiming 0,1,0 - to the sky (non-mesh) + var light = new HemisphericLight('light', new Vector3(0, 1, 0), scene) + + // Default intensity is 1. Let's dim the light a small amount + light.intensity = 0.7 + + // Our built-in 'box' shape. + box = MeshBuilder.CreateBox('box', { size: 2 }, scene) + + // Move the box upward 1/2 its height + box.position.y = 1 + + // Our built-in 'ground' shape. + MeshBuilder.CreateGround('ground', { width: 6, height: 6 }, scene) +} + +/** + * Will run on every frame render. We are spinning the box on y-axis. + */ +const onRender: OnRenderHandler = (scene) => { + if (box !== undefined) { + var deltaTimeInMillis = scene.getEngine().getDeltaTime() + + const rpm = 10 + box.rotation.y += (rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) + } +} + +const App: FC = () => ( +
+ +
+) + +export default App diff --git a/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/index.mdx b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/index.mdx new file mode 100644 index 00000000..e4678986 --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/2-react-with-imperitive-babylonjs/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Plain Old React + Babylon.js' +slug: 'react-with-imperitive-babylonjs' +--- + +Once you have a React project set up, you can program Babylon.js imperitively +just like they tell you in the +[official Babylon.js + React guide](https://doc.babylonjs.com/extensions/Babylon.js+ExternalLibraries/BabylonJS_and_ReactJS). + +[demo:FullImperitive.tsx] + +The demo above is produced using imperitive Typescript. Wow, it takes **almost +150 lines of code** to make a box show up on a screen! But do not be scared. We +are showing you how much work it actually takes so you'll fully appreciate the +power of `react-babylonjs`. + +As you review the code, notice everything happens in sequence and you are +responsible for re-running affected code when you change the input values. + +In a [reactive programming](https://en.wikipedia.org/wiki/Reactive_programming), +a change in the input values naturally cascades to affected code. There are many +benefits to a reactive programming style that we won't cover here. But speed, +efficiency, and ability to reason through complex state changes are among the +many benefits. + +Mixing imperitive programming with React is generally an antipattern because it +reduces the benefits of reactive programming. + +Therefore, this code is the least desirable way to use Babylon.js in React. + +Now to be completely fair, Babylon.js has created a helpful +[babylonjs-hook](https://www.npmjs.com/package/babylonjs-hook) package which +replaces `SceneComponent`. If you use this, you can get down to about **60 lines +of code**. But it's still imperitive programming, not declarative or reactive +programming. + +After this, I'll show you how to do the same thing in **under 50 lines of code +using real declarative programming**. + +[demo:WithHooks.tsx] diff --git a/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs.mdx b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs.mdx deleted file mode 100644 index a0ccf54c..00000000 --- a/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: 'Under 50 Lines of Code: react-babylonjs' -slug: 'react-with-declarative-babylonjs' ---- - -In previous sections, we saw how to: - -- Create a boilerplate React app -- Instantiate a Babylon.js scene imperitively -- Shoehorn the above into React in about 150 lines of code, still not "reactive" - or declarative -- Reduce 150 lines of code to 60 by moving some of it into a 3rd party package, - but still not reactive or declarative - -But now, we'll see how to do the exact same thing in **just under 50 lines of -code using a true reactive/declarative approach**. - -We also learn how to make custom Babylon React components, and how to use some -helpful hooks like `useScene`, `useBeforeRender`. - -```tsx codesandbox=rbjs?entry=./src/App.tsx -import { Vector3 } from '@babylonjs/core' -import { FC, useRef } from 'react' -import { Engine, Scene, useBeforeRender, useScene } from 'react-babylonjs' - -const RPM = 5 - -const MovingBox: FC = (props) => { - // access Babylon Scene - const scene = useScene() - // access refs to Babylon objects in scene like DOM nodes - const boxRef = useRef(null) - - useBeforeRender(() => { - if (!boxRef.current?.rotation) return - if (!scene) return - const deltaTimeInMillis = scene.getEngine().getDeltaTime() - boxRef.current.rotation.y += - (RPM / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) - }) - - return ( - - ) -} - -const App: FC = () => ( -
- - - - - - - - -
-) - -export default App -``` diff --git a/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/BasicScene.tsx b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/BasicScene.tsx new file mode 100644 index 00000000..20f37d75 --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/BasicScene.tsx @@ -0,0 +1,19 @@ +import { Vector3 } from '@babylonjs/core' +import { FC } from 'react' +import { Engine, Scene } from 'react-babylonjs' + +const v3 = (x = 0, y = 0, z = 0) => new Vector3(x, y, z) + +const App: FC = () => ( +
+ + + + + + + +
+) + +export default App diff --git a/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/Declarative.tsx b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/Declarative.tsx new file mode 100644 index 00000000..14906dba --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/Declarative.tsx @@ -0,0 +1,36 @@ +import { Vector3 } from '@babylonjs/core' +import { FC, useRef } from 'react' +import { Engine, Scene, useBeforeRender, useScene } from 'react-babylonjs' + +const RPM = 5 + +const MovingBox: FC = () => { + // access Babylon Scene + const scene = useScene() + // access refs to Babylon objects in scene like DOM nodes + const boxRef = useRef(null) + + useBeforeRender(() => { + if (!boxRef.current?.rotation) return + if (!scene) return + const deltaTimeInMillis = scene.getEngine().getDeltaTime() + boxRef.current.rotation.y += (RPM / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) + }) + + return +} + +const App: FC = () => ( +
+ + + + + + + + +
+) + +export default App diff --git a/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/index.mdx b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/index.mdx new file mode 100644 index 00000000..c90aab3b --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/3-react-with-declarative-babylonjs/index.mdx @@ -0,0 +1,99 @@ +--- +title: 'Under 50 Lines of Code: react-babylonjs' +slug: 'react-with-declarative-babylonjs' +--- + +In previous sections, we saw how to: + +- Create a boilerplate React app +- Instantiate a Babylon.js scene imperitively +- Shoehorn the above into React in about 150 lines of code, still not "reactive" + or declarative +- Reduce 150 lines of code to 60 by moving some of it into a 3rd party package, + but still not reactive or declarative + +But now, we'll see how to do the exact same thing in **just under 50 lines of +code using a true reactive/declarative approach**. + +We also learn how to make custom Babylon React components, and how to use some +helpful hooks like `useScene`, `useBeforeRender`. + +First, let's take a look at what a basic React structure looks like: + +```tsx +import { Engine, Scene } from 'react-babylonjs' + +const BasicScene: FC = ({ children }) => ( + + {children} + +) +``` + +The above code introduces the `Engine` and `Scene` tags of `react-bablylonjs`. +These perform boilerplate initialization. Everything you might like to add to a +scene will go inside the `Scene` tag. + +Next, we are going to define a camera, some light, and a ground surface. At this +point, it's important to understand a Typescript concept known as +[intrinsic JSX](https://www.typescriptlang.org/docs/handbook/jsx.html#intrinsic-elements). +Where we had to explicitly import `Egnine` and `Scene`, there are many tags +related to Babylon.js that are already known to React. We will use `freeCamera`, +`hemisphericLight`, and `ground`. + +First, let's make a little helper function. Babylon.js defines a `Vector3` class +which is used very frequently. We'll make a helper for it. When you see `v3` +anywhere, it's coming from this: + +```tsx +import { Vector3 } from '@babylonjs/core' + +const v3 = (x = 0, y = 0, z = 0) => new Vector3(x, y, z) +``` + +Now with that in place, here's how we can add a camera, light, and ground to our +scene. + +```tsx + + + + + +``` + +Here's the final result of that basic scene: + +[demo:BasicScene.tsx] + +Now that we have a basic scene in place, let's make that spinning box like we +did before, but this time, do it React style. + +```tsx + +``` + +```tsx +const RPM = 5 + +const MovingBox: FC = () => { + // access Babylon Scene + const scene = useScene() + // access refs to Babylon objects in scene like DOM nodes + const boxRef = useRef(null) + + useBeforeRender(() => { + if (!boxRef.current?.rotation) return + if (!scene) return + const deltaTimeInMillis = scene.getEngine().getDeltaTime() + boxRef.current.rotation.y += + (RPM / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000) + }) + + return ( + + ) +} +``` + +[demo:Declarative.tsx] diff --git a/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color.mdx b/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/Colorful.tsx similarity index 55% rename from packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color.mdx rename to packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/Colorful.tsx index d0b85d38..9f41cc96 100644 --- a/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color.mdx +++ b/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/Colorful.tsx @@ -1,11 +1,3 @@ ---- -title: 'Adding More Animation and Color' -slug: 'react-babylonjs-with-animation' ---- - -Let's take a look at how to spice up this 3D scene a bit. - -```tsx codesandbox=rbjs?entry=./src/App.tsx import { Color3, Vector3 } from '@babylonjs/core' import { FC, useRef } from 'react' import { Engine, Scene, useBeforeRender, useScene } from 'react-babylonjs' @@ -34,11 +26,7 @@ const MovingBox: FC = (props) => { return ( - + ) } @@ -47,30 +35,13 @@ const App: FC = () => (
- - - - + + + +
) export default App -``` diff --git a/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/index.mdx b/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/index.mdx new file mode 100644 index 00000000..cdd65e17 --- /dev/null +++ b/packages/static/content/3-hello-react-babylonjs/4-adding-animation-and-color/index.mdx @@ -0,0 +1,8 @@ +--- +title: 'Adding More Animation and Color' +slug: 'react-babylonjs-with-animation' +--- + +Let's take a look at how to spice up this 3D scene a bit. + +[demo:Colorful.tsx] diff --git a/packages/static/gatsby-config.js b/packages/static/gatsby-config.js index 18c351a2..15ac80cc 100755 --- a/packages/static/gatsby-config.js +++ b/packages/static/gatsby-config.js @@ -36,16 +36,8 @@ const plugins = [ resolve: 'gatsby-remark-copy-linked-files', }, { - resolve: 'remark-codesandbox/gatsby', - options: { - mode: 'iframe', - customTemplates: { - rbjs: { - extends: 'file:./codesandbox-template', - entry: './src/App.tsx', - }, - }, - }, + resolve: 'gatsby-mdx-codesandbox', + options: {}, }, ], extensions: ['.mdx', '.md'], diff --git a/packages/static/package.json b/packages/static/package.json index 822c46c1..bb53209a 100755 --- a/packages/static/package.json +++ b/packages/static/package.json @@ -1,5 +1,5 @@ { - "name": "react-babylonjs-docs", + "name": "@react-babylonjs/docs", "private": true, "description": "react-babylonjs Documentation", "version": "0.0.1", @@ -22,6 +22,7 @@ "emotion-server": "^11.0.0", "gatsby": "^4.0.0", "gatsby-link": "^4.0.0", + "gatsby-mdx-codesandbox": "*", "gatsby-plugin-algolia": "^0.19.0", "gatsby-plugin-emotion": "^7.0.0", "gatsby-plugin-gtag": "^1.0.13", @@ -52,7 +53,8 @@ "react-instantsearch-dom": "^6.11.0", "react-live": "^2.2.3", "react-loadable": "^5.5.0", - "styled-components": "^5.3.0" + "styled-components": "^5.3.0", + "type-fest": "^2.9.0" }, "license": "MIT", "scripts": { @@ -82,6 +84,6 @@ "prettier": "^2.5.1", "prettier-plugin-organize-imports": "^2.3.4", "prism-react-renderer": "^1.2.0", - "remark-codesandbox": "^0.10.0" + "typescript": "^4.5.4" } } diff --git a/packages/static/src/components/index.js b/packages/static/src/components/index.js index 216a425a..a6122a09 100644 --- a/packages/static/src/components/index.js +++ b/packages/static/src/components/index.js @@ -1,6 +1,8 @@ +// organize-imports-ignore export * from './theme' // eslint-disable-line -export { mdxComponents, ThemeProvider, Layout, Link } import Layout from './layout' import Link from './link' import mdxComponents from './mdxComponents' import ThemeProvider from './theme/themeProvider' + +export { mdxComponents, ThemeProvider, Layout, Link } diff --git a/packages/static/src/components/mdxComponents/ReactDemo.js b/packages/static/src/components/mdxComponents/ReactDemo.js deleted file mode 100644 index fe9b473b..00000000 --- a/packages/static/src/components/mdxComponents/ReactDemo.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' - -const ReactDemo = (props) => { - const { children } = props - - return ( -
- {children} -
- ) -} - -export default ReactDemo diff --git a/packages/static/src/components/mdxComponents/Sandbox.js b/packages/static/src/components/mdxComponents/Sandbox.js deleted file mode 100644 index 34b8210a..00000000 --- a/packages/static/src/components/mdxComponents/Sandbox.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' - -const Sandbox = (props) => { - const { name } = props - - return ( - - ) -} - -export default Sandbox diff --git a/packages/static/src/components/mdxComponents/Sandbox.tsx b/packages/static/src/components/mdxComponents/Sandbox.tsx new file mode 100644 index 00000000..ee8ca072 --- /dev/null +++ b/packages/static/src/components/mdxComponents/Sandbox.tsx @@ -0,0 +1,25 @@ +import { FC } from 'react' + +const Sandbox: FC<{ name: string }> = (props) => { + return
{JSON.stringify(props, null, 2)}
+ + // const { name } = props + + // return ( + // + // ) +} + +export default Sandbox diff --git a/packages/static/src/components/mdxComponents/index.js b/packages/static/src/components/mdxComponents/index.js index 330e53fb..8abf1c73 100644 --- a/packages/static/src/components/mdxComponents/index.js +++ b/packages/static/src/components/mdxComponents/index.js @@ -2,7 +2,6 @@ import styled from '@emotion/styled' import * as React from 'react' import AnchorTag from './anchor' import CodeBlock from './codeBlock' -import ReactDemo from './ReactDemo' import Sandbox from './Sandbox' import Stats from './Stats' @@ -79,7 +78,6 @@ export default { code: CodeBlock, a: AnchorTag, Sandbox, - ReactDemo, Stats, // TODO add `img` // TODO add `blockquote` diff --git a/packages/static/src/components/sidebar/index.js b/packages/static/src/components/sidebar/index.js index cc7a57a3..a479c7e3 100644 --- a/packages/static/src/components/sidebar/index.js +++ b/packages/static/src/components/sidebar/index.js @@ -107,6 +107,7 @@ const SidebarLayout = ({ location }) => ( } `} render={({ allMdx }) => { + console.log({ allMdx }) return ( {config.sidebar.title ? ( diff --git a/packages/static/tsconfig.json b/packages/static/tsconfig.json new file mode 100644 index 00000000..2f7aa534 --- /dev/null +++ b/packages/static/tsconfig.json @@ -0,0 +1,100 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es5" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "preserve" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/packages/storybook-static/.gitignore b/packages/storybook-static/.gitignore new file mode 100644 index 00000000..82d94d38 --- /dev/null +++ b/packages/storybook-static/.gitignore @@ -0,0 +1,3 @@ +node_modules +storybook-static +yarn.lock \ No newline at end of file diff --git a/packages/storybook-static/.storybook/main.js b/packages/storybook-static/.storybook/main.js new file mode 100644 index 00000000..4f1e33d1 --- /dev/null +++ b/packages/storybook-static/.storybook/main.js @@ -0,0 +1,24 @@ +const path = require('path'); + +module.exports = { + "stories": [ + "../stories/**/*.stories.mdx", + "../stories/**/*.stories.@(js|jsx|ts|tsx)" + ], + addons: [ + //'@storybook/addon-actions/register', + //'@storybook/addon-links', + '@storybook/addon-storysource' + // '@storybook/addon-notes/register', + ], + webpackFinal: async (config, { configType }) => { + // config.module.rules.push({ + // test: /\.stories\.jsx?$/, + // loaders: [require.resolve('@storybook/source-loader')], + // enforce: 'pre', + // }); + // console.log(`added source loader to '${configType}' webpack config`); + // Return the altered config + return config; + }, +}; diff --git a/packages/storybook-static/.storybook/manager-head.html b/packages/storybook-static/.storybook/manager-head.html new file mode 100644 index 00000000..29b03efa --- /dev/null +++ b/packages/storybook-static/.storybook/manager-head.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/storybook-static/.storybook/manager.js b/packages/storybook-static/.storybook/manager.js new file mode 100644 index 00000000..dcc94918 --- /dev/null +++ b/packages/storybook-static/.storybook/manager.js @@ -0,0 +1,25 @@ +import { addons } from '@storybook/addons'; +import { themes } from '@storybook/theming'; + +addons.setConfig({ + isFullscreen: false, + showNav: true, + showPanel: true, + panelPosition: 'right', + enableShortcuts: true, + isToolshown: true, + theme: themes.dark, + selectedPanel: 'story', + initialActive: 'sidebar', + sidebar: { + showRoots: false, + collapsedRoots: ['other'], + }, + toolbar: { + title: { hidden: false, }, + zoom: { hidden: false, }, + eject: { hidden: false, }, + copy: { hidden: false, }, + fullscreen: { hidden: false, }, + }, +}); \ No newline at end of file diff --git a/packages/storybook-static/.storybook/preview-head.html b/packages/storybook-static/.storybook/preview-head.html new file mode 100644 index 00000000..e7f048fd --- /dev/null +++ b/packages/storybook-static/.storybook/preview-head.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/storybook-static/.storybook/preview.js b/packages/storybook-static/.storybook/preview.js new file mode 100644 index 00000000..21377b6c --- /dev/null +++ b/packages/storybook-static/.storybook/preview.js @@ -0,0 +1,14 @@ +export const parameters = { + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + options: { + storySort: (a, b) => { + return a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, { numeric: true }); + } + }, +}; \ No newline at end of file diff --git a/packages/storybook-static/package.json b/packages/storybook-static/package.json new file mode 100644 index 00000000..8777d1ee --- /dev/null +++ b/packages/storybook-static/package.json @@ -0,0 +1,40 @@ +{ + "name": "react-babylonjs-storybook-static", + "private": "true", + "version": "0.0.1", + "description": "stories for react-babylonjs", + "main": "index.js", + "scripts": { + "lint": "echo noop", + "lint:fix": "echo noop", + "start": "start-storybook -p 6006 -s ./storyboard-site", + "build-storybook": "build-storybook -o storybook-static -s ./storyboard-site" + }, + "devDependencies": { + "@babel/core": "^7.16.0", + "@babylonjs/inspector": "^4.2.0", + "@babylonjs/loaders": "^4.2.0", + "@babylonjs/materials": "^4.2.0", + "@babylonjs/procedural-textures": "^4.2.0", + "@inlet/react-pixi": "^6.6.5", + "@storybook/addon-storysource": "^6.3.12", + "@storybook/react": "^6.3.12", + "@storybook/theming": "^6.3.12", + "babel-loader": "8.2.3", + "cannon": "^0.6.2", + "chroma-js": "^2.1.0", + "earcut": "^2.2.2", + "gsap": "^3.6.1", + "honeycomb-grid": "^3.1.7", + "lerp": "^1.0.3", + "pixi-projection": "^0.4.2", + "pixi.js": "^6.1.2", + "react-babylon-spring": "^1.0.2", + "zustand": "^3.6.4" + }, + "dependencies": { + "react": "^17.0.2", + "react-babylonjs": "*", + "react-dom": "^17.0.2" + } +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/animation.stories.js b/packages/storybook-static/stories/babylonjs/Basic/animation.stories.js new file mode 100644 index 00000000..c56251e3 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/animation.stories.js @@ -0,0 +1,98 @@ +import React, { useEffect, useRef } from 'react' +import { Vector3, Animation } from '@babylonjs/core'; +import { Engine, Scene, useScene } from 'react-babylonjs' +import '../../style.css'; + +export default { title: 'Babylon Basic' }; + +/** + * This is for optimizing animation when first mount application. + * But this story works well,Animation is smooth。 + */ +function WithAnimation() { + // console.time('Timing'); + + const groupRef = useRef(null); + const scene = useScene(); + + const position = Vector3.Zero(); + + const playAnimation = () => { + if (groupRef.current) { + const group = groupRef.current; + const animations = getSlideUpAnimation(position, -2); + const animatable = scene.beginDirectAnimation(group, animations, 0, 120, true); + // console.timeLog('Timing', 'beginAnimation'); + } + }; + + useEffect(_ => { + // console.timeLog('Timing', 'useEffect'); + playAnimation(); + }, []); + + const onCreated = _ => { + // console.timeLog('Timing', 'onCreated'); + }; + + const spheres = getSpheres(10); + + return ( + + {spheres} + + ) +} + +function getSpheres(count) { + const results = []; + + for (let i = -count / 2; i < count / 2; i++) { + for (let j = -count / 2; j < count / 2; j++) { + const key = `sphere-${i}-${j}`; + results.push( + + ) + } + } + + return results; +} + +function getSlideUpAnimation(position, offsetY) { + const { y } = position; + + const keys = [{ + frame: 0, + value: y + offsetY, + }, { + frame: 60, + value: y + }, { + frame: 120, + value: y + offsetY + }]; + + const animation = new Animation( + 'animation', "position.y", + 60, 0, 1 + ); + animation.setKeys(keys); + + return [animation]; +} + + +export const Animations = () => ( +
+ + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/babylonBasic.stories.js b/packages/storybook-static/stories/babylonjs/Basic/babylonBasic.stories.js new file mode 100644 index 00000000..a569cf95 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/babylonBasic.stories.js @@ -0,0 +1,45 @@ +import React, { useEffect, useRef } from 'react'; +import { Engine, Scene, useScene } from 'react-babylonjs'; +import { Color3 } from '@babylonjs/core/Maths/math.color'; +import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const rpm = 5; +const MovingBox = (props) => { + // access Babylon Scene + const scene = useScene(); + // access refs to Babylon objects in scene like DOM nodes + const boxRef = useRef(null); + + // there is also a built-in hook called useBeforeRender that does will do this: + useEffect(() => { + if (boxRef.current) { + const handler = scene.registerBeforeRender(() => { + let deltaTimeInMillis = scene.getEngine().getDeltaTime(); + boxRef.current.rotation[props.rotationAxis] += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)) + }) + return (() => { + scene.unregisterBeforeRender(handler); + }) + } + }, [boxRef.current]); + + return ( + + ); +} + +export const DefaultPlayground = () => ( +
+ + + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/contextBridge.stories.js b/packages/storybook-static/stories/babylonjs/Basic/contextBridge.stories.js new file mode 100644 index 00000000..4eec3d87 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/contextBridge.stories.js @@ -0,0 +1,52 @@ +import React from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const ThemeContext = React.createContext({ + color: Color3.Red(), + posigion: Vector3.Zero(), + name: 'default context' +}); + +const ThemedBox = () => { + const ctx = React.useContext(ThemeContext); + return ( + + + + ); + }; + +const EngineScene = () => ( +
+ + {value => ( + + + + + + + + + + + )} + +
+) + +export const BridgedContext = () => ( + + + +); \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Basic/customMeshes.stories.js b/packages/storybook-static/stories/babylonjs/Basic/customMeshes.stories.js new file mode 100644 index 00000000..e7b81fb1 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/customMeshes.stories.js @@ -0,0 +1,76 @@ +import React, { useState } from 'react' +import { Engine, Scene, useScene } from 'react-babylonjs' +import { Mesh, VertexData, Vector3 } from '@babylonjs/core'; +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const CustomMesh = (props) => { + const scene = useScene(); + + const [customMesh] = useState(() => { + const meshInstance = new Mesh(props.name, scene); + + //Set arrays for positions and indices + var positions = [-5, 2, -3, -7, -2, -3, -3, -2, -3, 5, 2, 3, 7, -2, 3, 3, -2, 3]; + var indices = [0, 1, 2, 3, 4, 5]; + var colors = [1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1]; + + //Empty array to contain calculated values + var normals = []; + + var vertexData = new VertexData(); + VertexData.ComputeNormals(positions, indices, normals); + + //Assign positions, indices and normals to vertexData + vertexData.positions = positions; + vertexData.indices = indices; + vertexData.normals = normals; + vertexData.colors = colors; + + //Apply vertexData to custom mesh + vertexData.applyToMesh(meshInstance); + + return meshInstance; + }) + + return ( + + + + ) +} + +export const CustomMeshes = () => { + const [displayLast, setDisplayLast] = useState(true); + const toggleDisplay = () => { + setDisplayLast(cur => !cur); + }; + return ( + <> +
+ +
+
+ + + + + + + + { displayLast && + + } + + +
+ + ) +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/dynamicTerrain.stories.js b/packages/storybook-static/stories/babylonjs/Basic/dynamicTerrain.stories.js new file mode 100644 index 00000000..916415da --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/dynamicTerrain.stories.js @@ -0,0 +1,45 @@ +import React from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3, Color4 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const xSize = 500 +const zSize = 500 +const subSize = 100 + +const getMapData = () => { + let mapSubX = xSize + let mapSubZ = zSize + + // map creation + let mapData = new Float32Array(mapSubX * mapSubZ * 3) + for (var l = 0; l < mapSubZ; l++) { + for (var w = 0; w < mapSubX; w++) { + mapData[3 * (l * mapSubX + w)] = (w - mapSubX * 0.5) * 2.0 + mapData[3 * (l * mapSubX + w) + 1] = w / (l + 1) * Math.sin((l + 1) / 2) * Math.cos(w / 2) * 2.0 + mapData[3 * (l * mapSubX + w) + 2] = (l - mapSubZ * 0.5) * 2.0 + } + } + return mapData +} + +const WithDynamicTerrain = () => ( + + + + + + + + + +) + + +export const DynamicTerrain = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/edgesRendering.stories.js b/packages/storybook-static/stories/babylonjs/Basic/edgesRendering.stories.js new file mode 100644 index 00000000..a6b07372 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/edgesRendering.stories.js @@ -0,0 +1,36 @@ +import React from 'react' +import { Vector3, Color4 } from '@babylonjs/core'; +import '@babylonjs/core/Rendering/edgesRenderer' // You this need for side-effects +import { Engine, Scene } from 'react-babylonjs' +import '../../style.css'; + +export default { title: 'Babylon Basic' }; + +/** + * https://www.babylonjs-playground.com/#TYAHX#10 + */ +export const EdgesRendering = () => ( +
+ + + + + box.enableEdgesRendering()} + edgesWidth={4} + size={2} + position={new Vector3(0, 1.2, 0)} + edgesColor={new Color4(0, 0, 1, 1)} + /> + g.enableEdgesRendering()} + edgesWidth={3} + width={6} + height={6} + subdivisions={1} + /> + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/engineView.stories.js b/packages/storybook-static/stories/babylonjs/Basic/engineView.stories.js new file mode 100644 index 00000000..ed26f597 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/engineView.stories.js @@ -0,0 +1,102 @@ +import React, { useRef } from 'react' +import '@babylonjs/inspector' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const size = 2; +const shade = 0; + +const BoxWithArrows = ({ position }) => { + return ( + + + + + ) +} + +const MultiCanvas = ({secondCanvas}) => { + const freeCameraRef = useRef(undefined); + return ( + <> + + + + + + + + + {(secondCanvas && secondCanvas.current !== null) && + + } + + ) +} + +export const EngineView = () => { + const secondCanvasRef = useRef(null); + return ( +
+
+ + + + + +
+
+ +
+
+ ); +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/fromInstance.stories.js b/packages/storybook-static/stories/babylonjs/Basic/fromInstance.stories.js new file mode 100644 index 00000000..2cf6c24a --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/fromInstance.stories.js @@ -0,0 +1,56 @@ +import React, { useState, useMemo } from 'react' +import { Engine, Scene, useScene } from 'react-babylonjs' +import { Vector3, Color3, MeshBuilder } from '@babylonjs/core' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const MyMesh = (props) => { + const [mesh, setMesh] = useState(null); + const scene = useScene(); + useMemo(() => { + console.log('creating a box with scene', scene); + setMesh(MeshBuilder.CreateBox('test', { size: 1 }, scene)); + }, []); + + return ( + <> + {mesh && + + + + } + + ) +} + +export const FromInstance = () => { + const [rotation, setRotation] = useState(new Vector3(0, 0, 0)); + const addRotation = () => { + setRotation((state) => new Vector3(0, rotation.y + Math.PI / 4, 0)); + }; + + return ( +
+ + + + + + + + +
+ ); +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/gizmo.stories.js b/packages/storybook-static/stories/babylonjs/Basic/gizmo.stories.js new file mode 100644 index 00000000..f51917dd --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/gizmo.stories.js @@ -0,0 +1,30 @@ +import React from 'react'; +import { Engine, Scene } from 'react-babylonjs'; +import { Color3 } from '@babylonjs/core/Maths/math.color'; +import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import '../../style.css' + +// export default { title: 'Babylon Basic' }; + +const GizmoBox = ({position, color} = props) => ( + + + + +) + +// broken in 4.2 - works in 5.0 +const Gizmo = () => ( +
+ + + + + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/gizmoManager.stories.js b/packages/storybook-static/stories/babylonjs/Basic/gizmoManager.stories.js new file mode 100644 index 00000000..68602277 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/gizmoManager.stories.js @@ -0,0 +1,54 @@ +import React, { useEffect, useState } from 'react'; +import { Engine, Scene, useScene } from 'react-babylonjs'; +import { Color3 } from '@babylonjs/core/Maths/math.color'; +import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import '../../style.css' + +// export default { title: 'Babylon Basic' }; + +const Inspector = () => { + const scene = useScene(); + scene.debugLayer.show(); + return null; +} + +// broken in 4.2 - works in 5.0 +const GizmoManager = () => { + const [lightRef, setLightRef] = useState(undefined); + + useEffect(() => { + console.log('light has been set', lightRef); + }, [lightRef]) + return ( +
+ + + + + + + + + + + + + + + + + + + + + +
+ ) +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Basic/instances.stories.js b/packages/storybook-static/stories/babylonjs/Basic/instances.stories.js new file mode 100644 index 00000000..35b1687b --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/instances.stories.js @@ -0,0 +1,90 @@ +import React, { useState, useCallback } from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3, Color4 } from '@babylonjs/core' +import { defineGrid, extendHex } from 'honeycomb-grid' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const GRID_WIDTH = 60; +const GRID_HEIGHT = 40; +const HOVER_COLOR = new Color4(0.8, 0.8, 0.8, 1); + +export const Instances = () => { + const [_, setState] = useState(false); + const createUpdate = () => { + setState((state) => !state); + }; + + // const hexRef = useRef>(null); + const [hexMesh, setHexMesh] = useState(null); + const hexRef = useCallback((node) => { + if (node) { + const mesh = node; + mesh.registerInstancedBuffer("color", 4); + setHexMesh(mesh); + } + }, []); + + const Hex = extendHex({ + size: 1, // default: 1 + orientation: 'flat', // default: 'pointy' + color: new Color4(0, 0.68, 1), + hovered: false + }) + + // create a Grid factory that uses the Hex factory: + const Grid = defineGrid(Hex) + + // create a rectangle grid with each tile assigned a random color: + const grid = Grid.rectangle({ width: GRID_WIDTH, height: GRID_HEIGHT, onCreate: (hex) => { + hex.color = new Color4(Math.random(), Math.random(), Math.random(), 1); + hex.isHovered = Math.random() < 0.1; + } }) + + return ( +
+ + + + + + + {hexMesh && + Array.from(grid.entries()).map(entry => { + const [i, tile] = entry; + const {x, y} = tile.toPoint(); + console.log(`${i}->{${x},${y}} (${tile.width()})`) + return ( + + ) + }) + } + + +
+ ); + } diff --git a/packages/storybook-static/stories/babylonjs/Basic/portal.stories.js b/packages/storybook-static/stories/babylonjs/Basic/portal.stories.js new file mode 100644 index 00000000..4fbbf87d --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/portal.stories.js @@ -0,0 +1,54 @@ +import React, { useEffect, useRef, useState } from 'react'; +import '@babylonjs/inspector'; +import { Engine, Scene, useBeforeRender, createPortal } from '../../../../dist/react-babylonjs'; +import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import { Color3 } from '@babylonjs/core/Maths/math.color'; +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const rpm = 5; + +function WithCreatePortal() { + const transformNodeRef = useRef(null); + const [_, setReady] = useState(false); + + useBeforeRender((scene) => { + if (transformNodeRef.current !== null) { + const deltaTimeInMillis = scene.getEngine().getDeltaTime(); + transformNodeRef.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }) + + useEffect(() => { + console.log('trigger re-render when transform node is set.'); + setReady(true); + }, [transformNodeRef.current]) + + return ( + <> + {(transformNodeRef.current) && + createPortal( + + , transformNodeRef.current['__rb_createdInstance']) + } + + + + + ) +} + +export const CreatePortal = () => ( +
+ + + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/shapes.stories.js b/packages/storybook-static/stories/babylonjs/Basic/shapes.stories.js new file mode 100644 index 00000000..9a45b8d9 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/shapes.stories.js @@ -0,0 +1,97 @@ +import React, { useCallback } from 'react' +import '@babylonjs/inspector' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3, CSG, Mesh, MeshBuilder, StandardMaterial } from '@babylonjs/core' +import * as Earcut from 'earcut'; +import "@babylonjs/core/Meshes/meshBuilder"; +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +//Polygon shape in XoZ plane +var starPath = [ + new Vector3(4, 0, -4), + new Vector3(2, 0, 0), + new Vector3(5, 0, 2), + new Vector3(1, 0, 2), + new Vector3(-5, 0, 5), + new Vector3(-3, 0, 1), + new Vector3(-4, 0, -4), + new Vector3(-2, 0, -3), + new Vector3(2, 0, -3) +]; + +//Holes in XoZ plane +var holes = [ + [ + new Vector3(1, 0, -1), + new Vector3(1.5, 0, 0), + new Vector3(1.4, 0, 1), + new Vector3(0.5, 0, 1.5) + ], [ + new Vector3(0, 0, -2), + new Vector3(0.5, 0, -1), + new Vector3(0.4, 0, 0), + new Vector3(-1.5, 0, 0.5) + ] +]; + +let scene = null; +const onSceneMounted = (sceneEventArgs) => { + scene = sceneEventArgs.scene; +} + +const Shapes = () => { + const ref = useCallback(node => { + if (node) { + const csg = CSG.FromMesh(node); + console.log('csg:', csg); + const sphere = MeshBuilder.CreateSphere('circle', { + diameter: 3 + }, scene); + sphere.position.x -= 2 + let res = csg.subtract(CSG.FromMesh(sphere)) + + let csgMeshMaterial = new StandardMaterial('material01', scene); + csgMeshMaterial.diffuseColor = Color3.Yellow() + csgMeshMaterial.specularColor = Color3.Black() + let mesh = res.toMesh('base', csgMeshMaterial, scene, false); + mesh.position.y += 4; + sphere.dispose() + } + }, []); + + return ( + + + + + + + + + + ) +} + +export const ExtrudeShapesPlusCSG = () => ( +
+ +
+) + +ExtrudeShapesPlusCSG.story = { + name: 'Extrude (+CSG)', + parameters: + { + notes: 'Extrude Shape and *Constructive Solid Geometry* (CSG). There are no plans to integrate CSG declaratively yet.' + } +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Basic/skybox.stories.js b/packages/storybook-static/stories/babylonjs/Basic/skybox.stories.js new file mode 100644 index 00000000..f6d6af17 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/skybox.stories.js @@ -0,0 +1,59 @@ +import React, { useState } from 'react' +import '@babylonjs/inspector' +import { Engine, Scene, Skybox } from 'react-babylonjs' +import { Vector3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +let globalIndex = 0 // due to closure and how observables are assigned. +const SkyboxScenes = [{ + name: 'sunny day', + texture: `assets/textures/TropicalSunnyDay` +}, { + name: 'specular HDR', + texture: `assets/textures/SpecularHDR.dds` +}] + +function WithSkybox () { + const [skyboxIndex, setIndex] = useState(0) + globalIndex = skyboxIndex + + return ( + + + + + + + + { + Array.from(new Array(50), (_, index) => index).map(number => { + return ( + setIndex(globalIndex + 1)} + /> + ) + }) + } + + + + + ) +} + +export const Skybox3D = () => ( +
+ +
+) + +Skybox3D.story = { + name: 'Skybox 3D' +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/snippetMaterial.stories.js b/packages/storybook-static/stories/babylonjs/Basic/snippetMaterial.stories.js new file mode 100644 index 00000000..25e7723e --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/snippetMaterial.stories.js @@ -0,0 +1,96 @@ +import React, { useState, useCallback, useEffect } from 'react' +import { Vector3, NodeMaterial, Color3 } from '@babylonjs/core'; +import { Texture } from "@babylonjs/core/Materials/Textures/texture"; +import '@babylonjs/core/Rendering/edgesRenderer' // You this need for side-effects +import { Engine, Scene, useScene } from 'react-babylonjs' + +import '../../style.css'; + +export default { title: 'Babylon Basic' }; + +const setBlockValue = ( + name, + value, + material +) => { + if (value instanceof Texture) { + let textureBlock = material.getTextureBlocks().find((b) => b.name === name); + if (textureBlock !== undefined) { + textureBlock.texture = value; + } + } else { + let block = material.getInputBlockByPredicate((b) => b.name === name); + if (block !== null) { + block.value = value; + } + } +}; + +const SnippetMaterialById = ({ snippetId, name, blockValues, freeze }) => { + const scene = useScene(); + const [material, setMaterial] = useState(null); + const parseMaterial = useCallback(async () => { + NodeMaterial.ParseFromSnippetAsync(snippetId, scene).then( + (nodeMaterial) => { + if (material !== null && freeze === true) { + material.freeze(); + } + setMaterial(nodeMaterial); + } + ); + }, [snippetId, scene]); + + useEffect(() => { + if (material) { + if (freeze === true && material.isFrozen) { + material.unfreeze(); + } + blockValues.forEach((entry) => { + setBlockValue(entry.name, entry.value, material) + }) + if (freeze === true) { + material.freeze(); + } + } + }, [blockValues]); + + useEffect(() => { + parseMaterial(); + }, [parseMaterial]); + + return material === null ? null : ( + + ); +}; + +const colors = ["Red", "Green", "Yellow"] + +export const SnippetMaterial = () => { + const [selectedColor, setSelectedColor] = useState("Green"); + const onChange = (e) => { + setSelectedColor(e.target.value); + } + return ( + <> +
+ +
+
+ + + + + + + + + + +
+ + ) +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/toggleMesh.stories.js b/packages/storybook-static/stories/babylonjs/Basic/toggleMesh.stories.js new file mode 100644 index 00000000..c6f20fae --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/toggleMesh.stories.js @@ -0,0 +1,72 @@ +import React, { useState } from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3 } from '@babylonjs/core/Maths/math' +import '../../style.css' +import { Color3 } from "@babylonjs/core"; +import ScaledModelWithProgress from "../ScaledModelWithProgress"; + +export default { title: 'Babylon Basic' }; + +/** + * To fix two bugs when toggle meshes: + * 1. model's mesh can't be destroyed. + * 2. `removeChildFromContainer()` only destroy babylon instance. + * The model is rootAbstractMesh's and Parent's child. + * `container.rootInstance.children` will be very large after few toggles. + */ + + +function WithToggleMesh() { + const [isShown, toggleShown] = useState(true); + + const onClick = () => { + console.log('toggle clicked:', isShown); + toggleShown(isShown => !isShown) + }; + + return ( + <> + {isShown && + + + + + + + + } + + + + + + + + + + + + ) +} + +export const ToggleMesh = () => ( +
+ + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/toggleScene.stories.js b/packages/storybook-static/stories/babylonjs/Basic/toggleScene.stories.js new file mode 100644 index 00000000..991d399e --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/toggleScene.stories.js @@ -0,0 +1,90 @@ +import React, {useState} from 'react' +import {Engine, Scene, useScene} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' +import {Color3} from "@babylonjs/core"; + +export default { title: 'Babylon Basic' }; + +const FullScreenButton = (props) => { + const [currentShape, setCurrentShape] = props.shapeState; + const scene = useScene(); + scene.debugLayer.show(); + const onClick = _ => { + setCurrentShape(currentShape => { + console.log('toggling current shape', currentShape); + return currentShape === 'spheres' ? 'squares' : 'spheres'; + }) + }; + + return ( + + + + + + + + + + ) +} + +const SphereScene = (props) => ( + + + + + {[-4,-2,0,2,4].map(number => ( + + )) + } + +) + +const SquareScene = (props) => ( + + + + + {[-4,-2,0,2,4].map(number => ( + + )) + } + +) + +export const ToggleScene = () => { + const shapeState = useState('spheres'); + + return ( +
+ + {(shapeState[0] === 'spheres') && + + } + {(shapeState[0] === 'squares') && + + } + +
+ ); +} diff --git a/packages/storybook-static/stories/babylonjs/Basic/transformNode.stories.js b/packages/storybook-static/stories/babylonjs/Basic/transformNode.stories.js new file mode 100644 index 00000000..7f3eabfc --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/transformNode.stories.js @@ -0,0 +1,67 @@ +import React, {useEffect, useState} from 'react' +import '@babylonjs/inspector' +import {Engine, Scene} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +let lastTime = Date.now(); + +function WithTransformNode() { + const [position, setPosition] = useState(Vector3.Zero()); + const [rotation, setRotation] = useState(Vector3.Zero()); + + let timer; + let direction = 1; + + const animate = _ => { + if (position.x > 1) { + direction = -1; + } else if (position.x < -1) { + direction = 1; + } + + const velocity = 0.005 * direction; + position.x += velocity; + const rpm = 10; + const now = Date.now() + const deltaTimeInMillis = now - lastTime; + lastTime = now; + const rotationRads = ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + rotation.y += rotationRads; + setPosition(position.clone()); + setRotation(rotation.clone()); + timer = requestAnimationFrame(animate); + }; + + useEffect(() => { + timer = requestAnimationFrame(animate); + return () => cancelAnimationFrame(timer); + }, []); + + return ( + + + + + + + + + + + + + + ) +} + +export const TransformNode = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/Basic/viewport.stories.js b/packages/storybook-static/stories/babylonjs/Basic/viewport.stories.js new file mode 100644 index 00000000..a3cf51b2 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Basic/viewport.stories.js @@ -0,0 +1,98 @@ +import React from 'react' +import '@babylonjs/inspector' +import { Engine, Scene, useScene } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Babylon Basic' }; + +const size = 2; +const shade = 0; + +const BoxWithArrows = ({ position }) => { + return ( + + + + + ) +} + +const MultiViewport = () => { + const scene = useScene(); + + const alwaysActive = (camera) => { + scene.activeCameras = [...(scene.activeCameras || []), camera]; + } + return ( + <> + + + + + + + + + + + + + ) +} + +export const Viewport = () => ( +
+ + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/Behaviors/dragNdrop.stories.js b/packages/storybook-static/stories/babylonjs/Behaviors/dragNdrop.stories.js new file mode 100644 index 00000000..5b28aea2 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Behaviors/dragNdrop.stories.js @@ -0,0 +1,72 @@ +import React, { useEffect, useState, useRef } from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Behaviors' }; + +// insipiration demo: https://www.babylonjs.com/demos/dragndrop/dragdrop.js +const GROUND_SIZE = 1000; +const validateDrag = (targetPosition) => { + return Math.max(Math.abs(targetPosition.x), Math.abs(targetPosition.z)) <= (GROUND_SIZE / 2) - 10; // should be -15 for torus +} + +export const DragNDrop = () => { + const red = useRef(0); + const [pointLightDiffuse, setPointLightDiffuse] = useState(new Color3(red.current, 0.5, 0.5)); + + useEffect(() => { + const handle = setInterval(() => { + red.current = (red.current + 0.1) % 1; + setPointLightDiffuse(new Color3(red.current, 0.5, 0.5)); + }, 1000); + return () => clearInterval(handle); + }, []) + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +DragNDrop.story = { + name: "Drag 'n' Drop", + parameters: { + notes: { + markdown: `Often the declarative version can be much simpler! + + Here is the reference playground: [link](https://www.babylonjs.com/demos/dragndrop/dragdrop.js)` + } + } +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Behaviors/pointerDragBehavior.stories.js b/packages/storybook-static/stories/babylonjs/Behaviors/pointerDragBehavior.stories.js new file mode 100644 index 00000000..74804369 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Behaviors/pointerDragBehavior.stories.js @@ -0,0 +1,42 @@ +import React from 'react' +import {Engine, Scene} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Behaviors' }; + +/** + * official demo: + * https://www.babylonjs-playground.com/#YEZPVT + * + * TODO: camera autoAttaching? + */ + +function WithPointerDragBehavior() { + return ( + <> + + console.log('dragStart')} + onDragObservable={_ => console.log('drag')} + onDragEndObservable={_ => console.log('dragEnd')}/> + + + + ) +} + +export const PointerDragBehavior = () => ( +
+ + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/GUI/grid.stories.js b/packages/storybook-static/stories/babylonjs/GUI/grid.stories.js new file mode 100644 index 00000000..4150eac2 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/GUI/grid.stories.js @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from 'react'; +import { Vector3 } from '@babylonjs/core'; +import { Engine, Scene, useScene } from 'react-babylonjs'; + +import '../../style.css'; +import { ValueAndUnit } from '@babylonjs/gui/2D/valueAndUnit'; + +export default { title: 'GUI' }; + +const FullScreen = () => { + // should run on latest alphas of BabylonJS 5.0 alpha 63+ + // https://github.com/BabylonJS/Babylon.js/pull/11569 + // https://playground.babylonjs.com/#0ZVTMY + // const direction = useRef(1); + // const [low, setLow] = useState(0.5); + + // useEffect(() => { + // const handle = setInterval(() => { + // setLow(cur => { + // const next = cur + (0.1 * direction.current); + // console.log('next:', next); + // if (next < 0.1 || next > 0.9) { + // direction.current *= -1; + // } + // return next; + // }) + // }, 1000); + + // return () => { + // clearInterval(handle); + // } + // }, []) + + const [background, setBackground] = useState('black'); + useEffect(() => { + const handle = setInterval(() => { + setBackground(cur => cur === 'black' ? '#222222' : 'black') + }, 1000); + + return () => { + clearInterval(handle); + } + }, []) + + + return ( + + + + + + + + + + + + + + + + ) +} + +export const Grid = () => ( +
+ + + + + + + +
+) + +Grid.story = { + name: "Grid" +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/GUI/gui.stories.js b/packages/storybook-static/stories/babylonjs/GUI/gui.stories.js new file mode 100644 index 00000000..f4e932b7 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/GUI/gui.stories.js @@ -0,0 +1,146 @@ +import React, { useRef, useCallback } from 'react' +import '@babylonjs/inspector' +import {Engine, Scene} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' +import {Control} from '@babylonjs/gui'; + +export default { title: 'GUI' }; + + +/** + * official example + * https://www.babylonjs-playground.com/#3VMTI9#0 + */ + +/** + * TODO: other gui、mesh link、 + */ + +/** + * 2d GUI demos + * @return {*} + * @constructor + */ +function WithGUI() { + // const lineRef = useRef(null) + const sphere1Ref = useRef(null); + const label1Ref = useRef(null); + const sphere2Ref = useRef(null); + const label2Ref = useRef(null); + const sphere3Ref = useRef(null); + const label3Ref = useRef(null); + const sphere4Ref = useRef(null); + const label4Ref = useRef(null); + const sphere5Ref = useRef(null); + const label5Ref = useRef(null); + const sphere6Ref = useRef(null); + const label6Ref = useRef(null); + const sphere7Ref = useRef(null); + const lineRef = useRef(null); + const label7Ref = useRef(null); + + const refLookup = { + '1': { + sphere: sphere1Ref, + label: label1Ref + }, + '2': { + sphere: sphere2Ref, + label: label2Ref + }, + '3': { + sphere: sphere3Ref, + label: label3Ref + }, + '4': { + sphere: sphere4Ref, + label: label4Ref + }, + '5': { + sphere: sphere5Ref, + label: label5Ref + }, + '6': { + sphere: sphere6Ref, + label: label6Ref + }, + '7': { + sphere: sphere7Ref, + label: label7Ref + } + } + + const onFullScreenRef = useCallback(ref => { + const line = lineRef.current + + try { + line.linkWithMesh(sphere7Ref.current); + line.connectedControl = label7Ref.current; + + + [1,2,3,4,5,6].forEach((i) => { + const lookup = refLookup[i.toString()]; + lookup.label.current.linkWithMesh(lookup.sphere.current) + }) + } catch (e) { + console.error(e) + } + }); + + return ( + + + + + + + + + + + + + + + + {/**/} + {/* */} + + {/**/} + + {[1,2,3,4,5,6,7].map((i) => + + + + ) + + } + + + + + + + ) +} + +export const GUIFullScreen = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/GUI/html.stories.js b/packages/storybook-static/stories/babylonjs/GUI/html.stories.js new file mode 100644 index 00000000..c57d02b0 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/GUI/html.stories.js @@ -0,0 +1,64 @@ +import React, { useEffect, useState } from 'react'; +import { Engine, Scene, Html } from 'react-babylonjs'; +import { Vector3 } from '@babylonjs/core/Maths/math'; +import '../../style.css'; + +export default { title: 'GUI' }; + +let lastTime = Date.now(); + +function WithHtmlText() { + const [position, setPosition] = useState(Vector3.Zero()); + const [rotation, setRotation] = useState(Vector3.Zero()); + + let timer; + let direction = 1; + + const animate = _ => { + if (position.x > 1) { + direction = -1; + } else if (position.x < -1) { + direction = 1; + } + + const velocity = 0.005 * direction; + position.x += velocity; + const rpm = 10; + const now = Date.now() + const deltaTimeInMillis = now - lastTime; + lastTime = now; + const rotationRads = ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + rotation.y += rotationRads; + setPosition(position.clone()); + setRotation(rotation.clone()); + timer = requestAnimationFrame(animate); + }; + + useEffect(() => { + timer = requestAnimationFrame(animate); + return () => cancelAnimationFrame(timer); + }, []); + + return ( + + + + {
Text
} + +
+
+ ) +} + +export const HtmlText = () => ( +
+ + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/GUI/with2DGUI.stories.js b/packages/storybook-static/stories/babylonjs/GUI/with2DGUI.stories.js new file mode 100644 index 00000000..cc9ea5b7 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/GUI/with2DGUI.stories.js @@ -0,0 +1,248 @@ +import React, { Component } from 'react' +import { Vector3, Color3, Color4, Animation, ExponentialEase, EasingFunction, Texture } from '@babylonjs/core' +import { Control } from '@babylonjs/gui' +import { Engine, Scene } from 'react-babylonjs' + +import '../../style.css' + +export default { title: 'GUI' }; + +const DEFAULT_BOXES = [{ + name: 'red', + position: new Vector3(-2.5, 1, 0), + color: Color3.Red(), + index: 1 +}, { + name: 'green', + position: new Vector3(2.5, 1, 0), + color: Color3.Green(), + index: 2 +}, { + name: 'blue', + position: new Vector3(0, 1, 0), + color: Color3.Blue(), + index: 3 +}]; + +class UIComponent extends Component { + constructor() { + super() + + this.state = { + plane: undefined, + showModal: false, + clickMeshName: undefined, + boxes: DEFAULT_BOXES, + sceneClearColor: new Color4(0.5, 0.5, 0.5, 0.5) + } + + this.meshPicked = this.meshPicked.bind(this); + this.setPlane = this.setPlane.bind(this); + this.deleteSelectedMesh = this.deleteSelectedMesh.bind(this); + // TODO: fix that bind() is needed on assignment on button pointerDown handlers + } + + meshPicked(mesh) { + const matchingBox = this.state.boxes.find(box => box.name === mesh.name); + if (matchingBox !== undefined) { + const clickedMeshName = mesh.name + let clickedMeshColor = matchingBox.color.toHexString(); + let sceneClearColor = Color4.FromColor3(matchingBox.color, 0.5); + + this.setState((state) => ({ + ...state, + showModal: true, + clickedMeshName, + clickedMeshColor, + sceneClearColor, + })) + } else { + console.log('ignoring clicks on:', mesh.name, this.state) + } + } + + deleteSelectedMesh() { + const newBoxes = this.state.boxes.filter(box => box.name !== this.state.clickedMeshName) + this.setState((state) => ({ + ...state, + sceneClearColor: new Color4(0.5, 0.5, 0.5, 0.5), + boxes: newBoxes + })) + + // They're all 'deleted'. Recreate them after a delay. + if (newBoxes.length === 0) { + console.log('recreating boxes in 2.5 seconds'); + let that = this; + window.setTimeout(() => { + that.setState((state) => ({ + ...state, + boxes: DEFAULT_BOXES + })) + }, 2500); + } + + this.hideModal() + } + + hideModal() { + let { plane } = this.state; + if (!plane) { + return; + } + + let keys = [] + keys.push({ frame: 0, value: 1 }); + keys.push({ frame: 10, value: 0 }); + + var animationClose = new Animation( + 'tv-off-1984', + 'scaling.x', + 10, + Animation.ANIMATIONTYPE_FLOAT, + Animation.ANIMATIONLOOPMODE_CONSTANT + ); + animationClose.setKeys(keys); + + let easingFunction = new ExponentialEase(9.7); // BABYLON.QuarticEase() + easingFunction.setEasingMode(EasingFunction.EASINGMODE_EASEINOUT); + animationClose.setEasingFunction(easingFunction); + + plane.animations.push(animationClose); + plane._scene.beginAnimation(plane, 0, 100, false, 1, () => { + plane.dispose(); + this.setState((state) => ({ + ...state, + showModal: false, + plane: undefined, + sceneClearColor: new Color4(0.5, 0.5, 0.5, 0.5) + })) + }); + } + + setPlane(plane) { + this.setState((state) => ({ + ...state, + plane + })) + + if (plane._scene && plane._scene.activeCamera) { + let { activeCamera } = plane._scene + + window.setTimeout(() => { + // we only need this hack because of storybook? + let forwardRayDirection = activeCamera.getForwardRay().direction + plane.position = activeCamera.position.add(forwardRayDirection.scale(1.5 / activeCamera.fov /* * forwardRay.length */)) + plane.lookAt(activeCamera.position, 0, Math.PI, Math.PI) + }, 10); + } + } + + render() { + let dialogWidth = 3 + let dialogHeight = 1 + + // (for testing insertBefore in react-reconciler - and put in a hosted element like the light). + // boxes.sort((a, b) => a.index - b.index); + + return ( + + + { + let { plane } = this.state + + if (plane) { + let forwardRay = camera.getForwardRay() + plane.position = camera.position.clone().add(forwardRay.direction.scale(1.5 / camera.fov /* * forwardRay.length */)) + plane.lookAt(camera.position, 0, Math.PI, Math.PI) + } + }} + /> + + {this.state.boxes.map(box => ( + + + + )) + } + + {this.state.showModal === true && + + + + + + + + + + + + + + + + { + this.state.boxes.map(box => ( + + )) + } + + + + + + + + + + + + + + + } + + + + ) + } +} + +export const With2DUI = () => ( +
+ +
+) + +With2DUI.story = { + name: "2D UI" +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Hooks/hooks.stories.js b/packages/storybook-static/stories/babylonjs/Hooks/hooks.stories.js new file mode 100644 index 00000000..914ea21f --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Hooks/hooks.stories.js @@ -0,0 +1,109 @@ +import React, { useContext, useRef } from 'react' +import { Engine, Scene, EngineCanvasContext , SceneContext, useBeforeRender } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Hooks' }; + +const ContextLogger = (props, context) => { + console.log('Direct access to context depending on where declared yields different results. Using hooks directly useScene, useEngine, useCanvas is easier.'); + const ctx = useContext(EngineCanvasContext) + console.log(`ctx-logger "${props.id}" BabylonJSContext is:`, ctx) + + const ctx2 = useContext(SceneContext) + console.log(`ctx-logger "${props.id}" SceneContext is:`, ctx2) + return null; +} + +const size = 2; +const shade = 0; +const rpm = 10; + +const RotatingBox = ({position}) => { + const centerTransform = useRef(null); + useBeforeRender((scene) => { + if (centerTransform.current !== null) { + const deltaTimeInMillis = scene.getEngine().getDeltaTime(); + centerTransform.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }) + + return ( + + + + + ) +} + +const RotatingBoxScene = (props) => ( + <> + + + + + + +) + +export const RenderHooksStory = () => ( +
+ + + + + + + +
+) + +RenderHooksStory.story = { + name: 'useBeforeRender' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Hooks/more-hooks.stories.js b/packages/storybook-static/stories/babylonjs/Hooks/more-hooks.stories.js new file mode 100644 index 00000000..1c44c44c --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Hooks/more-hooks.stories.js @@ -0,0 +1,53 @@ +import React from 'react'; +import { Engine, Scene, useEngine, useCanvas, useScene } from 'react-babylonjs' +import { Vector3 } from '@babylonjs/core' + +export default { title: 'Hooks' }; + +const MyScene = () => { + const engine = useEngine(); + const canvas = useCanvas(); + const scene = useScene(); + + // engine and canvas were null. Although not currently "bridged", the hooks check contexts on each side of renderer. + // https://github.com/konvajs/react-konva/issues/188#issuecomment-478302062 + console.log('MyScene', { engine, canvas, scene }) + + return ( + <> + + + + + ) +} + +const EngineChild = () => { + const engine = useEngine(); + const canvas = useCanvas(); + + console.log('EngineChild', { engine, canvas}); + return null; +} + +const RenderHooks = () => { + return ( + + + + + + + ) +} + +export const ConvenienceHooks = () => ( +
+
Look at console.
+ +
+) + +ConvenienceHooks.story = { + name: 'engine/canvas/scene' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Hooks/useAssetManager.stories.js b/packages/storybook-static/stories/babylonjs/Hooks/useAssetManager.stories.js new file mode 100644 index 00000000..43bccf05 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Hooks/useAssetManager.stories.js @@ -0,0 +1,111 @@ +import React, { Suspense, useState, useMemo, useRef, useLayoutEffect } from 'react'; +import { Engine, Scene, useAssetManager, TaskType, useBeforeRender } from 'react-babylonjs'; +import { Vector3, Color4, Color3 } from '@babylonjs/core'; +import '../../style.css'; + +export default { title: 'Hooks' }; + +// redeclaring array will force load the asset (not deep equality check on by reference) +const pointCloudAssets = [{ taskType: TaskType.Binary, url: 'assets/kitti/000000.bin', name: 'Velodyne-kitt-dataset' }]; + +const MyPCS = () => { + const pcsRef = useRef(null); + const result = useAssetManager(pointCloudAssets); + const [pcs, setPcs] = useState(null); + const [pcsMesh, setPcsMesh] = useState(null); + + useLayoutEffect(() => { + if (pcsRef.current) { // only loaded after suspend returns + setPcs(pcsRef.current); + } + }, [pcsRef]); + + useMemo(() => { + if (result && pcs) { + const floats = new Float32Array(result.tasks[0].data); + const POINTS_PER_FLOAT = 4; + const numPoints = floats.length / POINTS_PER_FLOAT; + + // particle is the current particle, the i-th one in the PCS and the s-th one in its group + const particleFunc = (particle, i, s) => { + // KITTI-formatted PCD + const x = floats[POINTS_PER_FLOAT * i] + const y = floats[POINTS_PER_FLOAT * i + 1] + const z = floats[POINTS_PER_FLOAT * i + 2] + // ignore the reflectance value + // const r = floats[POINTS_PER_FLOAT * i + 3] + particle.position = new Vector3(x, y, z) + particle.color = Color4.FromColor3(Color3.White()) + } + + // NOTE: you can do with useRef/useState + // but you don't know WHEN the reconciler will commit those changes and add the points... + pcs.addPoints(numPoints, particleFunc); + pcs.buildMeshAsync(() => { + setPcsMesh(pcs.mesh); + }) + } + }, [result, pcsRef.current]) + + return + {pcsMesh && + + } + +} + +const MyFallback = () => { + const boxRef = useRef(); + useBeforeRender((scene) => { + if (boxRef.current) { + var deltaTimeInMillis = scene.getEngine().getDeltaTime(); + + const rpm = 10; + boxRef.current.rotation.x = Math.PI / 4; + boxRef.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }) + + return +} + +export const UseAssetManager = () => ( +
+ + + + + }> + + + + +
+); + +UseAssetManager.story = { + name: 'useAssetManager', + parameters: { + notes: { + markdown: `## Citation + + ./storybook-static/assets/kitti/000000.bin is retrieved from [the original KITTI website](http://www.cvlibs.net/datasets/kitti/index.php), + and redistributed under the [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License](http://creativecommons.org/licenses/by-nc-sa/3.0/). + + References + + [1] Andreas Geiger, Philip Lenz, and Raquel Urtasun. [Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite](http://www.cvlibs.net/publications/Geiger2012CVPR.pdf). + In Conference on Computer Vision and Pattern Recognition (CVPR), 2012. + + [2] Andreas Geiger, Philip Lenz, Christoph Stiller, and Raquel Urtasun. [Vision meets Robotics: The KITTI Dataset](http://www.cvlibs.net/publications/Geiger2013IJRR.pdf). + International Journal of Robotics Research (IJRR), 2013. + ` + } + } +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Hooks/useClick.stories.js b/packages/storybook-static/stories/babylonjs/Hooks/useClick.stories.js new file mode 100644 index 00000000..f0f2cdf9 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Hooks/useClick.stories.js @@ -0,0 +1,51 @@ +import React, {useState} from 'react' +import {Engine, Scene, useClick} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' +import {Color3} from "@babylonjs/core/Maths/math.color"; + +export default {title: 'Hooks'}; + +const getRandomColor = (function () { + // const Colors = ['#4F86EC', '#D9503F', '#F2BD42', '#58A55C']; + const Colors = [[0.31, 0.53, 0.93, 1], [0.85, 0.31, 0.25, 1], [0.95, 0.74, 0.26, 1], [0.35, 0.65, 0.36, 1]]; + + let i = 0; + return () => { + i++; + return Colors[i % Colors.length]; + } +})(); + +const initialColor = Color3.FromArray(getRandomColor()); + +function WithUseClick() { + const [color, setColor] = useState(initialColor); + const [ref] = useClick(_ => { + const color = getRandomColor(); + setColor(Color3.FromArray(color)) + }); + + return + + +} + +export const UseClickEvent = () => ( +
+ + + + + + + + +
+); + +UseClickEvent.story = { + name: 'useClick' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Hooks/useHover.stories.js b/packages/storybook-static/stories/babylonjs/Hooks/useHover.stories.js new file mode 100644 index 00000000..c27ded80 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Hooks/useHover.stories.js @@ -0,0 +1,70 @@ +import React, {useState} from 'react' +import {Engine, Scene, useHover} from 'react-babylonjs' +import {Vector3} from '@babylonjs/core/Maths/math' +import {Control} from '@babylonjs/gui/2D/controls/control'; +import { TextWrapping} from '@babylonjs/gui/2D/controls' +import '../../style.css' + +export default {title: 'Hooks'}; + +function WithUseHover() { + const [scaling, setScaling] = useState(new Vector3(1, 1, 1)); + const [ref] = useHover( + _ => setScaling(new Vector3(1.5, 1.5, 1.5)), + _ => setScaling(new Vector3(1, 1, 1)) + ); + + return + +} + +const WithUseHoverGui = () => { + + const [color, setColor] = useState('white'); + const [isHovered, setIsHovered] = useState(false); + const [rectRef] = useHover( + _ => { + setColor('yellow'); + setIsHovered(true); + }, + _ => { + setColor('white'); + setIsHovered(false) + } + ); + + return + + + + + + + + +} + +export const UseHoverEvent = () => ( +
+ + + + + + + + + +
+); + +UseHoverEvent.story = { + name: 'useHover' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/Tunnel.tsx b/packages/storybook-static/stories/babylonjs/Integrations/Tunnel.tsx new file mode 100644 index 00000000..d1d798fe --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/Tunnel.tsx @@ -0,0 +1,81 @@ +import React, { useEffect, ReactElement, Fragment} from 'react'; +import create from "zustand" + + +type Store = { + store: {[key:string]: ReactElement}, + add:(key: string, el:ReactElement)=>void, + remove:(key: string)=>void +} + +/** + * A tunnel allows to render components of one renderer inside another. + * I.e. babylonjs components normally need to live within Engine component. + * A tunnel entrance allows to position components in a different renderer, such as ReactDOM + * and move it to the tunnel exit, that must exist within Engine component. + * + * The nice thing is, even refs can be used outside of Engine context. + * + * The createTunnel function creates a tunnel entrance and exit component. + * The tunnel works one-directional. + * TunnelEntrance only accepts components that are allowed to live within the renderer of TunnelExit. + * Multiple entrances and exits are possible. + * + * If components need to be rendererd the other way around, a second Tunnel is needed. + * + */ +const createTunnel = () => { + + const useStore = create((set, get)=> ({ + store: {}, + add: (key, el) => set((state)=>{ + return {...state, store: {...state.store, [key]: el}}}), + remove: (key) => set((state)=>{ + if(key in state.store){ + delete state.store[key] + } + return {...state, store: {...state.store}}}) + })) + + /** + * Tunnel Entrance + * @param uid a unique identifier - similar to key. if same uid exists in app, only one tunnel entrance will end in tunnel exit + * @returns nothing + */ + const TunnelEntrance = ({uid, children}: {uid: string,children: ReactElement}) => { + const add = useStore(state => state.add) + const remove = useStore(state => state.remove) + useEffect(()=>{ + add(uid, children); + return ()=> { + remove(uid) + } + },[children]) + + return <> + } + + /** + * Tunnel Exit + * @param uids optionally add uids of tunnel entrances to only show components of these entrances + * @returns Components of Tunnel Entrance + */ + const TunnelExit = ({uids}: {uids?: string[]}) => { + const state = useStore(state => state.store) + + + return <>{Object.keys(state) + .filter(key => uids ? uids.includes(key) : true) + .map((key) => { + return + {state[key]} + + }) + } + + } + + return {TunnelEntrance, TunnelExit}; +} + +export default createTunnel; \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/chromaJS.stories.js b/packages/storybook-static/stories/babylonjs/Integrations/chromaJS.stories.js new file mode 100644 index 00000000..8b55b206 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/chromaJS.stories.js @@ -0,0 +1,140 @@ +import React from 'react' +import { Vector3, Color3 } from '@babylonjs/core'; +import { Control } from '@babylonjs/gui'; +import { Engine, Scene, PropChangeType, useCustomPropsHandler } from 'react-babylonjs' +import '../../style.css'; +import chroma, { Color } from 'chroma-js' + +export default { title: 'Integrations'}; + +class ChromajsColor3PropsHandler /* implements ICustomPropsHandler */ { + + get name() { return 'chroma-js:Color3'} + + get propChangeType() { + return PropChangeType.Color3; + } + + accept(newProp) { + return (typeof(newProp) === 'string' && chroma.valid(newProp)) || newProp instanceof Color; + } + + process(oldProp, newProp) { + let newColor; + // this doesn't work switching from 'string' <==> Color... + if (typeof(newProp) === 'string') { + if (oldProp === undefined || oldProp !== newProp) { + newColor = chroma(newProp).rgb(); + } + } else { + if (oldProp === undefined || (oldProp instanceof Color && oldProp.hex() !== newProp.hex)) { + newColor = newProp.rgb(); + } + } + + return { + processed: newColor !== undefined, + value: newColor === undefined + ? null + : Color3.FromInts(newColor[0], newColor[1], newColor[2]) + }; + } +} + +const SQUARES_PER_CIRCLE = 24; +const INNER_RADIUS = 1.5; + +/** + * Shortest distance (angular) between two angles. + * It will be in range [0, 180]. + */ +const distance = (alpha, beta) => { + const phi = Math.abs(beta - alpha) % 360; // This is either the distance or 360 - distance + const distance = phi > 180 ? 360 - phi : phi; + return distance; +} + +/** + * This is for optimizing animation when first mount application. + * But this story works well,Animation is smooth。 + */ +function WithCustomColors(props) { + useCustomPropsHandler(new ChromajsColor3PropsHandler()); + const degreeIncrements = (360 / SQUARES_PER_CIRCLE); + + return ( + <> + + + + { + props.colors.map(colorName => { + const color = chroma(colorName); + // color.luminance() < 0.25 + const contrastColor = color.get('lab.l') > 45 ? 'black' : 'white'; + // console.log('checking:', colorName, color.get('lab.l'), color.luminance()); + return ( + + + + ) + }) + } + + + + { + props.colors.map((colorName, colorIndex) => { + + const whiteColorScaleFn = chroma.scale([colorName, 'white']); + const blackColorScaleFn = chroma.scale([colorName, 'black']); + const radius = (colorIndex * 1.05) + INNER_RADIUS; + const size = 0.75 * Math.tan(degreeIncrements * Math.PI/180) * radius; + + return [...Array(SQUARES_PER_CIRCLE).keys()].map(positionIndex => { + + const degrees = positionIndex * degreeIncrements; + const topDistance = distance(degrees, 270); + const bottomDistance = distance(degrees, 90); + const useWhiteColor = topDistance <= 90;// degrees from top > 90° + + const color = useWhiteColor + ? whiteColorScaleFn(1 - (topDistance / 90)) + : blackColorScaleFn((90 - bottomDistance) / 90); + + const angleRads = degrees * Math.PI / 180; + const x = radius * Math.cos(angleRads); + const z = radius * Math.sin(angleRads); + return ( + + + + )}) + }) + } + + ) +} + +export const ChromaJSProps = () => +
+ + + + + + + +
+ +ChromaJSProps.story = { + name: 'chroma-js' +} + diff --git a/packages/storybook-static/stories/babylonjs/Integrations/gsap.stories.js b/packages/storybook-static/stories/babylonjs/Integrations/gsap.stories.js new file mode 100644 index 00000000..8f94204a --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/gsap.stories.js @@ -0,0 +1,82 @@ +import '@babylonjs/inspector'; +import React, { Component } from 'react'; +import { TimelineLite } from 'gsap/all'; +import { Engine, Scene, Skybox } from 'react-babylonjs'; +import { Vector3, Color3, Color4 } from '@babylonjs/core'; +import { StandardMaterial, FresnelParameters } from '@babylonjs/core/Materials'; +import { CubeTexture } from '@babylonjs/core/Materials/Textures'; +import ScaledModelWithProgress from '../ScaledModelWithProgress'; +import '../../style.css'; + +export default { title: 'Integrations' }; + +class WithGSAP extends Component { + constructor () { + super() + + this.state = { + atomYPos: 0, + atomScaling: 3.0, + skyboxIndex: 0 + } + + this.onModelLoaded = this.onModelLoaded.bind(this) + this.logoTween = new TimelineLite({ paused: true }) + } + + + onModelLoaded = (model) => { + model.meshes.map((mesh, index) => { + const scene = mesh._scene; + let material = new StandardMaterial("kosh", scene); + material.reflectionTexture = new CubeTexture("assets/textures/TropicalSunnyDay", scene); + material.diffuseColor = new Color3(0, 0, 0); + material.emissiveColor = new Color3(0.5, 0.5, 0.5); + material.alpha = 0.2; + material.specularPower = 16; + + // Fresnel + material.reflectionFresnelParameters = new FresnelParameters(); + material.reflectionFresnelParameters.bias = 0.1; + + material.emissiveFresnelParameters = new FresnelParameters(); + material.emissiveFresnelParameters.bias = 0.6; + material.emissiveFresnelParameters.power = 4; + material.emissiveFresnelParameters.leftColor = Color3.White(); + material.emissiveFresnelParameters.rightColor = Color3.Black(); + + material.opacityFresnelParameters = new FresnelParameters(); + material.opacityFresnelParameters.leftColor = Color3.White(); + material.opacityFresnelParameters.rightColor = Color3.Black(); + if(index === 0){ + this.logoTween.to(mesh.scaling, 2, { x: 4, y: 4, z: 4 }) + this.logoTween.to(mesh.scaling, 2, { x: 2, y: 2, z: 2 }) + this.logoTween.to(mesh.rotation, 1, { x: 1, y: 1, z: 1 }) + this.logoTween.play(); + } + mesh.material = material; + }) + } + + render () { + return ( + + + + + + + + + ) + } +} + +export const GSAPTimeline = () => ( +
+ +
+) \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/VaporWave.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/VaporWave.js new file mode 100644 index 00000000..4864766f --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/VaporWave.js @@ -0,0 +1,47 @@ + +import React, { useEffect } from 'react'; +import { Vector2, Mesh } from '@babylonjs/core'; +import { useScene } from 'react-babylonjs'; +import './shaders'; +let customProceduralTexture = null; +let time = 0; + +const onCustomProceduralTextureCreated = (cpt) => { + customProceduralTexture = cpt; // assigning to reflection/refraction of mirrorball +} + +const VaporWave = (props) => { + const scene = useScene(); + useEffect(() => { + const observable = scene.onBeforeRenderObservable.add((scene) => { + if (scene !== null && customProceduralTexture !== null) { + time += scene.getEngine().getDeltaTime(); + customProceduralTexture.setFloat("time", time); + } + }) + return () => { + scene.onBeforeRenderObservable.remove(observable); + } + }) + + return (<> + + + + + + ) +} + +export default VaporWave \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/block.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/block.js new file mode 100644 index 00000000..7a1547b3 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/block.js @@ -0,0 +1,64 @@ +import React, { createContext, useRef, useContext } from "react" +import { useBeforeRender } from 'react-babylonjs' +import { Vector3, } from '@babylonjs/core'; +import lerp from "lerp" +import state from "./store" + +const offsetContext = createContext(0) + +function Block({ children, offset, factor, ...props }) { + const { offset: parentOffset, sectionHeight } = useBlock() + offset = offset !== undefined ? offset : parentOffset + const ref = useRef() + useBeforeRender((scene) => { + if(ref.current && ref.current.position){ + const curY = ref.current.position.y; + const curTop = state.top.current; + ref.current.position.y = lerp(curY, (curTop / state.zoom) * factor, 0.1); + } + }); + + return ( + + + {children} + + + ) +} + +function useBlock() { + const { sections, pages, zoom } = state + const viewPortSize = { + width: window.innerWidth, + height: window.innerHeight, + } + const size = viewPortSize; + const viewport = viewPortSize; + const offset = useContext(offsetContext) + const viewportWidth = viewport.width + const viewportHeight = viewport.height + const canvasWidth = viewportWidth / zoom + const canvasHeight = viewportHeight / zoom + const mobile = size.width < 700 + const margin = canvasWidth * (mobile ? 0.2 : 0.1) + const contentMaxWidth = canvasWidth * (mobile ? 0.8 : 0.6) + const sectionHeight = canvasHeight * ((pages - 1) / (sections - 1)) + const offsetFactor = (offset + 1.0) / sections + + return { + viewport, + offset, + viewportWidth, + viewportHeight, + canvasWidth, + canvasHeight, + mobile, + margin, + contentMaxWidth, + sectionHeight, + offsetFactor + } +} + +export { Block, useBlock } \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/pixi-styles.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/pixi-styles.js new file mode 100644 index 00000000..fc2289a4 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/pixi-styles.js @@ -0,0 +1,31 @@ +export const retroGoldGradient = { + fontFamily: "Press Start 2P", + fontSize: 36, + fontWeight: "bold", + fill: ["#fcb69f", "#f6d365"], // gradient + stroke: "#e6e9f0", + strokeThickness: 3, + dropShadow: true, + dropShadowColor: "#000000", + dropShadowBlur: 4, + dropShadowAngle: Math.PI / 6, + dropShadowDistance: 6, + wordWrap: true, + wordWrapWidth: 440 + } + + export const postSpectacularGradient = { + fontFamily: "Orbitron", + fontSize: 50, + fontWeight: "bold", + fill: ["#6a11cb", "#2575fc"], // gradient + stroke: "#4facfe", + strokeThickness: 2, + dropShadow: true, + dropShadowColor: "#000000", + dropShadowBlur: 4, + dropShadowAngle: Math.PI / 6, + dropShadowDistance: 6, + wordWrap: false, + wordWrapWidth: 440 + } \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/shaders/index.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/shaders/index.js new file mode 100644 index 00000000..0edba930 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/shaders/index.js @@ -0,0 +1,306 @@ +import {Effect} from "@babylonjs/core"; +// register shader toy fragment example +Effect.ShadersStore.vaporWavePixelShader = ` +uniform float time; + uniform vec2 mousePos; + uniform vec2 resolution; + varying vec2 vUV; + #define PI 3.1415926535 + #define STEPS 50 + mat2 rot( in float a ) { + float c = cos(a); + float s = sin(a); + return mat2(c,s,-s,c); + } + // noise function + float noise( in vec2 p ) { + p *= rot(1.941611); + return sin(p.x) * .25 + sin(p.y) * .25 + .50; + } + // get the 2 closest point with the projected height as z + void grid( in vec2 p, inout vec3 projClosest, inout vec3 projSecondClosest ) { + vec2 center = floor(p) + 0.5; + vec2 secondBestCenter = center; + float secondBestDist = 99999.9; + vec2 bestCenter = center; + float bestDist = 99999.9; + for (int y = -1 ; y <= 1 ; y++) + for (int x = -1 ; x <= 1 ; x++) { + vec2 currentCenter = center + vec2(x, y); + // vary each center a bit + currentCenter.x += noise( + time * vec2(0.5124, 0.5894) + + currentCenter * vec2(1.3124, 1.7894)) * 1.0 - 0.5; + currentCenter.y += noise( + time * vec2(0.5565, 0.5561) - + currentCenter * vec2(1.5124, 1.6053)) * 1.0 - 0.5; + vec2 delta = p - currentCenter; + float currentDist = dot(delta, delta)*0.5; + // use an analytical if to avoid the branch + float if1 = step(currentDist, bestDist); + float if1m = 1.0 - if1; + secondBestCenter = if1*bestCenter + if1m*secondBestCenter; + secondBestDist = if1*bestDist + if1m*secondBestDist; + bestCenter = if1*currentCenter + if1m*bestCenter; + bestDist = if1*currentDist + if1m*bestDist; + // else if + float if2 = step(currentDist, secondBestDist)*if1m; + float if2m = 1.0 - if2; + secondBestCenter = if2*currentCenter + if2m*secondBestCenter; + secondBestDist = if2*currentDist + if2m*secondBestDist; + } + projClosest = vec3(bestCenter, bestDist); + projSecondClosest = vec3(secondBestCenter, secondBestDist); + } + // normal function + vec3 normal( in vec3 p, in vec3 proj ) { + vec2 dir = proj.xy - p.xy; + vec3 tang = vec3(dir, proj.z*0.12); + vec3 nine = vec3(dir, 0).yxz; + nine.x = -nine.x; + return normalize(cross(nine, tang)); + } + // distance function + float de( in vec3 p, inout vec3 projClosest, inout vec3 projSecondClosest ) { + // get the closest points + grid(p.xy, projClosest, projSecondClosest); + float below = 0.0; + below -= sin(dot(p.xy, vec2(0.005, 0.051)) * 4.0 + time * 0.5) * 0.4 + 0.2; + below -= 1.0 - projClosest.z; + return max(0.0, p.z - below); + } + // return the sun color at this direction + vec4 getSunColor( in vec3 dir, inout float inside ) { + float dotp = dot(dir, vec3(-0.99, 0.0, 0.1)); + float sunHeight = smoothstep(0.01, 0.29, dir.z); + inside = smoothstep(0.977, 0.979, dotp); + float ytemp = abs(dir.y)*dir.y; + float sunWave = sin(dir.z*300.0+time*1.846+ + sin(ytemp*190.0+time*0.45)*1.3)*0.5+0.5; + float sunHeight2 = smoothstep(-0.1, 0.2, dir.z); + sunWave = sunWave * sunHeight2 + 1.0 - sunHeight2; + sunWave = (1.0-smoothstep(sunHeight2, 1.0, sunWave)) * (1.0 - sunHeight2) + sunHeight2; + float sun = inside * sunWave; + return vec4(mix(vec3(0.998, 0.108, 0.47), vec3(0.988, 0.769, 0.176), sunHeight), sun); + } + // get the space color + vec3 getSpaceColor( in vec3 dir ) { + float scanline = sin(dir.z * 700.0 - time * 5.1)*0.5+0.5; + scanline *= scanline; + vec3 color = mix(vec3(0.1, 0.16, 0.26), vec3(0.1), scanline); + vec2 uv = vec2(atan(dir.y, dir.x) / (2.0 * PI) + 0.5, mod(dir.z, 1.0)); + uv.x = mod(uv.x+2.0*PI, 1.0); + uv.x *= 100.0; + uv.y *= 15.00; + uv *= rot(1.941611+time*0.00155); + vec2 center = floor(uv) + 0.5; + center.x += noise(center*48.6613) * 0.8 - 0.4; + center.y += noise(center*-31.1577) * 0.8 - 0.4; + float radius = smoothstep(0.6, 1.0, noise(center*42.487+ + vec2(0.1514, 0.1355)*time)); + radius *= 0.01; + vec2 delta = uv-center; + float dist = dot(delta, delta); + float frac = 1.0-smoothstep(0.0, radius, dist); + float frac2 = frac; + frac2 *= frac2; frac2 *= frac2; frac2 *= frac2; + vec3 lightColor = mix(vec3(0.988, 0.769, 0.176), + vec3(0.988, 0.434, 0.875), noise(center*74.487)); + return mix(color, lightColor, frac) + vec3(1)*frac2; + } + // get the background color (ala cubemap) + vec3 getBackgroundColor( in vec3 dir ) { + float horizon = 1.0 - smoothstep(0.0, 0.02, dir.z); + // this is the background with the scanline + vec3 color = getSpaceColor(dir); + // get the sun + float inside = 0.0; + vec4 sun = getSunColor(dir, inside); + color = mix(color, vec3(0.1, 0.16, 0.26), inside); + color = mix(color, sun.rgb, sun.a); + // the horizon + color = mix(color, vec3(0.43, 0.77, 0.85), horizon * (1.0 - sun.a * 0.19)); + return color; + } + // the color gets more blue/white near edges of the voronoi cells + vec3 getWaveColor( in vec3 p, in vec3 projClosest, in vec3 projSecondClosest, + in vec3 dir, float dist, vec2 frag ) { + float distanceToEdge = abs(projClosest.z-projSecondClosest.z); + float distanceFrac = smoothstep(-10.0, 100.0, dist); + distanceFrac *= distanceFrac; distanceFrac *= distanceFrac; + float frac = smoothstep(0.0, 0.1+distanceFrac*0.9, distanceToEdge); + // get the reflection + vec3 norm = normal(p, projClosest); + vec3 color = getBackgroundColor(reflect(dir, norm)); + // add a screenspace scanline + frac *= (sin(frag.y/resolution.y*700.0)*0.5+0.5)*(1.0-distanceFrac); + return mix(vec3(0.43, 0.77, 0.85), color, frac); + } + void main( void ) { + vec2 uv = vUV.xy / resolution.xy * 2.0 - 1.0; + uv.y *= resolution.y / resolution.x; + vec3 from = vec3(0, 0, 0.2); + vec3 dir = normalize(vec3(uv.x*0.6, 1.0, uv.y*-0.6)); + dir.xy *= rot(PI*.5); + vec2 mouse=(mousePos.xy / resolution.xy - 0.5) * 0.5; + mouse *= step(1.0, mousePos.x); + dir.xz *= rot(3.16-(-mouse.y*1.5)+sin(time*0.785)*0.008); + dir.xy *= rot(-mouse.x*4.0+sin(time*0.416)*0.01); + dir.yz *= rot(sin(time*0.287)*0.009); + vec3 color = vec3(0); + if (dir.z > 0.0) { + color = getBackgroundColor(dir); + } else { + // project the starting position to z = 0 so we ccan lower the raymarch count + float totdist = from.z / -dir.z; + for (int steps = 0 ; steps < STEPS ; steps++) { + vec3 p = from + totdist * dir; + vec3 projClosest; + vec3 projSecondClosest; + p.x -= time * 2.7; + float dist = de(p, projClosest, projSecondClosest); + totdist += dist; + if ( dist < 0.01 || steps == STEPS-1 ) { + color = getWaveColor(p, projClosest, projSecondClosest, + dir, totdist, vUV); + break; + } + } + } + gl_FragColor = vec4(color, 1); + } +`; + +Effect.ShadersStore.seaCloudsPixelShader = ` +uniform float time; +uniform vec2 mousePos; +uniform vec2 resolution; +varying vec2 vUV; + + float hash( float n ) { + return fract(sin(n)*43758.5453); + } + + float noise( in vec3 x ) { + vec3 p = floor(x); + vec3 f = fract(x); + f = f*f*(3.0-2.0*f); + float n = p.x + p.y*57.0 + 113.0*p.z; + return mix(mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x), + mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y), + mix(mix( hash(n+113.0), hash(n+114.0),f.x), + mix( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z); + } + + vec4 map( in vec3 p ) { + float d = 0.2 - p.y; + vec3 q = p - vec3(1.0,0.1,0.0)*time; + float f; + f = 0.5000*noise( q ); q = q*2.02; + f += 0.2500*noise( q ); q = q*2.03; + f += 0.1250*noise( q ); q = q*2.01; + f += 0.0625*noise( q ); + d += 3.0 * f; + d = clamp( d, 0.0, 1.0 ); + vec4 res = vec4( d ); + res.xyz = mix( 1.15*vec3(1.0,0.95,0.8), vec3(0.7,0.7,0.7), res.x ); + return res; + } + + vec3 sundir = vec3(-1.0,0.0,0.0); + + vec4 raymarch( in vec3 ro, in vec3 rd ) { + vec4 sum = vec4(0, 0, 0, 0); + float t = 0.0; + for(int i=0; i<64; i++) { + if( sum.a > 0.99 ) continue; + + vec3 pos = ro + t*rd; + vec4 col = map( pos ); + + #if 1 + float dif = clamp((col.w - map(pos+0.3*sundir).w)/0.6, 0.0, 1.0 ); + vec3 lin = vec3(0.65,0.68,0.7)*1.35 + 0.45*vec3(0.7, 0.5, 0.3)*dif; + col.xyz *= lin; + #endif + + col.a *= 0.35; + col.rgb *= col.a; + sum = sum + col*(1.0 - sum.a); + + #if 0 + t += 0.1; + #else + t += max(0.1,0.025*t); + #endif + } + + sum.xyz /= (0.001+sum.w); + return clamp( sum, 0.0, 1.0 ); + } + + void main(void) { + vec2 q = gl_FragCoord.xy / resolution.xy; + vec2 p = -1.0 + 2.0*q; + p.x *= resolution.x/ resolution.y; + vec2 mo = -1.0 + 2.0*mousePos.xy / resolution.xy; + + // camera + vec3 ro = 2.0*normalize(vec3(cos(2.75-3.0*mo.x), 0.7+(mo.y+1.0), sin(2.75-3.0*mo.x))); + vec3 ta = vec3(0.0, 1.0, 0.0); + vec3 ww = normalize( ta - ro); + vec3 uu = normalize(cross( vec3(0.0,1.0,0.0), ww )); + vec3 vv = normalize(cross(ww,uu)); + vec3 rd = normalize( p.x*uu + p.y*vv + 1.5*ww ); + + + vec4 res = raymarch( ro, rd ); + + float sun = clamp( dot(sundir,rd), 0.0, 1.0 ); + vec3 col = vec3(0.6,0.71,0.75) - rd.y*0.2*vec3(1.0,0.5,1.0) + 0.15*0.5; + col += 0.2*vec3(1.0,.6,0.1)*pow( sun, 8.0 ); + col *= 0.95; + col = mix( col, res.xyz, res.w ); + col += 0.1*vec3(1.0,0.4,0.2)*pow( sun, 3.0 ); + + gl_FragColor = vec4( col, 1.0 ); + } +`; + + +Effect.ShadersStore.shaderShiftRGBVertexShader = ` +attribute vec3 position; +attribute vec3 normal; +attribute vec2 uv; +uniform mat4 worldViewProjection; +uniform mat4 projection; +uniform float scale; +uniform float shift; +varying vec2 vUV; + +void main() { +vec3 pos = position; +pos.y = pos.y + ((sin(uv.x * 3.1415926535897932384626433832795) * shift * 5.0) * 0.125); +vUV = uv; +gl_Position = worldViewProjection * vec4(pos,1.); +}`; + +Effect.ShadersStore.shaderShiftRGBPixelShader = ` + uniform sampler2D textureSampler; + uniform float hasTexture; + uniform float shift; + uniform float scale; + uniform float opacity; + uniform vec3 color; + varying vec2 vUV; + void main() { + float angle = 1.55; + vec2 p = (vUV - vec2(0.5, 0.5)) * (1.0 - scale) + vec2(0.5, 0.5); + vec2 offset = shift / 4.0 * vec2(cos(angle), sin(angle)); + vec4 cr = texture2D(textureSampler, p + offset); + vec4 cga = texture2D(textureSampler, p); + vec4 cb = texture2D(textureSampler, p - offset); + if (hasTexture == 1.0) gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a); + else gl_FragColor = vec4(color, opacity); + } +`; diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/slide.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/slide.js new file mode 100644 index 00000000..f3758bb8 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/slide.js @@ -0,0 +1,126 @@ +import React, { useEffect, useRef } from "react" +import { Effect, Vector3, Mesh, Texture, Color3, ShaderMaterial } from '@babylonjs/core'; +import { Control } from '@babylonjs/gui' +import { useScene } from 'react-babylonjs' +import './shaders'; +import lerp from "lerp" +import { Block, useBlock } from "./block" +import state from "./store" +import VaporWave from './VaporWave' +let time = 0; + + +function CustomPlaneBlock(props){ + const {keyText, index, scaling, image} = props; + const { contentMaxWidth: w, viewportHeight, offsetFactor } = useBlock() + const scene = useScene(); + const planeRef = useRef(undefined) + let last = state.top.current; + useEffect(() => { + const observable = scene.onBeforeRenderObservable.add((scene) => { + if (scene !== null && planeRef !== null) { + time += scene.getEngine().getDeltaTime(); + const shMat = planeRef.current.material + shMat.setFloat("time", time); + const { pages, top } = state; + shMat.setFloat("scale", lerp(shMat._floats.scale, offsetFactor - top.current / ((pages - 1) * viewportHeight), 0.1)); + shMat.setFloat("shift", lerp(shMat._floats.shift, (top.current - last) / 150, 0.1)); + last = top.current + } + }) + return () => { + scene.onBeforeRenderObservable.remove(observable); + } + }) + + const onCustomProceduralTextureCreated = (e) => { + const options = { + attributes: ['position', 'normal', 'uv'], + samplers: ['textureSampler'], + uniforms: ['world', 'worldView', 'worldViewProjection', 'view', 'projection', 'scale', 'shift', 'color', 'opacity', 'hasTexture'] + } + const shMat = new ShaderMaterial(`shaderRGB`, scene, {vertexSource: Effect.ShadersStore.shaderShiftRGBVertexShader, fragmentSource: Effect.ShadersStore.shaderShiftRGBPixelShader }, options) + const _img = new Texture(image, scene); + _img.wrapU = Texture.CLAMP_ADDRESSMODE + _img.wrapV = Texture.CLAMP_ADDRESSMODE + shMat.backFaceCulling = false; + shMat.checkReadyOnEveryCall = true; + shMat.setTexture("textureSampler", _img); + shMat.setFloat("hasTexture", 1); + shMat.setFloat("scale", 0); + shMat.setFloat("shift", 0); + shMat.setFloat("opacity", 1); + shMat.setVector3("color", new Color3(0,0,0)); + e.material = shMat; + } + + return( + onCustomProceduralTextureCreated(e)}/> + ) +} + +function Paragraph({ image, index, offset, factor, header, aspect, text }) { + const keyText = text ? text.split(' ').join('') : Math.random() + '--rando'; + const { contentMaxWidth: w, mobile } = useBlock() + const size = aspect < 1 && !mobile ? 0.65 : 1 + const left = !(index % 2) + return ( + + + + + + + + + + + + + + + + ) +} + +function Content(mainProps) { + + return ( + <> + + + + {state.paragraphs.map((props, index) => { + return ( + + ) + })} + {state.stripes.map(({ offset, color, height, width }, index) => ( + + + + + + ))} + + ) +} + +function Slide(props) { + return +} + +export default Slide \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/store.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/store.js new file mode 100644 index 00000000..d0a5bfa7 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/store.js @@ -0,0 +1,78 @@ +import { createRef } from "react" +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; +const state = { + sections: 9, + pages: 8, + zoom: 75, + paragraphs: [ + { + offset: 1, + factor: 1.05, + header: "District 4", + image: "/assets/images/photo-1515036551567-bf1198cccc35.jpeg", + aspect: 1.51, + text: "Two thousand pharmacologists and bio-chemists were subsidized. Six years later it was being produced commercially." + }, + { + offset: 2, + factor: 1.05, + header: "Diamond Road", + image: "/assets/images/photo-1519608487953-e999c86e7455.jpeg", + aspect: 1.5, + text: + "The man who comes back through the Door in the Wall will never be quite the same as the man who went out. He will be wiser but less sure, happier but less self-satisfied, humbler in acknowledging his ignorance yet better equipped to understand the relationship of words to things, of systematic reasoning to the unfathomable mystery which it tries, forever vainly, to comprehend." + }, + { + offset: 3, + factor: 1.05, + header: "Catalina", + image: "/assets/images/ph1.jpg", + aspect: 1.5037, + text: + "The substance can take you to heaven but it can also take you to hell. Or else to both, together or alternately. Or else (if you're lucky, or if you've made yourself ready) beyond either of them. And then beyond the beyond, back to where you started from — back to here, back to New Rotham sted, back to business as usual. Only now, of course, business as usual is completely different." + }, + { + offset: 4, + factor: 1.05, + header: "Building 21", + image: "/assets/images/ph3.jpg", + aspect: 0.665, + text: + "We’ve found that the people whose EEG doesn’t show any alpha-wave activity when they’re relaxed aren’t likely to respond significantly to the substance. That means that, for about fifteen percent of the population, we have to find other approaches to liberation." + }, + { + offset: 5, + factor: 1.05, + header: "Sector 8", + image: "/assets/images/photo-1533577116850-9cc66cad8a9b.jpeg", + aspect: 1.77, + text: + "By cultivating the state of mind that makes it possible for the dazzling ecstatic insights to become permanent and habitual illuminations. By getting to know oneself to the point where one won’t be compelled by one’s unconscious to do all the ugly, absurd, self-stultifying things that one so often finds oneself doing." + }, + { + offset: 7, + factor: 1.05, + header: "The Factory", + image: "/assets/images/photo-1548191265-cc70d3d45ba1.jpeg", + aspect: 1.77, + text: "Education and enlightenment." } + ], + stripes: [ + { offset: 2, color: "#E92efb", height: 700, width:17 }, + { offset: 6.3, color: "#Ff2079", height: 700, width:17 }, + { offset: 8.3, color: "#440BD4", height: 700, width:17 }, + ], + diamonds: [ + { x: 0, offset: 0.15, pos: new Vector3(), scale: 0.6, factor: 1.8 }, + { x: 2, offset: 1.1, pos: new Vector3(), scale: 0.8, factor: 2.1 }, + { x: -5, offset: 2, pos: new Vector3(), scale: 0.8, factor: 2.5 }, + { x: 0, offset: 3.2, pos: new Vector3(), scale: 0.8, factor: 1.75 }, + { x: 0, offset: 4, pos: new Vector3(), scale: 0.8, factor: 2.5 }, + { x: 2, offset: 5.5, pos: new Vector3(), scale: 1.25, factor: 0.85 }, + { x: -5, offset: 7, pos: new Vector3(), scale: 0.8, factor: 2 }, + { x: 0, offset: 8, pos: new Vector3(), scale: 1.5, factor: 6 } + ], + top: createRef() +} + +export default state \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/styles.css b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/styles.css new file mode 100644 index 00000000..4d66d755 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-demo/styles.css @@ -0,0 +1,29 @@ +.scrollArea { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + overflow: auto; + } + +.slideContainer{ + + position: absolute; + z-index: 1; + display: flex; + bottom: 10px; + right: 10px; + color: #c6f200; + justify-content: center; + align-items: center; +} + +.btn{ + padding: 10px; + cursor: pointer; + margin: 10px; + background-color: #2d00f7; + border: solid 1px #f20089; + +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/pixi-render.stories.js b/packages/storybook-static/stories/babylonjs/Integrations/pixi-render.stories.js new file mode 100644 index 00000000..86479cf0 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/pixi-render.stories.js @@ -0,0 +1,142 @@ + +import React, { useRef, useCallback, useState, useEffect } from 'react'; +import * as PIXI from 'pixi.js'; +import { Vector3, Color3 } from '@babylonjs/core'; +import { render as PixiRender, Text } from '@inlet/react-pixi' +import { Engine, Scene, useScene } from 'react-babylonjs'; +import '@babylonjs/inspector' +import {postSpectacularGradient} from './pixi-demo/pixi-styles'; +import './pixi-demo/shaders'; // side-effect of registering a pixel shader +import Slider from './pixi-demo/slide' +import state from "./pixi-demo/store" +import './pixi-demo/styles.css' +export default { title: 'Integrations' }; + +let customProceduralTexture = null; +let time = 0; + +function ScenePIXI(props) { + const beforeMount = useRef(false); + const pixiRefs = useRef(undefined); + const scene = useScene(); + scene.clearColor = Color3.FromHexString('#04005E'); + if (beforeMount.current === false) { + beforeMount.current = true; + const engine = scene.getEngine(); + scene.debugLayer.show(); + const options = { + autoStart: false, + clearBeforeRender: false, + context: engine._gl, // ._gl is public **hidden** + height: engine.getRenderHeight(), + // roundPixels: true, available PIXI < 5.0 + view: engine.getRenderingCanvas(), + width: engine.getRenderWidth() + } + + pixiRefs.current = { + renderer: new PIXI.Renderer(options), // use PIXI.WebGLRender <= PIXI v5.0 + stage: new PIXI.Container() + } + } + + useEffect(() => { + // NOTE: to render PIXI in the background (BabylonJS in foreground) do 2 things differently: + // 1. use onBeforeRenderLoopObservable() + // 2. scene.autoClear = false; + const observer = props.onEndRenderLoopObservable.add(engine => { + engine.wipeCaches(true); + const { renderer } = pixiRefs.current; + renderer.reset(); + renderer.render(pixiRefs.current.stage); + renderer.reset(); // need to reset again :) + }) + + return () => { + props.onEndRenderLoopObservable.remove(observer); + } + }) + + useEffect(() => { + const observable = scene.onBeforeRenderObservable.add((scene) => { + if (scene !== null && customProceduralTexture !== null) { + time += scene.getEngine().getDeltaTime(); + // 'time' is a uniform on the shader + customProceduralTexture.setFloat("time", time); + } + }) + + return () => { + scene.onBeforeRenderObservable.remove(observable); + } + }) + + // not "rendering" using a different reconciler! + PixiRender( + <> + {props.children} + + , + pixiRefs.current.stage + ); + + return null; +} + +const SceneBabylonJSSlider = (props) => <> + + + + + +const postText = "P05T 5P3CTACU1AR DEMOSCENE"; +let engine = undefined; + +const scrollToArea = (spot) => { + document.querySelector('.scrollArea').scrollTo({ + top: spot === 0 ? 0:spot * window.innerHeight, + left: 0, + behavior: 'smooth' + }) +} + +export const PIXIStory = ({ top, mouse }) => { + const [found, setFound] = useState(false); + const engineRef = useCallback(component => { + engine = component; + setFound(true); + }, []); + + const scrollArea = useRef() + const onScroll = e => { + return e.target && e.target.scrollTop ? state.top.current = e.target.scrollTop:false; + } + useEffect(() => void onScroll({ target: scrollArea.current }), []) + return ( +
+ + + + + + + + +
+ Slides: +
scrollToArea(0)}>1
+
scrollToArea(1.5)}>2
+
scrollToArea(2.2)}>3
+
scrollToArea(3.2)}>4
+
scrollToArea(4)}>5
+
+
+
+
+
+ ) +} + +PIXIStory.story = { + name: 'PixiJS v5' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Integrations/reactSpring.stories.js b/packages/storybook-static/stories/babylonjs/Integrations/reactSpring.stories.js new file mode 100644 index 00000000..cd2d7d5f --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/reactSpring.stories.js @@ -0,0 +1,273 @@ +import React from 'react' +import { + Engine, + Scene, + useHover, + CustomPropsHandler, + PropChangeType, +} from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math'; +import { useSprings, useSpring, animated } from 'react-babylon-spring'; +import 'react-babylon-spring'; +import '../../style.css' + +export default {title: 'Integrations'}; + +/** + * Only need these Handlers or otherwise react-babylon-spring can export them. + * Copied from /src/customProps in that repo. + * The global resolution that used to work likely broke when not re-using the same Fiber host was fixed in issue #100 (new renderer creation). + */ +function parseRgbaString(rgba) { + const arr = rgba.replace(/[^\d,]/g, '').split(','); + return arr.map(num => parseInt(num, 10) / 255); +} + +const Key = 'react-babylon-spring'; + +class CustomColor3StringHandler { + get name() { + return `${Key}:Color3String` + } + + get propChangeType() { + return PropChangeType.Color3; + } + + accept(newProp) { + // console.log('accept Color3String?', newProp); + return typeof (newProp) === 'string'; + } + + process(oldProp, newProp) { + if (oldProp !== newProp) { + return { + processed: true, + value: Color3.FromArray(parseRgbaString(newProp)) + }; + } + + return {processed: false, value: null}; + } +} + +class CustomColor3ArrayHandler { + get name() { + return `${Key}:Color3Array` + } + + get propChangeType() { + return PropChangeType.Color3; + } + + accept(newProp) { + // console.log('accept Color3Array?:', Array.isArray(newProp), newProp); + return Array.isArray(newProp); + } + + process(oldProp, newProp) { + if (oldProp === undefined || oldProp.length !== newProp.length) { + console.log(`found diff length (${oldProp?.length}/${newProp?.length}) Color3Array new? ${oldProp === undefined}`) + return { + processed: true, + value: Color3.FromArray(newProp) + }; + } + + for (let i = 0; i < oldProp.length; i++) { + if (oldProp[i] !== newProp[i]) { + console.log('found diff value Color3Array', oldProp, newProp); + return { + processed: true, + value: Color3.FromArray(newProp) + }; + } + } + + // console.log('Color3Array not processed', oldProp, newProp); + return {processed: false, value: null}; + } +} + +class CustomColor4StringHandler { + + get name() { + return `${Key}:Color4String` + } + + get propChangeType() { + return PropChangeType.Color4; + } + + accept(newProp) { + return typeof (newProp) === 'string'; + } + + process(oldProp, newProp) { + if (oldProp !== newProp) { + // console.log('found diff Color4String') + return { + processed: true, + value: Color4.FromArray(parseRgbaString(newProp)) + }; + } + + return {processed: false, value: null}; + } +} + +class CustomVector3ArrayHandler { + get name() { + return `${Key}:Vector3Array` + } + + get propChangeType() { + return PropChangeType.Vector3; + } + + accept(newProp) { + // console.log('Vector3: newProp:', newProp, Array.isArray(newProp)); + return Array.isArray(newProp); + } + + process(oldProp, newProp) { + if (oldProp === undefined || oldProp.length !== newProp.length) { + // console.log(`found diff length (${oldProp?.length}/${newProp?.length}) Color3Array new? ${oldProp === undefined}`) + return { + processed: true, + value: Vector3.FromArray(newProp) + }; + } + + for (let i = 0; i < oldProp.length; i++) { + if (oldProp[i] !== newProp[i]) { + // console.log('found difference...', oldProp, newProp); + return { + processed: true, + value: Vector3.FromArray(newProp) + }; + } + } + + // console.log('not processed...'); + return {processed: false, value: null}; + } +} +/** + * This is the end of code that needed to be copied, since it is not exported. + */ + +// we need to keep registering these as our fiber instance is being recreated when reloaded - the registrations imported as side-effects are +const registerPropsHandlers = () => { + CustomPropsHandler.RegisterPropsHandler(new CustomColor3StringHandler()); + CustomPropsHandler.RegisterPropsHandler(new CustomColor3ArrayHandler()); + CustomPropsHandler.RegisterPropsHandler(new CustomColor4StringHandler()); + CustomPropsHandler.RegisterPropsHandler(new CustomVector3ArrayHandler()); +} + +const getRandomColor = (function () { + // const Colors = ['#4F86EC', '#D9503F', '#F2BD42', '#58A55C']; + const Colors = [[0.31, 0.53, 0.93, 1], [0.85, 0.31, 0.25, 1], [0.95, 0.74, 0.26, 1], [0.35, 0.65, 0.36, 1]]; + + let i = 0; + return () => { + i++; + return Colors[i % Colors.length]; + } +})(); + +function getCyclePosition(i, blankRadius) { + i += blankRadius; + let angle = i % Math.PI * 2; + const x = i * Math.cos(angle); + const z = i * Math.sin(angle); + + return [x, z]; +} + +const WithSpring = () => { + // this only needs to be done once, so not on every render. + registerPropsHandlers(); + + const [props, set] = useSprings(100, i => { + const [x, z] = getCyclePosition(i, 30); + + return { + position: [x, 20, z], + color: getRandomColor(), + from: { + position: [x, Math.random() * 50 - 60, z], + }, + config: { + duration: 3000, + } + } + }); + + const [ref, isHovering] = useHover(_ => { + set((index, ctrl) => { + return { + color: getRandomColor(), + position: [0, 20, 0], + config: { + duration: 2000, + } + } + }); + }, _ => { + set(i => { + const [x, z] = getCyclePosition(i, 30); + return { + position: [x, 20, z], + config: { + duration: 2000, + } + } + }); + }); + + const groupProps = useSpring({ + rotation: isHovering ? [0, Math.PI * 2, 0] : [0, 0, 0], + config: { + duration: 2000 + } + }); + + return ( + <> + + + + + { + props.map(({position, color}, i) => + + + + ) + } + + + + + + + + + + ) +} + +export const ReactSpring = () => ( +
+ + + + + +
+); + +ReactSpring.story = { + name: 'react-spring' +} diff --git a/packages/storybook-static/stories/babylonjs/Integrations/tunnel.stories.js b/packages/storybook-static/stories/babylonjs/Integrations/tunnel.stories.js new file mode 100644 index 00000000..9f328b83 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Integrations/tunnel.stories.js @@ -0,0 +1,151 @@ +import React, { useEffect, useRef, useState, Fragment } from 'react'; +import create from "zustand"; +import { Engine, Scene, useBeforeRender } from 'react-babylonjs'; +import { Vector3 } from '@babylonjs/core/Maths/math.vector'; +import { Color3 } from '@babylonjs/core/Maths/math.color'; + +import '../../style.css'; + +export default { title: 'Integrations' }; + +/** + * This is a javascript port of ./Tunnel.tsx + */ +const createTunnel = () => { + + const useStore = create((set, get) => ({ + store: {}, + add: (key, el) => set((state) => { + return { ...state, store: { ...state.store, [key]: el } } + }), + remove: (key) => set((state) => { + if (key in state.store) { + delete state.store[key] + } + return { ...state, store: { ...state.store } } + }) + })) + + /** + * Tunnel Entrance + * @param uid a unique identifier - similar to key. if same uid exists in app, only one tunnel entrance will end in tunnel exit + * @returns nothing + */ + const TunnelEntrance = ({ uid, children }) => { + const add = useStore(state => state.add) + const remove = useStore(state => state.remove) + useEffect(() => { + add(uid, children); + return () => { + remove(uid) + } + }, [children]) + + return <> + } + + /** + * Tunnel Exit + * @param uids optionally add uids of tunnel entrances to only show components of these entrances + * @returns Components of Tunnel Entrance + */ + const TunnelExit = ({ uids }) => { + const state = useStore(state => state.store) + + return <>{Object.keys(state) + .filter(key => uids ? uids.includes(key) : true) + .map((key) => { + return + {state[key]} + + }) + } + + } + + return { TunnelEntrance, TunnelExit }; +} + +/** + * A tunnel allows to render components of one renderer inside another. + * I.e. babylonjs components normally need to live within Engine component. + * A tunnel entrance allows to position components in a different renderer, such as ReactDOM + * and move it to the tunnel exit, that must exist within Engine component. + * + * The nice thing is, even refs can be used outside of Engine context. + * + * The createTunnel function creates a tunnel entrance and exit component. + * The tunnel works one-directional. + * TunnelEntrance only accepts components that are allowed to live within the renderer of TunnelExit. + * Multiple entrances and exits are possible. + * + * If components need to be rendererd the other way around, a second Tunnel is needed. + * + */ +const { TunnelEntrance, TunnelExit } = createTunnel(); + +const rpm = 5; + +const WithTunnel = ({ uids }) => { + const [_, setReady] = useState(false); + const ref = useRef(null); + useBeforeRender((scene) => { + + if (ref.current !== null) { + const deltaTimeInMillis = scene.getEngine().getDeltaTime(); + ref.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }) + + useEffect(() => { + setReady(true); + }, [ref.current]) + + return + + +} + +export const ZustandTunnel = () => { + + /** ref to tunnel is possible */ + const ref = useRef(null) + + const [position, setPosition] = useState(1) + + useEffect(() => { + if (ref.current) { + ref.current.position.x = Math.abs(position - 4); + } + }, [position]) + + return <> +
+ +
+
+ {/** Multiple Tunnel Entrances */} + + + + + + + + + + + + + + + + + + + + +
+ +} diff --git a/packages/storybook-static/stories/babylonjs/Materials/grid-material.stories.js b/packages/storybook-static/stories/babylonjs/Materials/grid-material.stories.js new file mode 100644 index 00000000..3a794cfd --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Materials/grid-material.stories.js @@ -0,0 +1,99 @@ +import React, { useState } from 'react'; +import { Engine, Scene, HostRegistrationStore, FiberPushMaterialPropsHandler, FiberMaterialPropsHandler, checkColor3Diff, checkTextureDiff, checkPrimitiveDiff, checkVector3Diff } from 'react-babylonjs'; +import { GridMaterial } from '@babylonjs/materials'; +import { Vector3, Color3 } from '@babylonjs/core'; +import '../../style.css'; + +export default { title: 'Extensions' }; + +class GridMaterialPropsHandler { + getPropertyUpdates(oldProps, newProps) { + const changedProps = [] + checkColor3Diff(oldProps.mainColor, newProps.mainColor, 'mainColor', changedProps); + checkColor3Diff(oldProps.lineColor, newProps.lineColor, 'lineColor', changedProps); + checkPrimitiveDiff(oldProps.gridRatio, newProps.gridRatio, 'gridRatio', changedProps); + checkVector3Diff(oldProps.gridOffset, newProps.gridOffset, 'gridOffset', changedProps); + checkPrimitiveDiff(oldProps.majorUnitFrequency, newProps.majorUnitFrequency, 'majorUnitFrequency', changedProps); + checkPrimitiveDiff(oldProps.minorUnitVisibility, newProps.minorUnitVisibility, 'minorUnitVisibility', changedProps); + checkPrimitiveDiff(oldProps.opacity, newProps.opacity, 'opacity', changedProps); + checkPrimitiveDiff(oldProps.preMultiplyAlpha, newProps.preMultiplyAlpha, 'preMultiplyAlpha', changedProps); + checkTextureDiff(oldProps.opacityTexture, newProps.opacityTexture, 'opacityTexture', changedProps) + return changedProps.length === 0 ? null : changedProps; + } +} + +class FiberGridMaterial { + constructor() { + this.propsHandlers = [ + new GridMaterialPropsHandler(), + new FiberPushMaterialPropsHandler(), + new FiberMaterialPropsHandler() + ]; + } + + getPropsHandlers() { + return this.propsHandlers; + } + + addPropsHandler(propHandler) { + this.propsHandlers.push(propHandler); + } +} + +HostRegistrationStore.Register({ + hostElementName: "gridMaterial", + hostFactory: (scene) => { return new GridMaterial('test', scene) }, + propHandlerInstance: new FiberGridMaterial(), + createInfo: { + "creationType": "...", + "libraryLocation": "...", + "namespace": "@babylonjs/materials", + "parameters": [ + { + "name": "name", + "type": "string", + "optional": false + }, + { + "name": "scene", + "type": "BabylonjsCoreScene", + "optional": false + } + ] + }, + metadata: { + "isMaterial": true, + "className": "GridMaterial" + } +}) + +const colors = ["Red", "Green", "Yellow"]; + +export const GridMaterialExample = () => { + const [selectedColor, setSelectedColor] = useState('Green'); + const onChange = (e) => { + setSelectedColor(e.target.value); + } + return ( + <> +
+ +
+
+ + + + + + + + + +
+ + ) +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Models/model-loader.stories.js b/packages/storybook-static/stories/babylonjs/Models/model-loader.stories.js new file mode 100644 index 00000000..07a2ba53 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Models/model-loader.stories.js @@ -0,0 +1,94 @@ +import React, { Suspense, useRef, useContext, useMemo } from 'react'; +import '@babylonjs/inspector'; + +import { Vector3 } from '@babylonjs/core'; +import { Engine, Scene, useAssetManager, TaskType, useBeforeRender, AssetManagerContext, AssetManagerContextProvider } from 'react-babylonjs'; + +import '../../style.css'; + +export default { title: 'Models' }; + +const baseUrl = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/' + +const modelAssetTasks = [ + { taskType: TaskType.Mesh, rootUrl: `${baseUrl}BoomBox/glTF/`, sceneFilename: 'BoomBox.gltf', name: 'boombox' }, + { taskType: TaskType.Mesh, rootUrl: `${baseUrl}Avocado/glTF/`, sceneFilename: 'Avocado.gltf', name: 'avocado' } +]; + +const MyFallback = () => { + const boxRef = useRef(); + const context = useContext(AssetManagerContext); + console.log('context in fallback:', context); + + useBeforeRender((scene) => { + if (boxRef.current) { + var deltaTimeInMillis = scene.getEngine().getDeltaTime(); + + const rpm = 10; + boxRef.current.rotation.x = Math.PI / 4; + boxRef.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }) + + const eventData = context?.lastProgress?.eventData; + + return <> + + + + {eventData !== undefined && + + } + {eventData === undefined && + + } + + + + + +} + +const MyModels = () => { + const assetManagerResult = useAssetManager(modelAssetTasks); + + useMemo(() => { + console.log('Loaded Tasks', assetManagerResult); + const boomboxTask = assetManagerResult.taskNameMap['boombox']; + boomboxTask.loadedMeshes[0].position = new Vector3(2.5, 0, 0); + boomboxTask.loadedMeshes[1].scaling = new Vector3(20, 20, 20); + + const avocadoTask = assetManagerResult.taskNameMap['avocado']; + avocadoTask.loadedMeshes[0].position = new Vector3(-2.5, 0, 0); + avocadoTask.loadedMeshes[1].scaling = new Vector3(20, 20, 20); + }); + + return null; +} + +const MyScene = () => { + + return ( + + + + + + }> + + + + + + ) +} + +export const ModelLoaderStory = () => ( +
+ +
+) + +ModelLoaderStory.story = { + name: 'Asset Manager' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Models/model-lookat.stories.js b/packages/storybook-static/stories/babylonjs/Models/model-lookat.stories.js new file mode 100644 index 00000000..6117930f --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Models/model-lookat.stories.js @@ -0,0 +1,59 @@ +import React, { Suspense, useState, useRef, useEffect } from 'react'; +import '@babylonjs/inspector'; +import { Engine, Scene, Model } from 'react-babylonjs'; +import { Color3, Vector3 } from '@babylonjs/core'; +import '../../style.css'; + +export default { title: 'Models' }; +const LookAtModel = ({ lookAtPosition, position, id }) => { + let baseUrl = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/'; + + const modelRef = useRef(null); + + const onModelLoaded = (model) => { + modelRef.current = model.rootMesh; + modelRef.current.lookAt(lookAtPosition.clone()) + } + + useEffect(() => { + if (modelRef.current) { + modelRef.current.lookAt(lookAtPosition); + } + }, [lookAtPosition]) + + return ( + }> + + + ) +} + +export const LookAtStory = () => { + const [lookAtPosition, setLookAtPosition] = useState(Vector3.Zero()); + + return ( + <> +
+ +
+
+ + + + + + + + + + + +
+ + ) +} + + +LookAtStory.story = { + name: '3D-lookAt' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Models/model.stories.js b/packages/storybook-static/stories/babylonjs/Models/model.stories.js new file mode 100644 index 00000000..519cd203 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Models/model.stories.js @@ -0,0 +1,105 @@ +import React, { Component, Suspense } from 'react'; +import '@babylonjs/inspector'; +import { Engine, Scene, Model } from 'react-babylonjs'; +import { Vector3, Color3 } from '@babylonjs/core'; +import { ActionManager, SetValueAction } from '@babylonjs/core/Actions'; +import ScaledModelWithProgress from '../ScaledModelWithProgress'; +import '../../style.css'; + +export default { title: 'Models' }; +class WithModel extends Component { + constructor () { + super() + + this.state = { + avocadoYPos: -1.5, + avocadoScaling: 3.0 + } + + this.moveAvocadoUp = this.moveAvocadoUp.bind(this) + this.moveAvocadoDown = this.moveAvocadoDown.bind(this) + this.increaseAvocadoSize = this.increaseAvocadoSize.bind(this) + this.decreaseAvocadoSize = this.decreaseAvocadoSize.bind(this) + this.onModelLoaded = this.onModelLoaded.bind(this) + } + + moveAvocadoDown () { + this.setState((state) => ({ + ...state, + avocadoYPos: state.avocadoYPos - 0.5 + })) + } + + moveAvocadoUp () { + this.setState((state) => ({ + ...state, + avocadoYPos: state.avocadoYPos + 0.5 + })) + } + + increaseAvocadoSize () { + this.setState((state) => ({ + ...state, + avocadoScaling: state.avocadoScaling + 0.1 + })) + } + + decreaseAvocadoSize () { + this.setState((state) => ({ + ...state, + avocadoScaling: state.avocadoScaling - 0.1 + })) + } + + onModelLoaded = (model, sceneContext) => { + let mesh = model.meshes[1] + mesh.actionManager = new ActionManager(mesh._scene) + mesh.actionManager.registerAction( + new SetValueAction( + ActionManager.OnPointerOverTrigger, + mesh.material, + 'wireframe', + true + ) + ) + mesh.actionManager.registerAction( + new SetValueAction( + ActionManager.OnPointerOutTrigger, + mesh.material, + 'wireframe', + false + ) + ) + } + + render () { + let baseUrl = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/' + return ( + + + + + + + + }> + + + + + ) + } +} + +export const ModelStory = () => ( +
+ +
+) + +ModelStory.story = { + name: '3D-Model' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/NonDeclarative/nonDeclarative.stories.js b/packages/storybook-static/stories/babylonjs/NonDeclarative/nonDeclarative.stories.js new file mode 100644 index 00000000..01d83f7e --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/NonDeclarative/nonDeclarative.stories.js @@ -0,0 +1,132 @@ +import React from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Color3, FreeCamera, Vector3, ArcRotateCamera, DefaultRenderingPipeline, HemisphericLight, DepthOfFieldEffectBlurLevel, PBRMetallicRoughnessMaterial, CubeTexture, Mesh } from '@babylonjs/core' +import { Control, TextBlock, Slider, StackPanel, AdvancedDynamicTexture } from '@babylonjs/gui' +import '../../style.css' + +export default { title: 'Non-Declarative'}; + +function meshPicked (mesh) { + console.log('mesh picked:', mesh) +} + +function onSceneMount (e) { + const { canvas, scene } = e + + scene.clearColor = new Color3(0.5, 0.5, 0.5) + var camera = new FreeCamera('camera1', new Vector3(0, 0.3, -0.7), scene) + camera.speed = 0.01 + camera.minZ = 0.001 + scene.activeCameras.push(camera) + camera.attachControl(canvas, true) + var light = new HemisphericLight('light1', new Vector3(0, 1, 0), scene) + light.intensity = 0.7 + var pbr = new PBRMetallicRoughnessMaterial('pbr', scene) + pbr.environmentTexture = CubeTexture.CreateFromPrefilteredData('assets/textures/environment.dds', scene) + var gridSize = 4 + for (var i = 0; i < gridSize; i++) { + for (var j = 0; j < 10; j++) { + var sphereMat = pbr.clone() + sphereMat.metallic = 0.1 + sphereMat.roughness = (i / gridSize) / 3 + sphereMat.baseColor = Color3.White().scale(1 - (j / 10)) + var sphere = Mesh.CreateSphere('sphere', 16, 0.2, scene) + sphere.material = sphereMat + sphere.position.y = i * 0.3 + sphere.position.x = 0.3 + sphere.position.z = j * 0.4 + + var cubeMat = pbr.clone() + cubeMat.metallic = 0.6 + cubeMat.roughness = (i / gridSize) / 3 + cubeMat.baseColor = Color3.White().scale(1 - (j / 10)) + var box = Mesh.CreateBox('box', 0.2, scene) + box.material = cubeMat + box.position.y = i * 0.3 + box.position.x = -0.3 + box.position.z = j * 0.4 + } + } + var knot = Mesh.CreateTorusKnot('knot', 0.2, 0.05, 128, 64, 2, 3, scene) + knot.material = pbr + knot.position.set(0, 0.3, 8) + + // Create default pipeline and enable dof with Medium blur level + var pipeline = new DefaultRenderingPipeline('default', true, scene, [scene.activeCamera]) + pipeline.depthOfFieldBlurLevel = DepthOfFieldEffectBlurLevel.Medium + pipeline.depthOfFieldEnabled = true + pipeline.depthOfField.focalLength = 180 + pipeline.depthOfField.fStop = 3 + pipeline.depthOfField.focusDistance = 2250 + var moveFocusDistance = true + + // add UI to adjust pipeline.depthOfField.fStop, kernelSize, focusDistance, focalLength + var bgCamera = new ArcRotateCamera('BGCamera', Math.PI / 2 + Math.PI / 7, Math.PI / 2, 100, + new Vector3(0, 20, 0), + scene) + bgCamera.layerMask = 0x10000000 + var advancedTexture = AdvancedDynamicTexture.CreateFullscreenUI('UI') + advancedTexture.layer.layerMask = 0x10000000 + var UiPanel = new StackPanel() + UiPanel.width = '220px' + UiPanel.fontSize = '14px' + UiPanel.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT + UiPanel.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER + advancedTexture.addControl(UiPanel) + var params = [ + { name: 'fStop', min: 1.4, max: 32 }, + { name: 'focusDistance', min: 0, max: 5000 }, + { name: 'focalLength', min: 0, max: 500 } + ] + params.forEach(function (param) { + var header = new TextBlock() + header.text = param.name + ':' + pipeline.depthOfField[param.name].toFixed(2) + header.height = '40px' + header.color = 'black' + header.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT + header.paddingTop = '10px' + UiPanel.addControl(header) + var slider = new Slider() + slider.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT + slider.minimum = param.min + slider.maximum = param.max + slider.color = '#636e72' + slider.value = pipeline.depthOfField[param.name] + slider.height = '20px' + slider.width = '205px' + UiPanel.addControl(slider) + slider.onValueChangedObservable.add(function (v) { + pipeline.depthOfField[param.name] = v + header.text = param.name + ':' + pipeline.depthOfField[param.name].toFixed(2) + moveFocusDistance = false + }) + }) + scene.activeCameras = [scene.activeCamera, bgCamera] + + // Move depth of field focus distance automatically at the start + scene.onBeforeRenderObservable.add(function () { + if (moveFocusDistance) { + pipeline.depthOfField.focusDistance = 600 + (4000 * (Math.sin((new Date()).getTime() / 1000) + 1) / 2) + } + }) + + scene.getEngine().runRenderLoop(() => { + if (scene) { + scene.render() + } + }) +} + +function NonDeclarative () { + return ( + + + + ) +} + +export const NonDeclarativeStory = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/Physics/physics.stories.js b/packages/storybook-static/stories/babylonjs/Physics/physics.stories.js new file mode 100644 index 00000000..e3577ab5 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Physics/physics.stories.js @@ -0,0 +1,89 @@ +import React, { useCallback } from 'react'; +import "@babylonjs/core/Physics/physicsEngineComponent" // side-effect adds scene.enablePhysics function +import { Vector3, Color4, PhysicsImpostor, Texture, Mesh } from '@babylonjs/core'; +import { CannonJSPlugin } from '@babylonjs/core/Physics/Plugins' +import { Engine, Scene } from 'react-babylonjs' +import '../../style.css' + +import * as CANNON from 'cannon'; +window.CANNON = CANNON; + +export default { title: 'Physics' }; + +// The TypeScript version of this story has it's own repo +const gravityVector = new Vector3(0, -9.81, 0); +var sphere = null; + +/** + * clicking button will apply impulse to sphere stright up. + */ +const onButtonClicked = () => { + if (sphere !== null) { + sphere.physicsImpostor.applyImpulse( + Vector3.Up().scale(10), sphere.getAbsolutePosition() + ) + } +} + +const BouncyPlayground = () => { + const sphereRef = useCallback(node => { + sphere = node; + }, []); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export const BouncyPlaygroundStory = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/PostProcess/imagePostProcess.stories.js b/packages/storybook-static/stories/babylonjs/PostProcess/imagePostProcess.stories.js new file mode 100644 index 00000000..17b8d735 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/PostProcess/imagePostProcess.stories.js @@ -0,0 +1,80 @@ +import React, { useCallback, useState, useEffect } from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3, Color3, Texture, FresnelParameters } from '@babylonjs/core' +import '../../style.css' + +export default { title: 'Post Process' }; + +let sunnyDayRootUrl = 'assets/textures/TropicalSunnyDay' + +const SkyboxAndSphere = () => ( + <> + + + + + + + + + + + + +) + +// https://playground.babylonjs.com/#17VHYI#15 +export const ColorGrading = () => { + const [colorGradingTexture, setColorGradingTexture] = useState(null); + const colorGradingTextureRef = useCallback(cg => { + setColorGradingTexture(cg); + }, []); + + useEffect(() => { + if (colorGradingTexture !== null) { + let i = 0; + const handle = setInterval(() => { + if (colorGradingTexture !== null) { + colorGradingTexture.level = Math.sin(i++ / 120) * 0.5 + 0.5; + } + }, 10); + return (() => { + clearInterval(handle); + }) + } + }, [colorGradingTexture]); + + return ( +
+ + + + + + + + + +
+ ) +} diff --git a/packages/storybook-static/stories/babylonjs/PostProcess/pipeline.stories.js b/packages/storybook-static/stories/babylonjs/PostProcess/pipeline.stories.js new file mode 100644 index 00000000..4c18852e --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/PostProcess/pipeline.stories.js @@ -0,0 +1,22 @@ +import React from 'react' +import { Engine, Scene } from 'react-babylonjs' +import { Vector3 } from '@babylonjs/core' +import '../../style.css' + +export default { title: 'Post Process' }; + +export const Pipeline = () => ( +
+ + + + + + + + + + + +
+) diff --git a/packages/storybook-static/stories/babylonjs/ScaledModelWithProgress.js b/packages/storybook-static/stories/babylonjs/ScaledModelWithProgress.js new file mode 100644 index 00000000..e2310963 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/ScaledModelWithProgress.js @@ -0,0 +1,42 @@ +import React, { Suspense, useContext } from 'react' +import { Vector3, Matrix, Color3 } from '@babylonjs/core/Maths/math' + +import { Model, SceneLoaderContextProvider, SceneLoaderContext } from 'react-babylonjs'; + +const ProgressFallback = (props) => { + const sceneLoaderContext = useContext(SceneLoaderContext); + + let loadProgress = 0; + if (sceneLoaderContext.lastProgress) { + const progress = sceneLoaderContext.lastProgress; + loadProgress = progress.lengthComputable + ? progress.loaded / progress.total + : progress.loaded / 10000; // TODO: provide option to input file size for proper loading. + } + + return ( + + + + + + + ) +} + +const ScaledModelWithProgress = (props) => { + return ( + + }> + + + + ) +} + +export default ScaledModelWithProgress; \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/SpecialFX/glow-layer.stories.js b/packages/storybook-static/stories/babylonjs/SpecialFX/glow-layer.stories.js new file mode 100644 index 00000000..a36522f0 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/SpecialFX/glow-layer.stories.js @@ -0,0 +1,85 @@ +import React, { useRef } from 'react' +import '@babylonjs/inspector' +import {Engine, Scene} from 'react-babylonjs' +import {Color3, Color4, Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' +import ScaledModelWithProgress from '../ScaledModelWithProgress' +import { Control } from '@babylonjs/gui/2D/controls/control' + +export default { title: 'Special FX' }; + +/** + * official example + * https://www.babylonjs-playground.com/#6ZVKE3#0 + */ + +const onSceneCreated = (scene) => { + scene.imageProcessingConfiguration.contrast = 1.6; + scene.imageProcessingConfiguration.exposure = 0.6; + scene.imageProcessingConfiguration.toneMappingEnabled = true; +} + +/** + * TODO + * loading so slow + */ +function WithGlowLayer() { + const glowRef = useRef(null); + + const onCheckboxClicked = (value) => { + if (glowRef.current) { + glowRef.current.isEnabled = value; + } + }; + + return ( + + + + + + + + + + + + + + + + + + + ) +} + +export const GlowLayer = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/SpecialFX/highlight-layer.stories.js b/packages/storybook-static/stories/babylonjs/SpecialFX/highlight-layer.stories.js new file mode 100644 index 00000000..24435eda --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/SpecialFX/highlight-layer.stories.js @@ -0,0 +1,65 @@ +import React, {useEffect, useRef} from 'react' +import {Control} from '@babylonjs/gui/2D/controls/control' +import '@babylonjs/inspector' +import {Engine, Scene} from 'react-babylonjs' +import {Color3, Vector3} from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'Special FX' }; + +/** + * TODO + * alpha mesh highlight + */ + +function WithHighlightLayer() { + const boxRef = useRef(null); + const highlightLayerEL = useRef(null); + + useEffect(() => { + if (highlightLayerEL.current && boxRef.current) { + highlightLayerEL.current.addMesh(boxRef.current, Color3.Green()); + } + }, [boxRef.current, highlightLayerEL.current]) + + const onCheckboxClicked = (value) => { + if (highlightLayerEL.current) { + highlightLayerEL.current.isEnabled = value; + } + }; + + return ( + <> + + + + + + + + + + + + + ) +} + +export const Highlightlayer = () => ( +
+ + + + + +
+) \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/SpecialFX/multi-glow-layer.stories.js b/packages/storybook-static/stories/babylonjs/SpecialFX/multi-glow-layer.stories.js new file mode 100644 index 00000000..80327c54 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/SpecialFX/multi-glow-layer.stories.js @@ -0,0 +1,144 @@ +import React, { useRef } from 'react' +import '@babylonjs/inspector' +import { Engine, Scene, useScene } from 'react-babylonjs' +import { Color3, Color4, Vector3 } from '@babylonjs/core/Maths/math' +import '../../style.css' +import ScaledModelWithProgress from '../ScaledModelWithProgress' +import { Control } from '@babylonjs/gui/2D/controls/control' + +export default { title: 'Special FX' }; + +/** + * some inspiration derived from here - would be good to extend this sample with more cubes at least. + * https://playground.babylonjs.com/#129LNB#16 + */ + +const onSceneCreated = (scene) => { + scene.imageProcessingConfiguration.contrast = 1.6; + scene.imageProcessingConfiguration.exposure = 0.6; + scene.imageProcessingConfiguration.toneMappingEnabled = true; +} + +const Inspector = () => { + const scene = useScene(); + scene.debugLayer.show(); + return null; +} + +const RADIUS = 10; +const NUMBER_OF_BOXES = 20; + +/** + * TODO + * loading model so slow... + */ +function WithMultiGlowLayer() { + const glow1Ref = useRef(null); + const glow2Ref = useRef(null); + + const onCheckbox1Clicked = (value) => { + if (glow1Ref.current) { + glow1Ref.current.isEnabled = value; + } + }; + + const onCheckbox2Clicked = (value) => { + if (glow2Ref.current) { + glow2Ref.current.isEnabled = value; + } + }; + + return ( + + + + + + + + {Array.from(new Array(NUMBER_OF_BOXES), (_, index) => index).map(x => ( + + + + ))} + + + + + {Array.from(new Array(NUMBER_OF_BOXES), (_, index) => index).map(x => ( + + + + ))} + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export const MultiGlowLayer = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/Textures/fire-procedural.stories.js b/packages/storybook-static/stories/babylonjs/Textures/fire-procedural.stories.js new file mode 100644 index 00000000..b731e37e --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Textures/fire-procedural.stories.js @@ -0,0 +1,53 @@ +import React, { useCallback } from 'react' +import { Engine, Scene, useScene } from 'react-babylonjs' + +import { Vector3, Space } from '@babylonjs/core/Maths/math' +import { FireProceduralTexture } from '@babylonjs/procedural-textures' +import '../../style.css' + +export default { title: 'Textures' }; + +const FireballPlane = () => { + const scene = useScene(); + const ref = useCallback(node => { + if (node !== null) { + const fireTexture = new FireProceduralTexture("fire", 256, scene); + const fireMaterial = node; + fireMaterial.diffuseTexture = fireTexture; + fireMaterial.opacityTexture = fireTexture; + } + }, []); + + return ( + + ) +} + +/** + * Insipration Playground: https://www.babylonjs-playground.com/#KM3TC + */ +function WithFireProcedural() { + return ( + + + + + + + + + + ) +} + +export const ProceduralFire = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/Textures/fresnelparameters.stories.js b/packages/storybook-static/stories/babylonjs/Textures/fresnelparameters.stories.js new file mode 100644 index 00000000..d1e223b2 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Textures/fresnelparameters.stories.js @@ -0,0 +1,150 @@ +import React, { useEffect, useRef, useState } from 'react' +import { Engine, Scene, Skybox } from 'react-babylonjs' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' +import { FresnelParameters } from '@babylonjs/core' + +export default { title: 'Textures' }; + +/** + * Insipration Playground: https://www.babylonjs-playground.com/#AQZJ4C#0 + */ +const WithFresnelParameters= () => { + let sunnyDayRootUrl = 'assets/textures/TropicalSunnyDay'; + let pointLightRef = useRef(); + + const [pointLightDiffuse, setPointLightDiffuse] = useState(() => new Color3(1, 0.5, 0.5)); + + useEffect(() => { + console.log('changing R every second'); + setInterval(() => { + + setPointLightDiffuse(new Color3((pointLightDiffuse.r + 0.1) % 1, 0.5, 0.5)); + }, 1000); + }, []) + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export const FresnelParametersStory = () => ( +
+ +
+) + +FresnelParametersStory.story = { + name: 'Fresnel Parameters' +} diff --git a/packages/storybook-static/stories/babylonjs/Textures/image-texture.stories.js b/packages/storybook-static/stories/babylonjs/Textures/image-texture.stories.js new file mode 100644 index 00000000..ce9ff14a --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Textures/image-texture.stories.js @@ -0,0 +1,91 @@ +import React, { Suspense, useState } from 'react' +import '@babylonjs/inspector' +import { Engine, Scene, TaskType, useAssetManager } from 'react-babylonjs' +import { Color4, Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +const textureAssets = [ + { taskType: TaskType.Texture, url: 'https://upload.wikimedia.org/wikipedia/commons/8/87/Alaskan_Malamute%2BBlank.png', name: 'malamute' }, + { taskType: TaskType.Texture, url: 'assets/textures/grass.png', name: 'grass' }, + { taskType: TaskType.Texture, url: 'http://i.imgur.com/wGyk6os.png', name: 'bump' } +]; + +export default { title: 'Textures' }; + +const Shapes = (props) => { + const assetManagerResult = useAssetManager(textureAssets, { + useDefaultLoadingScreen: true + }); + + return ( + <> + + + + + + + + + + + {props.showBumpSphere && + + + + + + } + + ) +} + +/** + * official examples + * - https://www.babylonjs-playground.com/#YDO1F#75 + * - https://www.babylonjs-playground.com/#20OAV9#15 + */ +export const Textures = () => { + const [showBumpSphere, setShowBumpSphere] = useState(true); + + const toggleShowBumpSphere = () => { + setShowBumpSphere(cur => !cur); + } + + return ( + <> +
+ +
+
+ + + + + + + + + + +
+ + ) +} + +Textures.story = { + name: 'Image Textures' +} \ No newline at end of file diff --git a/packages/storybook-static/stories/babylonjs/Textures/pbr-configuration.stories.js b/packages/storybook-static/stories/babylonjs/Textures/pbr-configuration.stories.js new file mode 100644 index 00000000..e32aee3c --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Textures/pbr-configuration.stories.js @@ -0,0 +1,122 @@ +import React, { useCallback, useState } from 'react'; +import { Vector3, Color3, Texture } from '@babylonjs/core'; + +import { Engine, Scene } from 'react-babylonjs'; + +import '../../style.css'; + +export default { title: 'Textures' }; +var cubeTexture = null; +var cubeTextureClone = null; +const onSceneMounted = (createdArgs) => { + createdArgs.scene.imageProcessingConfiguration.exposure = .6; + createdArgs.scene.imageProcessingConfiguration.contrast = 1.6; +} + +/** + * Official Demo: https://www.babylonjs.com/demos/pbr/ + */ +const WithDynamicConfig = ({ roughness }) => { + let environmentUrl = 'assets/textures/environment.dds' + const [texturesLoaded, setTexturesLoaded] = useState(false); + + const cubeTextureRef = useCallback(node => { + if (node && texturesLoaded === false) { + setTexturesLoaded(true); // trigger render and props assignment + cubeTexture = node; + + cubeTextureClone = cubeTexture.clone(); + cubeTextureClone.name = 'cloned texture' + cubeTextureClone.coordinatesMode = Texture.SKYBOX_MODE; + } + }, []); + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export const DynamicConfig = () => { + const [roughness, setRoughness] = useState(0.0); + const toggleRoughness = () => { + setRoughness((roughness) => roughness === 0.0 ? 1.0 : 0.0); + }; + + return (<> +
+ +
+
+ + + + + +
+ ) +} + +DynamicConfig.story = { + name: 'PBR set roughness', + parameters: + { + notes: 'Experimental API.' + } +} diff --git a/packages/storybook-static/stories/babylonjs/Textures/pbr.stories.js b/packages/storybook-static/stories/babylonjs/Textures/pbr.stories.js new file mode 100644 index 00000000..5084ca71 --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/Textures/pbr.stories.js @@ -0,0 +1,95 @@ +import React, { useCallback, useState } from 'react' +import { Engine, Scene} from 'react-babylonjs' + +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' +import { Texture } from '@babylonjs/core' + +export default { title: 'Textures' }; + +var hdrTexture = null; +var hdrTextureClone = null; +const onSceneMounted = (createdArgs) => { + createdArgs.scene.imageProcessingConfiguration.exposure=.6; + createdArgs.scene.imageProcessingConfiguration.contrast=1.6; +} + +/** + * Official Demo: https://www.babylonjs.com/demos/pbr/ + */ +const WithPBR = () => { + let environmentUrl = 'assets/textures/environment.dds' + + const [_, setTexturesLoaded] = useState(false); + + const hdrTextureRef = useCallback(node => { + if (node) { + setTexturesLoaded(true); // trigger render and props assignment + console.log('hdrTexture', node) + hdrTexture = node; + + hdrTextureClone = hdrTexture.clone(); + hdrTextureClone.coordinatesMode = Texture.SKYBOX_MODE; + } + }, []); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export const PBR = () => ( +
+ +
+) diff --git a/packages/storybook-static/stories/babylonjs/VR/withVr.stories.js b/packages/storybook-static/stories/babylonjs/VR/withVr.stories.js new file mode 100644 index 00000000..4f0e730f --- /dev/null +++ b/packages/storybook-static/stories/babylonjs/VR/withVr.stories.js @@ -0,0 +1,103 @@ +import React, { useState, useRef } from 'react' +import { Engine, Scene, useClick, useHover, useBeforeRender } from 'react-babylonjs' + +import ScaledModelWithProgress from '../ScaledModelWithProgress' +import { Vector3, Color3 } from '@babylonjs/core/Maths/math' +import '../../style.css' + +export default { title: 'VR' }; + +const SpinningIcoSphere = (props) => { + // access Babylon scene objects with same React hook as regular DOM elements + const icoSphereRef = useRef(null); + + const { setRotationY, rotationDelta, rpm, position, color, hoveredColor, name } = props; + + useClick( + () => setRotationY(current => current + rotationDelta), + icoSphereRef + ); + + const [hovered, setHovered] = useState(false); + useHover( + () => setHovered(true), + () => setHovered(false), + icoSphereRef + ); + + useBeforeRender((scene) => { + if (icoSphereRef.current) { + // Delta time smoothes the animation. + var deltaTimeInMillis = scene.getEngine().getDeltaTime(); + icoSphereRef.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + } + }); + + return ( + + ); +} + +const WithVR = (props) => { + + const [rotationY, setRotationY] = useState(Math.PI); + const { showIcoSpheres } = props; + + let baseUrl = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/' + return ( + + + + + + + {showIcoSpheres && + + } + + {showIcoSpheres && + + } + + + + + + + ) +} + +export const SimpleVR = () => { + const [showIcoSpheres, setShowIcoSpheres] = useState(true); + const toggleShowIcoSpheres = () => { + setShowIcoSpheres(current => !current); + }; + return ( + <> +
+ +
+
+ +
+ + ) +}; + +SimpleVR.story = { + name: 'VR', + parameters: { + notes: { + markdown: `Click on ICO spheres to rotate ghettoblaster model (clockwise/counter-clockwise). + + ##In VR mode + Use your hand-held controls to click ICO spheres and teleport by clicking on the ground.` + } + } +} diff --git a/packages/storybook-static/stories/style.css b/packages/storybook-static/stories/style.css new file mode 100644 index 00000000..033dc484 --- /dev/null +++ b/packages/storybook-static/stories/style.css @@ -0,0 +1,25 @@ +#babylonJS{ + display: flex; + flex: 1; + width:100%; + height: 100%; +} + +.second-canvas-babylon{ + display: flex; + flex: 1; + width:100%; + height: 100%; + touch-action: none; +} + +.container { + display: flex; + border: 1px solid #ccc; +} + +.box { + flex: 1; + background-color: lightgreen; + border: 1px dashed black; +} diff --git a/packages/storybook-static/storyboard-site/assets/images/building.jpeg b/packages/storybook-static/storyboard-site/assets/images/building.jpeg new file mode 100755 index 00000000..ab51aee4 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/building.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/ph1.jpg b/packages/storybook-static/storyboard-site/assets/images/ph1.jpg new file mode 100644 index 00000000..3461b094 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/ph1.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/ph3.jpg b/packages/storybook-static/storyboard-site/assets/images/ph3.jpg new file mode 100644 index 00000000..527e91b7 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/ph3.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/photo-1515036551567-bf1198cccc35.jpeg b/packages/storybook-static/storyboard-site/assets/images/photo-1515036551567-bf1198cccc35.jpeg new file mode 100755 index 00000000..6bdc237b Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/photo-1515036551567-bf1198cccc35.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/photo-1516245266743-983948b98d53.jpeg b/packages/storybook-static/storyboard-site/assets/images/photo-1516245266743-983948b98d53.jpeg new file mode 100755 index 00000000..5789de6b Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/photo-1516245266743-983948b98d53.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/photo-1519608487953-e999c86e7455.jpeg b/packages/storybook-static/storyboard-site/assets/images/photo-1519608487953-e999c86e7455.jpeg new file mode 100755 index 00000000..237eb8f1 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/photo-1519608487953-e999c86e7455.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/photo-1533577116850-9cc66cad8a9b.jpeg b/packages/storybook-static/storyboard-site/assets/images/photo-1533577116850-9cc66cad8a9b.jpeg new file mode 100755 index 00000000..a856c84b Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/photo-1533577116850-9cc66cad8a9b.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/images/photo-1548191265-cc70d3d45ba1.jpeg b/packages/storybook-static/storyboard-site/assets/images/photo-1548191265-cc70d3d45ba1.jpeg new file mode 100755 index 00000000..6177d9c7 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/images/photo-1548191265-cc70d3d45ba1.jpeg differ diff --git a/packages/storybook-static/storyboard-site/assets/kitti/000000.bin b/packages/storybook-static/storyboard-site/assets/kitti/000000.bin new file mode 100644 index 00000000..7898a264 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/kitti/000000.bin differ diff --git a/packages/storybook-static/storyboard-site/assets/models/atom.glb b/packages/storybook-static/storyboard-site/assets/models/atom.glb new file mode 100644 index 00000000..d627f712 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/models/atom.glb differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/LateSunset.3dl b/packages/storybook-static/storyboard-site/assets/textures/LateSunset.3dl new file mode 100644 index 00000000..1ad7e22b --- /dev/null +++ b/packages/storybook-static/storyboard-site/assets/textures/LateSunset.3dl @@ -0,0 +1,4916 @@ +#Created by: Adobe Photoshop CS6 +#Copyright: Copyright 2012 Adobe Systems Inc. +0 64 128 192 256 320 384 448 512 575 639 703 767 831 895 959 1023 +0 0 0 +0 0 80 +0 0 225 +0 0 369 +48 0 466 +161 0 562 +257 0 674 +241 0 819 +257 0 931 +145 32 1108 +32 80 1301 +16 64 1461 +0 64 1622 +96 32 1766 +80 32 1847 +225 32 1943 +369 0 2007 +0 48 0 +0 80 128 +0 64 273 +0 64 401 +80 48 514 +145 32 610 +145 48 755 +161 80 931 +96 96 1060 +32 128 1204 +0 128 1397 +0 128 1526 +0 96 1622 +177 64 1766 +241 48 1847 +337 32 1943 +369 64 2056 +0 209 193 +0 209 257 +0 193 353 +0 209 498 +96 177 626 +64 177 739 +96 177 867 +64 193 996 +48 193 1140 +0 193 1285 +0 193 1429 +48 177 1590 +96 161 1670 +241 128 1750 +257 128 1863 +337 128 1959 +434 161 2039 +112 321 418 +112 305 482 +112 321 610 +112 305 691 +80 289 771 +16 305 931 +32 305 1076 +0 289 1140 +48 273 1269 +48 273 1397 +177 273 1477 +177 257 1606 +241 257 1686 +289 241 1766 +369 257 1863 +434 257 1943 +514 257 2039 +369 401 610 +337 401 674 +305 385 723 +273 401 835 +273 385 899 +193 385 1044 +225 369 1108 +289 369 1220 +225 369 1285 +241 369 1413 +305 369 1493 +337 353 1590 +337 353 1686 +401 369 1766 +401 353 1863 +498 385 1975 +546 369 2056 +466 498 658 +482 498 707 +434 514 787 +434 482 867 +385 498 931 +434 498 1028 +418 482 1124 +401 482 1220 +418 482 1317 +418 482 1397 +450 482 1510 +466 498 1606 +514 482 1702 +562 498 1783 +610 498 1863 +642 498 1975 +691 498 2056 +610 610 707 +594 610 755 +578 626 803 +562 626 915 +530 610 964 +562 626 1060 +562 626 1140 +578 626 1220 +514 626 1349 +546 610 1429 +562 594 1510 +578 610 1606 +626 610 1686 +691 610 1799 +707 610 1895 +739 642 1991 +819 626 2072 +739 739 739 +723 755 787 +739 739 851 +723 771 931 +739 755 980 +707 739 1060 +691 755 1172 +723 755 1269 +707 755 1333 +723 755 1429 +755 771 1526 +755 739 1606 +803 771 1718 +803 755 1799 +867 771 1895 +931 787 1975 +980 771 2088 +867 867 771 +867 883 819 +867 883 851 +851 899 931 +835 883 996 +835 899 1108 +851 899 1172 +867 883 1253 +867 899 1333 +883 899 1445 +883 899 1542 +947 883 1606 +996 899 1702 +1044 931 1847 +1060 915 1911 +1076 947 2007 +1188 947 2104 +1044 1060 835 +1044 1060 867 +1044 1060 899 +1028 1060 947 +1044 1076 1044 +1060 1076 1124 +1060 1076 1204 +1076 1060 1285 +1076 1060 1349 +1092 1076 1461 +1156 1092 1542 +1172 1108 1638 +1204 1108 1734 +1285 1124 1847 +1317 1108 1911 +1397 1140 2023 +1477 1172 2136 +1301 1285 851 +1317 1301 899 +1285 1285 899 +1317 1285 996 +1301 1285 1044 +1285 1269 1108 +1317 1285 1204 +1349 1317 1317 +1365 1285 1397 +1381 1301 1461 +1429 1301 1558 +1445 1317 1654 +1493 1317 1734 +1510 1333 1863 +1622 1365 1943 +1670 1365 2039 +1750 1381 2136 +1606 1542 883 +1590 1558 915 +1606 1542 931 +1606 1558 996 +1590 1558 1060 +1606 1558 1140 +1606 1542 1220 +1654 1542 1285 +1638 1542 1397 +1750 1606 1493 +1750 1590 1574 +1750 1590 1654 +1863 1622 1750 +1895 1606 1831 +1943 1638 1991 +2056 1670 2039 +2104 1670 2136 +1927 1831 851 +1959 1831 899 +1927 1847 964 +1943 1831 980 +1991 1879 1028 +1991 1863 1108 +2056 1895 1188 +2072 1895 1269 +2104 1895 1333 +2152 1927 1413 +2168 1911 1493 +2200 1911 1574 +2312 1943 1638 +2329 1943 1734 +2409 1959 1799 +2521 2007 1879 +2602 2023 1943 +2441 2200 450 +2441 2216 514 +2489 2264 562 +2425 2216 642 +2505 2248 707 +2505 2248 819 +2553 2280 883 +2553 2280 996 +2585 2280 1076 +2585 2280 1204 +2666 2296 1301 +2682 2312 1381 +2762 2329 1477 +2810 2361 1574 +2858 2361 1686 +2955 2393 1783 +3019 2425 1927 +2923 2698 482 +2907 2682 466 +2891 2698 530 +2875 2650 546 +2891 2682 691 +2907 2698 787 +2923 2698 931 +2955 2698 1092 +2971 2730 1188 +2955 2714 1285 +3019 2762 1445 +3035 2762 1542 +3067 2778 1670 +3115 2794 1783 +3180 2842 1959 +3196 2842 2072 +3244 2875 2216 +3115 3131 996 +3131 3115 1028 +3115 3131 1028 +3099 3131 1124 +3099 3131 1156 +3099 3180 1349 +3131 3180 1429 +3164 3196 1558 +3148 3196 1670 +3148 3228 1815 +3196 3212 1927 +3180 3244 2072 +3212 3276 2232 +3244 3292 2345 +3244 3276 2441 +3292 3308 2602 +3292 3356 2762 +3196 3629 1718 +3196 3629 1718 +3212 3597 1750 +3180 3629 1783 +3164 3629 1847 +3164 3661 2023 +3196 3645 2088 +3212 3629 2152 +3196 3645 2248 +3196 3694 2425 +3196 3661 2505 +3228 3677 2618 +3228 3726 2778 +3244 3726 2923 +3244 3726 3019 +3292 3774 3196 +3308 3774 3292 +96 0 0 +96 0 80 +48 0 289 +80 0 369 +193 0 498 +225 0 594 +257 0 707 +257 0 835 +209 32 1028 +145 48 1156 +48 80 1349 +0 64 1461 +0 80 1654 +96 32 1718 +273 0 1815 +289 16 1927 +385 0 2023 +64 48 0 +80 32 96 +0 64 305 +96 48 401 +112 16 482 +209 32 626 +241 48 771 +225 64 915 +145 80 1060 +112 112 1253 +0 128 1397 +0 128 1526 +80 80 1638 +177 64 1766 +337 64 1847 +401 32 1927 +369 64 2056 +128 177 161 +64 177 257 +112 177 385 +128 177 530 +128 193 642 +145 193 771 +96 177 851 +128 193 1028 +48 193 1172 +0 193 1317 +0 193 1461 +177 145 1558 +96 161 1654 +241 128 1734 +273 145 1879 +385 112 1927 +482 128 2039 +257 289 450 +241 305 498 +177 305 578 +193 305 707 +193 289 819 +112 305 915 +80 305 1076 +16 289 1172 +48 289 1269 +161 257 1365 +161 257 1461 +241 241 1606 +241 257 1686 +289 241 1766 +369 241 1879 +434 257 1943 +498 241 2039 +418 385 594 +369 401 674 +337 385 739 +289 385 819 +305 401 931 +273 385 1028 +273 385 1108 +305 385 1220 +289 369 1301 +305 385 1413 +289 369 1493 +353 369 1590 +353 353 1686 +434 369 1783 +482 369 1863 +546 385 1959 +578 353 2056 +530 482 642 +498 482 707 +466 498 771 +482 498 851 +450 498 947 +466 482 1028 +434 482 1124 +450 498 1220 +482 498 1333 +418 482 1397 +450 498 1510 +514 498 1622 +546 482 1686 +562 482 1783 +610 498 1863 +626 482 1975 +739 498 2072 +658 610 723 +626 610 771 +594 610 803 +594 610 867 +594 626 996 +562 610 1060 +562 610 1108 +610 626 1237 +562 610 1317 +546 594 1429 +626 594 1510 +594 610 1622 +626 610 1686 +691 610 1799 +707 610 1895 +819 642 1975 +883 610 2056 +771 739 739 +755 739 803 +739 739 835 +739 755 899 +739 755 980 +707 755 1060 +707 739 1172 +723 755 1269 +707 755 1333 +739 771 1445 +755 771 1526 +771 755 1606 +835 771 1734 +835 771 1783 +915 771 1895 +915 771 1975 +1012 771 2056 +883 883 787 +899 883 803 +867 883 851 +883 899 915 +883 899 1028 +867 883 1092 +867 883 1156 +867 883 1253 +899 883 1333 +899 899 1429 +980 899 1542 +947 899 1638 +1012 915 1734 +1044 931 1831 +1092 931 1911 +1108 931 2007 +1172 947 2088 +1092 1060 835 +1076 1076 851 +1044 1060 867 +1060 1060 931 +1060 1076 1044 +1060 1076 1124 +1092 1060 1172 +1092 1076 1285 +1108 1076 1349 +1108 1076 1429 +1140 1076 1526 +1188 1076 1622 +1237 1092 1734 +1285 1108 1847 +1333 1124 1927 +1397 1140 2023 +1477 1172 2136 +1333 1285 867 +1333 1285 883 +1317 1269 899 +1317 1285 996 +1301 1269 1060 +1301 1285 1140 +1317 1285 1220 +1365 1301 1285 +1397 1317 1381 +1413 1317 1477 +1445 1317 1574 +1461 1317 1622 +1493 1317 1750 +1526 1317 1863 +1638 1365 1943 +1686 1365 2023 +1766 1397 2120 +1606 1542 883 +1622 1542 915 +1606 1542 931 +1622 1558 980 +1622 1558 1060 +1638 1558 1156 +1654 1558 1220 +1718 1590 1301 +1702 1590 1397 +1734 1590 1493 +1799 1590 1590 +1766 1590 1670 +1847 1622 1766 +1911 1606 1863 +1975 1670 1975 +2007 1654 2072 +2104 1686 2152 +2023 1895 851 +1975 1847 899 +1927 1847 964 +2007 1879 947 +2007 1879 1044 +2007 1863 1108 +2023 1863 1204 +2072 1879 1269 +2072 1879 1349 +2104 1879 1429 +2184 1911 1493 +2200 1911 1590 +2312 1943 1622 +2329 1943 1734 +2425 1975 1783 +2505 1991 1879 +2602 2023 1959 +2441 2216 514 +2441 2216 514 +2441 2216 562 +2489 2248 610 +2505 2248 707 +2489 2248 819 +2553 2280 883 +2569 2264 996 +2569 2280 1108 +2585 2280 1204 +2666 2296 1301 +2666 2312 1381 +2762 2345 1493 +2778 2329 1574 +2875 2361 1686 +2955 2393 1783 +3035 2441 1927 +2907 2682 466 +2891 2634 418 +2875 2698 466 +2923 2698 594 +2907 2698 691 +2923 2714 803 +2939 2698 931 +2955 2698 1060 +2971 2730 1204 +2971 2714 1285 +3019 2762 1445 +3035 2762 1542 +3099 2762 1654 +3115 2794 1783 +3180 2842 1959 +3228 2891 2136 +3276 2875 2232 +3115 3131 996 +3131 3180 1076 +3131 3196 1172 +3131 3196 1220 +3115 3196 1285 +3115 3196 1317 +3131 3180 1429 +3099 3180 1526 +3180 3180 1654 +3164 3228 1831 +3196 3212 1911 +3180 3212 2023 +3212 3276 2232 +3228 3276 2345 +3244 3276 2441 +3276 3308 2602 +3324 3356 2810 +3180 3613 1702 +3228 3613 1718 +3212 3613 1750 +3180 3629 1783 +3180 3645 1943 +3212 3661 1991 +3196 3661 2104 +3212 3645 2184 +3180 3645 2248 +3196 3677 2425 +3212 3694 2553 +3228 3677 2618 +3228 3726 2778 +3244 3742 2923 +3276 3774 3099 +3292 3758 3164 +3308 3774 3292 +225 0 0 +241 0 64 +225 0 225 +257 0 385 +257 0 482 +305 0 594 +321 0 755 +305 0 851 +241 32 1028 +209 48 1172 +112 80 1349 +48 80 1510 +0 80 1638 +209 16 1734 +353 0 1847 +385 0 1943 +434 0 2023 +225 64 64 +225 32 177 +209 32 305 +241 32 434 +257 64 562 +273 48 674 +289 80 819 +257 96 980 +209 112 1092 +145 96 1220 +48 128 1413 +64 128 1558 +112 96 1670 +241 48 1734 +337 48 1831 +418 48 1943 +482 32 2023 +273 177 273 +289 177 353 +273 177 450 +241 161 546 +225 209 723 +225 177 787 +177 193 947 +225 177 1044 +80 193 1204 +64 193 1317 +64 193 1461 +193 145 1558 +321 128 1654 +337 112 1766 +353 145 1863 +418 128 1943 +482 128 2039 +353 289 498 +321 289 530 +305 305 658 +273 289 739 +225 305 867 +161 305 996 +145 289 1092 +80 289 1188 +209 273 1301 +241 257 1381 +257 257 1493 +321 257 1590 +385 257 1686 +401 225 1750 +482 241 1847 +450 257 1959 +610 241 2039 +450 385 610 +450 385 691 +418 385 755 +434 385 835 +385 385 915 +353 369 1028 +385 385 1140 +385 369 1204 +353 369 1317 +401 369 1397 +401 369 1477 +450 353 1590 +434 385 1686 +418 369 1783 +546 369 1895 +594 353 1959 +626 353 2039 +546 482 642 +562 498 723 +546 498 771 +514 498 867 +530 482 931 +514 482 1044 +498 482 1140 +482 482 1220 +498 498 1317 +466 482 1397 +514 498 1526 +514 498 1622 +562 498 1702 +594 466 1783 +610 482 1863 +674 498 1959 +771 482 2056 +658 610 723 +658 610 739 +642 626 819 +626 610 899 +626 626 980 +626 610 1044 +626 594 1108 +610 610 1220 +594 594 1317 +626 610 1413 +642 610 1526 +642 626 1622 +723 626 1686 +707 610 1815 +755 626 1895 +819 642 1975 +899 626 2072 +787 723 739 +803 739 787 +787 755 835 +755 739 899 +755 739 980 +739 755 1076 +771 755 1172 +755 739 1237 +723 739 1333 +771 755 1445 +787 755 1526 +835 755 1606 +867 739 1718 +899 771 1815 +915 771 1895 +980 787 2007 +1044 771 2072 +915 883 755 +931 883 819 +899 883 867 +915 883 915 +931 899 1012 +899 899 1076 +899 883 1172 +915 899 1269 +931 899 1333 +947 899 1445 +980 899 1542 +980 883 1606 +1044 915 1734 +1060 931 1815 +1124 915 1911 +1140 931 1991 +1237 947 2088 +1108 1060 835 +1092 1060 867 +1092 1060 883 +1076 1044 947 +1076 1060 1044 +1092 1060 1092 +1140 1076 1204 +1140 1076 1285 +1140 1076 1365 +1172 1076 1445 +1172 1092 1542 +1253 1124 1670 +1301 1108 1734 +1333 1108 1831 +1381 1124 1943 +1397 1140 2023 +1477 1156 2120 +1333 1285 867 +1333 1285 883 +1333 1285 915 +1349 1285 980 +1317 1285 1044 +1349 1285 1108 +1333 1269 1204 +1397 1285 1301 +1413 1301 1381 +1413 1317 1477 +1445 1317 1542 +1493 1317 1638 +1526 1333 1750 +1606 1349 1863 +1638 1365 1943 +1702 1381 2023 +1750 1381 2104 +1638 1542 883 +1654 1542 899 +1638 1558 931 +1638 1542 980 +1622 1558 1076 +1638 1558 1156 +1654 1542 1204 +1718 1590 1301 +1718 1574 1397 +1783 1590 1493 +1783 1574 1574 +1799 1590 1654 +1879 1606 1734 +1975 1654 1847 +1991 1622 1959 +2056 1670 2039 +2120 1686 2168 +2039 1863 851 +2056 1879 883 +2023 1879 915 +2039 1879 980 +2072 1911 1012 +2072 1895 1092 +2088 1895 1188 +2104 1895 1253 +2168 1927 1317 +2184 1911 1413 +2200 1911 1461 +2216 1911 1558 +2329 1927 1622 +2361 1943 1734 +2457 1975 1783 +2537 1991 1879 +2585 2007 1943 +2521 2248 418 +2521 2248 530 +2537 2296 514 +2521 2248 610 +2505 2248 691 +2521 2248 819 +2553 2264 883 +2585 2280 964 +2602 2280 1108 +2650 2296 1204 +2682 2296 1269 +2762 2345 1397 +2762 2345 1493 +2858 2361 1558 +2858 2361 1686 +2955 2393 1783 +3019 2425 1927 +2923 2698 418 +2907 2682 482 +2907 2682 466 +2907 2698 594 +2923 2714 723 +2939 2698 803 +2939 2698 931 +2987 2730 1076 +2971 2714 1188 +3035 2778 1349 +3051 2762 1445 +3083 2778 1574 +3083 2762 1654 +3164 2842 1831 +3196 2858 1975 +3228 2891 2136 +3260 2858 2216 +3148 3196 1092 +3131 3196 1092 +3099 3131 1076 +3115 3180 1204 +3115 3180 1237 +3148 3180 1317 +3164 3196 1477 +3148 3180 1542 +3164 3228 1718 +3180 3212 1815 +3212 3228 1927 +3180 3260 2088 +3260 3276 2248 +3276 3292 2361 +3292 3276 2457 +3308 3324 2585 +3340 3372 2810 +3212 3613 1702 +3228 3613 1718 +3244 3661 1831 +3196 3613 1783 +3196 3613 1863 +3212 3661 1991 +3228 3645 2104 +3212 3645 2168 +3228 3677 2329 +3228 3677 2425 +3228 3694 2537 +3260 3726 2698 +3260 3710 2778 +3292 3726 2907 +3276 3758 3083 +3292 3774 3196 +3308 3822 3340 +434 0 64 +401 0 177 +369 0 289 +369 0 418 +401 0 578 +385 0 658 +353 32 835 +337 64 980 +321 64 1092 +257 80 1237 +177 96 1413 +145 64 1526 +241 48 1654 +353 0 1734 +434 0 1847 +466 16 1943 +530 0 2039 +401 48 209 +385 48 289 +369 32 385 +401 48 498 +369 48 610 +337 80 739 +321 96 899 +289 96 996 +273 112 1140 +241 112 1285 +128 128 1429 +289 80 1574 +353 64 1670 +353 48 1766 +401 32 1847 +482 16 1943 +562 48 2039 +385 177 353 +401 177 418 +369 177 530 +353 161 610 +337 177 707 +273 177 851 +289 177 947 +257 193 1108 +177 209 1269 +193 209 1397 +321 145 1461 +337 145 1574 +353 145 1670 +401 128 1766 +466 128 1847 +530 112 1943 +546 128 2023 +450 289 546 +418 289 594 +401 289 674 +369 289 787 +337 289 883 +337 305 1028 +305 289 1092 +353 257 1204 +353 257 1285 +337 241 1365 +401 241 1477 +418 241 1590 +418 241 1654 +498 241 1783 +498 257 1863 +562 241 1943 +642 257 2056 +562 353 610 +530 369 674 +530 369 771 +498 385 851 +514 369 915 +482 369 1012 +466 353 1108 +434 369 1220 +434 369 1317 +434 353 1397 +450 369 1493 +498 369 1574 +482 369 1686 +514 353 1766 +594 369 1863 +642 353 1975 +691 369 2039 +642 482 674 +642 482 723 +626 482 787 +594 482 851 +578 498 964 +578 482 1044 +578 482 1140 +530 482 1237 +546 482 1333 +530 498 1413 +594 498 1526 +594 498 1606 +642 482 1686 +658 498 1799 +691 514 1911 +755 482 1943 +819 482 2056 +787 610 707 +739 626 771 +739 610 819 +707 626 883 +707 626 996 +691 610 1060 +674 610 1140 +658 626 1253 +674 610 1333 +691 610 1413 +707 610 1493 +723 626 1638 +739 610 1686 +787 626 1799 +803 626 1911 +835 610 1975 +899 626 2072 +851 739 739 +851 723 787 +835 739 835 +819 739 915 +819 755 996 +819 755 1076 +803 739 1156 +803 739 1220 +819 739 1333 +819 755 1429 +851 755 1526 +867 755 1606 +899 755 1718 +931 787 1799 +996 771 1879 +996 771 1991 +1092 819 2120 +996 899 771 +996 899 819 +980 899 867 +947 883 899 +964 883 980 +947 883 1092 +931 883 1188 +947 899 1285 +964 899 1333 +996 915 1445 +996 883 1526 +1044 899 1606 +1108 915 1734 +1108 947 1831 +1188 931 1911 +1204 947 2023 +1253 947 2088 +1124 1060 835 +1124 1060 867 +1156 1060 883 +1140 1076 964 +1140 1060 1028 +1172 1076 1108 +1172 1060 1172 +1188 1076 1301 +1188 1076 1381 +1188 1076 1461 +1220 1092 1526 +1253 1108 1638 +1317 1124 1750 +1349 1124 1815 +1381 1140 1959 +1461 1140 2007 +1526 1172 2120 +1413 1285 851 +1413 1285 883 +1397 1269 899 +1349 1285 980 +1365 1285 1044 +1397 1317 1140 +1397 1301 1220 +1413 1301 1301 +1445 1317 1397 +1493 1317 1477 +1510 1317 1542 +1526 1317 1654 +1542 1317 1734 +1670 1365 1863 +1686 1365 1959 +1750 1381 2056 +1783 1381 2120 +1686 1542 867 +1702 1558 899 +1670 1542 931 +1654 1542 1012 +1702 1558 1060 +1702 1542 1140 +1734 1574 1220 +1734 1574 1317 +1766 1590 1413 +1783 1590 1510 +1783 1590 1574 +1879 1622 1654 +1911 1622 1750 +1975 1670 1895 +2007 1638 1975 +2088 1670 2039 +2200 1718 2152 +2072 1863 851 +2120 1895 851 +2056 1863 915 +2104 1895 947 +2136 1895 980 +2120 1911 1092 +2088 1895 1188 +2184 1927 1237 +2168 1911 1317 +2232 1927 1397 +2232 1911 1477 +2329 1927 1542 +2361 1943 1654 +2409 1959 1686 +2457 1959 1783 +2585 2023 1863 +2650 2023 1943 +2585 2280 401 +2585 2280 466 +2585 2264 514 +2569 2264 610 +2569 2280 707 +2569 2280 771 +2602 2280 867 +2585 2280 964 +2682 2312 1076 +2698 2312 1188 +2698 2312 1285 +2778 2329 1397 +2826 2361 1445 +2875 2345 1542 +2907 2361 1670 +3003 2425 1799 +3035 2409 1927 +2955 2698 498 +2971 2698 514 +2955 2698 562 +2955 2698 626 +2955 2698 723 +2955 2682 803 +2971 2698 947 +2971 2682 1044 +3019 2778 1237 +3035 2762 1317 +3051 2762 1445 +3083 2762 1558 +3148 2842 1766 +3164 2842 1831 +3228 2842 1975 +3260 2875 2136 +3276 2875 2232 +3164 3180 1092 +3164 3180 1076 +3164 3180 1124 +3131 3196 1172 +3148 3180 1253 +3148 3180 1333 +3180 3196 1493 +3180 3180 1558 +3212 3228 1718 +3212 3212 1831 +3212 3260 1959 +3212 3292 2136 +3260 3292 2248 +3276 3292 2345 +3292 3324 2473 +3308 3356 2666 +3340 3356 2778 +3244 3645 1783 +3228 3613 1718 +3244 3645 1831 +3260 3629 1879 +3212 3645 1943 +3244 3694 2072 +3228 3694 2152 +3212 3694 2232 +3228 3677 2329 +3244 3694 2473 +3260 3694 2537 +3276 3726 2666 +3276 3710 2762 +3292 3726 2907 +3308 3758 3099 +3308 3774 3212 +3340 3806 3340 +482 0 209 +514 0 321 +498 0 401 +482 0 514 +466 16 642 +466 16 739 +418 64 867 +385 64 1028 +369 48 1124 +321 96 1365 +337 64 1477 +434 32 1574 +434 16 1670 +514 0 1766 +514 0 1847 +562 0 1927 +610 16 2056 +514 48 305 +514 64 369 +498 80 498 +482 96 610 +450 80 691 +418 96 819 +401 96 964 +385 112 1108 +369 128 1237 +337 96 1365 +401 80 1477 +450 64 1558 +466 64 1670 +498 48 1783 +498 64 1863 +562 48 1959 +626 64 2039 +546 161 434 +514 161 498 +498 177 594 +450 177 691 +450 193 851 +434 193 915 +401 193 1076 +369 193 1188 +385 177 1285 +434 161 1381 +434 145 1477 +482 112 1574 +466 128 1686 +482 161 1766 +562 128 1895 +610 128 1943 +658 128 2039 +578 273 594 +578 273 642 +546 273 707 +498 289 819 +498 273 931 +466 273 1028 +466 257 1092 +482 273 1220 +482 257 1301 +498 257 1397 +514 241 1493 +530 241 1590 +562 225 1670 +578 225 1766 +610 241 1863 +658 241 1959 +723 225 2039 +658 353 642 +658 353 691 +642 369 755 +626 353 851 +594 353 947 +594 353 1012 +578 369 1124 +562 353 1220 +578 353 1317 +578 369 1413 +594 369 1510 +594 353 1590 +594 385 1702 +626 369 1783 +691 369 1879 +674 353 1943 +739 369 2023 +739 482 674 +755 482 723 +723 466 787 +707 482 867 +674 482 947 +691 482 1044 +642 466 1124 +642 498 1253 +610 482 1317 +674 482 1413 +658 498 1510 +691 498 1622 +691 498 1702 +739 482 1783 +787 498 1863 +803 498 1959 +867 498 2056 +835 610 723 +819 610 771 +787 610 835 +787 610 899 +755 594 964 +739 626 1076 +739 594 1140 +739 610 1237 +739 610 1349 +771 626 1429 +755 610 1526 +787 610 1622 +819 610 1686 +867 642 1815 +899 626 1879 +931 626 1975 +980 626 2072 +931 739 771 +931 739 787 +915 739 835 +899 723 899 +883 739 1012 +867 755 1060 +899 755 1172 +883 739 1237 +867 755 1365 +883 739 1445 +947 755 1526 +947 771 1622 +947 787 1718 +1012 771 1815 +1012 787 1895 +1076 771 1991 +1172 803 2072 +1060 883 771 +1028 867 819 +1012 867 867 +1028 867 915 +1012 867 996 +1028 883 1092 +1028 915 1188 +1028 899 1269 +1044 899 1333 +1076 899 1413 +1076 915 1558 +1124 915 1622 +1108 931 1734 +1188 915 1815 +1188 931 1911 +1285 964 1991 +1285 947 2104 +1220 1044 803 +1237 1076 851 +1220 1060 899 +1220 1076 947 +1204 1076 1028 +1220 1092 1124 +1237 1092 1204 +1220 1076 1285 +1237 1092 1381 +1285 1124 1461 +1349 1108 1558 +1333 1124 1654 +1365 1124 1734 +1413 1140 1815 +1445 1140 1943 +1510 1156 2039 +1606 1188 2120 +1461 1301 851 +1477 1285 883 +1461 1285 931 +1477 1301 964 +1477 1317 1060 +1461 1301 1124 +1477 1301 1204 +1477 1317 1317 +1477 1317 1381 +1526 1317 1461 +1542 1317 1542 +1558 1333 1638 +1654 1381 1750 +1686 1381 1863 +1718 1365 1943 +1766 1397 2039 +1911 1429 2136 +1799 1590 883 +1799 1574 899 +1799 1590 931 +1783 1590 996 +1766 1574 1060 +1750 1590 1156 +1783 1590 1220 +1815 1606 1317 +1815 1590 1397 +1847 1606 1510 +1879 1622 1574 +1943 1606 1638 +1991 1654 1783 +2023 1654 1879 +2088 1670 1959 +2152 1686 2056 +2248 1702 2120 +2184 1895 803 +2168 1879 803 +2120 1879 883 +2184 1895 915 +2152 1895 996 +2152 1895 1044 +2200 1911 1140 +2184 1927 1237 +2216 1895 1317 +2216 1911 1381 +2329 1943 1477 +2377 1943 1542 +2425 1975 1606 +2457 1975 1702 +2569 1991 1783 +2650 2039 1863 +2714 2039 1911 +2602 2264 401 +2618 2264 466 +2618 2264 514 +2634 2280 594 +2618 2280 658 +2650 2312 739 +2650 2296 851 +2666 2296 964 +2698 2296 1076 +2698 2312 1188 +2778 2345 1269 +2810 2329 1397 +2858 2361 1461 +2891 2361 1558 +3019 2409 1702 +3035 2425 1815 +3083 2409 1943 +2987 2698 450 +3003 2730 546 +2987 2682 514 +3003 2714 658 +3019 2730 771 +3003 2730 851 +3003 2730 980 +3019 2714 1060 +3051 2762 1204 +3083 2762 1333 +3099 2762 1461 +3148 2794 1590 +3148 2858 1766 +3228 2858 1863 +3228 2858 1975 +3276 2891 2152 +3276 2875 2232 +3196 3180 1092 +3196 3164 1092 +3212 3196 1156 +3212 3196 1237 +3196 3196 1269 +3212 3228 1445 +3196 3228 1558 +3228 3228 1622 +3228 3212 1734 +3228 3260 1863 +3228 3292 2007 +3260 3276 2136 +3292 3292 2264 +3308 3324 2409 +3308 3356 2569 +3340 3372 2682 +3372 3404 2842 +3276 3629 1783 +3276 3629 1783 +3276 3645 1831 +3292 3677 1959 +3260 3694 1991 +3228 3677 2056 +3260 3677 2120 +3260 3694 2248 +3260 3694 2329 +3260 3694 2441 +3276 3710 2585 +3308 3726 2698 +3276 3726 2794 +3292 3726 2907 +3340 3742 3083 +3340 3774 3212 +3356 3838 3404 +610 32 369 +594 48 418 +578 16 514 +578 48 626 +546 48 739 +530 48 867 +514 64 1028 +482 64 1156 +466 80 1253 +466 64 1365 +498 32 1461 +530 16 1558 +530 0 1670 +562 16 1766 +626 0 1847 +658 16 1959 +691 32 2056 +610 96 434 +626 80 514 +594 80 578 +562 96 691 +562 96 819 +530 96 931 +530 80 1044 +498 128 1188 +498 96 1269 +514 80 1365 +546 80 1477 +562 32 1590 +578 48 1670 +594 64 1766 +626 64 1879 +658 48 1943 +739 48 2039 +642 161 530 +658 177 610 +610 177 707 +594 161 787 +594 177 899 +562 177 996 +514 161 1076 +562 145 1204 +530 145 1285 +546 128 1381 +594 96 1477 +562 145 1574 +610 128 1670 +642 128 1783 +658 145 1879 +674 161 1959 +771 112 2039 +707 241 594 +691 241 658 +658 257 739 +674 225 835 +642 241 915 +626 257 1044 +610 257 1124 +610 241 1237 +626 225 1317 +610 241 1397 +626 257 1477 +642 241 1574 +674 241 1686 +642 241 1783 +723 257 1879 +771 257 1975 +771 241 2039 +771 337 626 +755 353 707 +755 353 771 +723 353 851 +707 369 964 +707 353 1028 +707 353 1140 +658 353 1237 +658 369 1333 +707 369 1397 +674 369 1510 +691 369 1606 +739 353 1686 +787 353 1766 +771 369 1879 +803 353 1943 +819 385 2072 +835 450 674 +835 450 723 +819 466 787 +787 482 899 +803 482 980 +739 482 1060 +755 498 1156 +755 482 1253 +755 498 1349 +771 482 1429 +755 482 1510 +787 482 1606 +787 498 1718 +819 498 1783 +867 498 1863 +915 514 1991 +980 514 2088 +899 578 723 +915 594 771 +883 594 819 +883 610 883 +851 594 964 +835 610 1044 +835 610 1156 +851 626 1253 +851 610 1333 +851 626 1413 +867 610 1526 +899 626 1638 +947 626 1718 +931 626 1799 +980 626 1879 +1044 642 1975 +1060 642 2072 +1012 739 771 +1012 755 803 +996 755 851 +980 739 915 +996 771 1012 +980 755 1092 +947 755 1172 +980 755 1253 +996 755 1365 +980 755 1445 +1028 739 1510 +1012 787 1622 +1044 771 1718 +1076 787 1815 +1124 787 1895 +1156 787 2007 +1220 803 2088 +1124 883 803 +1124 899 835 +1108 899 883 +1092 899 931 +1140 899 1012 +1124 899 1092 +1124 899 1172 +1092 883 1253 +1140 915 1349 +1140 915 1461 +1156 915 1542 +1156 915 1638 +1204 931 1734 +1269 931 1831 +1269 964 1927 +1333 964 2007 +1397 980 2104 +1333 1076 835 +1317 1076 851 +1317 1076 915 +1301 1092 964 +1301 1076 1028 +1301 1092 1124 +1301 1092 1220 +1285 1092 1285 +1301 1076 1349 +1397 1108 1461 +1397 1124 1558 +1413 1124 1638 +1461 1140 1750 +1510 1140 1831 +1574 1156 1943 +1590 1172 2056 +1622 1172 2120 +1542 1317 867 +1558 1301 883 +1526 1317 931 +1542 1317 996 +1526 1301 1060 +1542 1301 1140 +1542 1317 1204 +1558 1317 1301 +1574 1333 1397 +1622 1333 1493 +1654 1349 1574 +1702 1349 1654 +1718 1365 1783 +1766 1397 1863 +1831 1397 1943 +1847 1397 2039 +1959 1429 2136 +1831 1574 883 +1831 1574 915 +1847 1590 915 +1847 1574 964 +1847 1590 1060 +1847 1606 1156 +1863 1606 1253 +1863 1590 1333 +1847 1590 1381 +1927 1606 1477 +1975 1622 1574 +2023 1638 1670 +2039 1654 1766 +2088 1686 1879 +2136 1686 1975 +2232 1702 2039 +2361 1718 2088 +2216 1879 803 +2216 1879 803 +2248 1911 835 +2184 1879 899 +2248 1911 964 +2216 1911 1060 +2232 1911 1124 +2345 1959 1188 +2329 1943 1269 +2377 1943 1365 +2393 1943 1461 +2441 1959 1510 +2553 2007 1574 +2569 2007 1670 +2618 2023 1750 +2682 2023 1831 +2778 2072 1895 +2666 2280 385 +2650 2264 434 +2698 2312 482 +2698 2280 578 +2698 2296 674 +2698 2296 755 +2730 2296 835 +2714 2296 947 +2762 2345 1060 +2794 2345 1172 +2858 2361 1269 +2891 2361 1381 +2955 2409 1493 +2987 2409 1590 +3019 2425 1702 +3099 2441 1815 +3180 2489 1991 +3019 2714 482 +3019 2730 498 +3051 2714 562 +3067 2778 723 +3099 2762 819 +3067 2778 899 +3099 2778 1044 +3115 2778 1124 +3099 2762 1220 +3148 2794 1397 +3164 2794 1510 +3164 2858 1638 +3212 2842 1766 +3276 2891 1927 +3308 2891 2023 +3292 2875 2136 +3356 2955 2345 +3276 3212 1188 +3228 3180 1156 +3244 3180 1156 +3244 3228 1269 +3260 3228 1381 +3228 3212 1445 +3244 3276 1590 +3260 3260 1702 +3244 3260 1766 +3244 3292 1927 +3292 3276 2023 +3324 3292 2168 +3340 3324 2296 +3340 3356 2489 +3356 3356 2537 +3356 3404 2746 +3388 3421 2907 +3308 3661 1847 +3324 3694 1895 +3340 3661 1895 +3324 3694 1975 +3324 3661 1991 +3292 3694 2088 +3276 3710 2184 +3292 3694 2280 +3292 3677 2345 +3308 3726 2505 +3340 3726 2618 +3308 3726 2714 +3340 3758 2875 +3356 3758 2971 +3356 3806 3148 +3372 3806 3244 +3388 3822 3388 +723 48 514 +739 32 562 +707 32 642 +707 48 755 +674 48 883 +642 64 964 +658 48 1108 +658 16 1188 +674 0 1285 +626 32 1397 +674 0 1477 +691 0 1574 +723 0 1654 +691 0 1750 +771 0 1863 +803 16 1959 +851 0 2039 +755 80 530 +739 80 610 +723 96 691 +691 80 819 +707 96 915 +674 80 996 +707 64 1092 +658 64 1204 +707 48 1285 +691 32 1365 +707 32 1510 +707 48 1606 +691 32 1654 +739 32 1783 +771 32 1847 +803 48 1943 +803 80 2056 +803 112 578 +771 128 674 +771 145 755 +755 128 835 +739 112 915 +723 112 1028 +707 112 1124 +707 128 1220 +707 128 1301 +707 128 1381 +739 112 1493 +707 112 1574 +739 96 1686 +755 112 1766 +739 128 1863 +819 128 1975 +835 145 2056 +867 209 626 +835 209 674 +819 225 787 +819 225 883 +787 225 931 +787 225 1044 +771 209 1108 +787 225 1220 +723 241 1301 +755 225 1397 +739 241 1493 +771 241 1606 +771 257 1718 +803 241 1783 +835 225 1895 +803 257 1959 +883 257 2056 +867 337 642 +883 337 723 +851 321 771 +851 321 851 +835 353 980 +819 337 1044 +835 337 1140 +819 353 1253 +771 353 1301 +803 353 1413 +787 353 1493 +835 369 1606 +867 369 1718 +835 353 1799 +867 385 1879 +915 369 1927 +980 385 2056 +931 466 691 +931 482 739 +931 466 819 +931 466 883 +899 466 980 +915 482 1060 +883 482 1140 +867 482 1237 +851 482 1317 +835 482 1429 +883 482 1510 +851 482 1606 +899 482 1686 +931 498 1799 +947 514 1911 +1028 514 1975 +1076 514 2056 +996 610 755 +1012 594 771 +1012 610 835 +1028 610 915 +980 610 996 +947 610 1060 +947 610 1172 +947 610 1253 +947 610 1333 +931 626 1445 +964 610 1510 +980 626 1606 +996 626 1702 +1044 626 1815 +1060 642 1895 +1108 658 1975 +1140 658 2088 +1108 755 787 +1108 755 803 +1092 739 835 +1092 739 915 +1092 755 980 +1092 755 1092 +1092 755 1188 +1060 755 1269 +1076 771 1365 +1092 755 1429 +1108 771 1526 +1108 787 1622 +1140 787 1718 +1172 771 1783 +1253 803 1895 +1253 803 1991 +1301 819 2104 +1237 899 819 +1220 899 803 +1204 883 883 +1188 883 931 +1188 883 996 +1220 899 1092 +1204 915 1220 +1220 915 1285 +1237 931 1365 +1253 915 1477 +1269 931 1558 +1317 931 1638 +1317 931 1718 +1333 947 1831 +1381 964 1911 +1461 980 2023 +1493 980 2104 +1413 1092 835 +1397 1092 867 +1397 1076 883 +1381 1092 964 +1397 1124 1028 +1429 1108 1140 +1397 1108 1220 +1429 1124 1317 +1429 1124 1397 +1445 1124 1461 +1461 1140 1558 +1510 1140 1654 +1558 1140 1734 +1590 1172 1847 +1606 1188 1943 +1638 1172 2007 +1734 1204 2120 +1638 1301 851 +1638 1317 883 +1622 1301 931 +1622 1301 964 +1622 1317 1044 +1638 1317 1140 +1622 1317 1204 +1638 1333 1317 +1638 1317 1381 +1686 1349 1493 +1750 1349 1558 +1766 1365 1654 +1815 1413 1783 +1847 1397 1863 +1959 1429 1959 +1975 1445 2056 +1991 1461 2136 +1943 1590 899 +1911 1590 899 +1927 1606 947 +1943 1590 1012 +1927 1590 1060 +1943 1622 1156 +1927 1622 1220 +1943 1622 1317 +1991 1622 1413 +2007 1622 1493 +2072 1670 1574 +2120 1686 1654 +2120 1686 1783 +2152 1670 1879 +2264 1702 1927 +2361 1734 1975 +2441 1750 2072 +2312 1911 755 +2312 1911 787 +2312 1911 819 +2296 1911 883 +2377 1943 899 +2361 1943 996 +2361 1943 1076 +2393 1959 1172 +2409 1959 1269 +2441 1959 1301 +2489 1975 1413 +2569 2007 1493 +2618 2023 1542 +2650 2039 1654 +2730 2039 1734 +2794 2088 1815 +2875 2136 1895 +2762 2312 321 +2746 2280 434 +2746 2296 450 +2746 2296 546 +2746 2312 658 +2778 2296 739 +2794 2345 851 +2810 2345 980 +2858 2361 1044 +2875 2361 1172 +2907 2361 1253 +2971 2409 1397 +3019 2425 1493 +3051 2441 1606 +3099 2457 1718 +3164 2505 1863 +3244 2521 1991 +3131 2762 578 +3131 2746 562 +3115 2778 626 +3115 2746 674 +3131 2762 787 +3131 2778 931 +3164 2810 1076 +3131 2762 1124 +3148 2794 1253 +3180 2794 1365 +3212 2875 1558 +3244 2842 1654 +3276 2875 1815 +3308 2875 1927 +3292 2891 2023 +3356 2971 2248 +3404 2971 2361 +3276 3228 1188 +3292 3196 1188 +3292 3244 1301 +3292 3244 1333 +3292 3260 1413 +3308 3292 1558 +3276 3308 1654 +3276 3292 1750 +3308 3292 1831 +3340 3292 1943 +3340 3324 2104 +3340 3356 2280 +3356 3356 2393 +3388 3372 2505 +3388 3404 2666 +3421 3421 2810 +3421 3469 2971 +3356 3677 1879 +3356 3694 1911 +3356 3694 1911 +3372 3677 1975 +3340 3677 2007 +3308 3677 2104 +3324 3726 2232 +3356 3726 2312 +3340 3726 2409 +3356 3726 2489 +3356 3758 2682 +3372 3758 2778 +3372 3742 2875 +3356 3774 3019 +3388 3838 3196 +3421 3870 3324 +3437 3854 3453 +883 0 578 +883 0 658 +867 0 739 +851 0 835 +819 0 915 +835 0 1028 +819 0 1124 +851 0 1220 +835 0 1301 +819 0 1381 +835 0 1493 +819 0 1590 +851 0 1686 +835 16 1766 +851 32 1879 +899 16 1975 +931 32 2072 +899 16 594 +883 32 642 +899 16 739 +867 32 819 +851 48 915 +835 32 1028 +819 32 1108 +851 16 1253 +851 0 1333 +851 48 1397 +835 32 1477 +851 48 1590 +835 64 1686 +851 64 1766 +899 64 1879 +931 80 1975 +915 64 2039 +964 64 594 +947 64 674 +931 80 755 +899 96 867 +883 112 947 +867 96 1044 +867 80 1108 +835 112 1220 +835 112 1301 +851 80 1397 +851 128 1493 +883 112 1606 +835 161 1702 +899 145 1783 +915 112 1895 +931 128 1959 +964 145 2056 +964 209 626 +964 209 707 +947 209 771 +915 225 883 +899 193 931 +899 193 1044 +883 225 1156 +899 209 1237 +867 225 1317 +867 225 1397 +867 225 1493 +899 273 1622 +931 241 1686 +931 257 1783 +915 241 1863 +947 289 1975 +1028 241 2056 +1012 337 691 +996 353 707 +980 337 787 +964 353 883 +947 337 980 +931 353 1044 +931 337 1124 +931 353 1237 +931 353 1333 +947 369 1429 +931 369 1510 +947 353 1590 +964 369 1702 +996 369 1799 +1012 369 1879 +1076 385 1991 +1092 401 2072 +1060 482 707 +1028 466 755 +1044 466 819 +1012 466 883 +1012 466 964 +996 450 1060 +996 466 1156 +996 482 1237 +947 482 1333 +980 482 1429 +996 498 1526 +1028 498 1622 +1028 498 1718 +1028 498 1766 +1076 514 1911 +1108 530 1991 +1188 514 2072 +1140 594 723 +1108 610 771 +1108 594 819 +1092 610 883 +1108 610 996 +1108 610 1076 +1060 610 1188 +1076 610 1237 +1060 642 1365 +1092 626 1429 +1076 626 1526 +1124 626 1606 +1108 626 1718 +1140 642 1799 +1172 642 1863 +1204 674 1991 +1253 642 2056 +1220 755 787 +1204 739 787 +1220 755 851 +1220 755 931 +1204 755 996 +1204 755 1092 +1220 755 1188 +1204 771 1269 +1204 771 1349 +1220 787 1445 +1204 787 1558 +1237 771 1606 +1269 803 1734 +1301 803 1831 +1333 819 1911 +1365 819 2007 +1429 819 2104 +1365 915 819 +1333 899 851 +1349 915 883 +1333 915 947 +1349 915 1012 +1333 915 1092 +1317 915 1188 +1317 915 1301 +1333 947 1381 +1317 931 1477 +1381 947 1558 +1381 947 1638 +1397 947 1702 +1445 964 1815 +1510 980 1911 +1558 996 2023 +1590 1012 2104 +1526 1092 819 +1526 1092 851 +1558 1108 931 +1542 1108 980 +1526 1108 1044 +1510 1124 1124 +1542 1124 1220 +1493 1108 1301 +1526 1124 1381 +1542 1140 1477 +1574 1140 1574 +1622 1156 1654 +1654 1156 1750 +1702 1188 1863 +1718 1188 1927 +1718 1188 2023 +1815 1204 2136 +1734 1317 867 +1718 1317 883 +1734 1333 931 +1718 1317 964 +1783 1333 1044 +1766 1333 1140 +1799 1349 1204 +1766 1365 1317 +1783 1381 1413 +1799 1349 1493 +1847 1397 1558 +1831 1397 1686 +1927 1397 1750 +1991 1429 1847 +2023 1461 1975 +2023 1461 2056 +2120 1493 2168 +2039 1606 867 +2007 1606 899 +2056 1622 947 +2023 1606 996 +2039 1622 1060 +2072 1606 1140 +2104 1654 1237 +2088 1654 1317 +2120 1654 1413 +2136 1686 1510 +2152 1670 1574 +2184 1702 1670 +2296 1718 1734 +2296 1718 1863 +2393 1734 1895 +2457 1766 1975 +2569 1799 2023 +2425 1943 707 +2457 1943 707 +2457 1943 787 +2441 1943 819 +2441 1943 883 +2489 1975 947 +2489 1975 1044 +2505 1991 1124 +2521 1975 1220 +2585 2007 1285 +2634 2023 1381 +2682 2056 1461 +2666 2023 1542 +2778 2104 1622 +2875 2120 1718 +2875 2104 1799 +2971 2136 1879 +2842 2329 337 +2891 2377 385 +2907 2361 450 +2907 2361 514 +2891 2361 610 +2907 2361 739 +2923 2377 835 +2923 2377 964 +2923 2361 1060 +3003 2393 1172 +3035 2441 1317 +3067 2425 1413 +3099 2425 1526 +3148 2457 1606 +3180 2505 1783 +3244 2537 1911 +3292 2569 2039 +3180 2794 626 +3164 2762 594 +3212 2794 691 +3196 2794 787 +3196 2794 867 +3212 2778 964 +3228 2842 1124 +3212 2842 1237 +3228 2875 1365 +3244 2858 1461 +3292 2875 1590 +3292 2875 1686 +3292 2891 1831 +3372 2939 1991 +3372 2971 2168 +3404 2971 2248 +3437 3051 2489 +3340 3276 1285 +3356 3276 1333 +3356 3276 1365 +3356 3276 1397 +3404 3292 1510 +3372 3276 1558 +3356 3308 1686 +3356 3324 1799 +3340 3324 1895 +3356 3324 2007 +3372 3372 2168 +3388 3356 2264 +3388 3404 2473 +3404 3356 2505 +3453 3437 2730 +3453 3469 2842 +3469 3469 2987 +3437 3726 1911 +3388 3710 1943 +3404 3710 1975 +3421 3726 2056 +3421 3694 2072 +3404 3742 2168 +3421 3726 2264 +3404 3774 2393 +3404 3758 2489 +3388 3790 2634 +3404 3774 2698 +3404 3806 2858 +3421 3806 2955 +3421 3838 3115 +3421 3838 3212 +3469 3870 3340 +3453 3854 3421 +1044 0 610 +1028 0 674 +1012 0 755 +1012 0 867 +996 0 947 +980 0 1028 +947 0 1108 +980 0 1220 +915 0 1301 +964 0 1413 +947 0 1493 +980 0 1606 +947 16 1702 +964 32 1783 +1028 0 1863 +1012 0 1959 +1012 64 2056 +1028 0 626 +1028 0 691 +1012 0 739 +996 0 867 +996 0 980 +980 0 1028 +980 0 1124 +947 16 1220 +964 32 1317 +964 16 1413 +980 32 1510 +964 16 1590 +964 64 1702 +1028 64 1783 +1012 48 1879 +1028 64 1959 +1060 80 2056 +1044 80 626 +1060 80 707 +1028 64 755 +1012 80 851 +1012 80 947 +996 48 1044 +996 96 1140 +980 80 1237 +980 80 1317 +980 112 1413 +980 128 1510 +980 128 1606 +980 128 1702 +1012 161 1783 +1060 128 1879 +1044 193 1975 +1092 161 2056 +1060 193 658 +1076 209 707 +1060 193 787 +1044 209 867 +1028 225 964 +1028 209 1044 +996 209 1124 +1012 241 1253 +996 225 1317 +1028 193 1413 +1012 225 1510 +1012 241 1606 +1028 257 1702 +1012 241 1766 +1060 273 1863 +1092 273 1975 +1108 273 2056 +1124 321 691 +1124 337 739 +1108 337 803 +1092 321 883 +1076 321 980 +1044 337 1076 +1076 337 1140 +1076 353 1269 +1060 337 1317 +1076 337 1413 +1044 353 1493 +1028 369 1622 +1060 385 1686 +1092 369 1799 +1092 385 1895 +1172 385 1975 +1156 434 2072 +1140 466 707 +1140 466 739 +1140 466 803 +1140 466 867 +1108 482 996 +1108 466 1060 +1108 466 1140 +1092 482 1253 +1124 482 1349 +1140 466 1397 +1124 498 1526 +1108 498 1606 +1124 530 1718 +1172 514 1799 +1220 530 1911 +1237 530 1991 +1220 530 2072 +1204 594 739 +1220 594 787 +1220 594 835 +1204 610 915 +1204 626 996 +1188 610 1092 +1220 626 1172 +1204 610 1269 +1188 626 1349 +1204 642 1445 +1204 642 1542 +1220 610 1606 +1253 642 1702 +1269 658 1799 +1317 658 1895 +1333 674 1991 +1397 691 2088 +1317 739 771 +1317 739 803 +1333 771 867 +1301 755 931 +1285 771 1012 +1285 755 1076 +1301 755 1156 +1301 787 1285 +1333 771 1349 +1317 755 1429 +1349 787 1558 +1365 803 1622 +1381 803 1718 +1381 819 1815 +1461 835 1911 +1477 819 1991 +1558 835 2104 +1445 915 803 +1445 915 851 +1445 915 867 +1445 915 947 +1429 931 1028 +1429 915 1108 +1445 915 1188 +1477 931 1285 +1461 947 1365 +1461 947 1445 +1461 964 1542 +1493 964 1638 +1574 980 1734 +1574 996 1831 +1606 1012 1943 +1654 1012 2023 +1734 1044 2136 +1654 1124 851 +1638 1108 851 +1654 1124 947 +1638 1124 980 +1638 1124 1076 +1622 1124 1140 +1622 1140 1204 +1638 1140 1285 +1654 1140 1397 +1670 1156 1477 +1702 1172 1574 +1734 1188 1654 +1718 1172 1750 +1766 1204 1879 +1847 1220 1943 +1895 1220 2023 +1943 1253 2120 +1879 1349 867 +1895 1365 883 +1879 1365 931 +1879 1381 996 +1879 1365 1076 +1863 1365 1124 +1895 1365 1220 +1863 1365 1317 +1895 1397 1413 +1895 1397 1493 +1959 1397 1574 +2023 1445 1670 +2039 1445 1766 +2072 1461 1847 +2120 1493 1959 +2152 1493 2056 +2248 1526 2152 +2168 1654 883 +2152 1638 899 +2168 1654 931 +2168 1670 1012 +2168 1654 1060 +2216 1670 1140 +2216 1686 1237 +2200 1686 1317 +2216 1686 1413 +2216 1702 1510 +2216 1686 1590 +2361 1750 1638 +2409 1734 1734 +2457 1766 1799 +2521 1766 1879 +2585 1799 1943 +2682 1831 2007 +2569 1959 658 +2537 1975 658 +2569 1975 739 +2569 1975 771 +2553 1959 835 +2634 2007 931 +2634 1991 1012 +2666 2023 1076 +2666 2039 1172 +2698 2039 1285 +2698 2023 1365 +2762 2056 1429 +2826 2088 1510 +2875 2104 1590 +2907 2120 1702 +2987 2136 1799 +3067 2184 1911 +2955 2377 273 +3019 2425 369 +3003 2409 418 +2971 2361 530 +3035 2409 594 +3003 2409 723 +3019 2393 851 +3083 2425 1012 +3051 2425 1108 +3083 2441 1188 +3099 2441 1301 +3131 2473 1429 +3212 2505 1558 +3244 2537 1686 +3276 2521 1783 +3292 2553 1943 +3372 2602 2056 +3292 2858 723 +3260 2842 739 +3292 2842 803 +3276 2858 851 +3292 2858 947 +3276 2842 1028 +3340 2875 1188 +3324 2875 1285 +3324 2891 1397 +3308 2891 1542 +3340 2891 1654 +3372 2939 1783 +3388 2987 1959 +3437 2971 2056 +3453 3051 2232 +3501 3035 2377 +3501 3035 2505 +3421 3292 1365 +3421 3340 1429 +3404 3324 1461 +3437 3276 1477 +3421 3276 1510 +3404 3308 1638 +3404 3324 1702 +3437 3372 1879 +3437 3388 1991 +3437 3372 2088 +3453 3404 2248 +3453 3356 2280 +3453 3388 2441 +3469 3437 2634 +3485 3469 2762 +3501 3469 2858 +3533 3501 3019 +3501 3726 1975 +3501 3758 2039 +3501 3758 2072 +3485 3758 2104 +3485 3774 2168 +3485 3742 2232 +3469 3742 2329 +3437 3774 2441 +3453 3774 2505 +3469 3774 2618 +3485 3806 2746 +3485 3838 2891 +3485 3838 2987 +3501 3838 3131 +3501 3870 3244 +3517 3886 3404 +3517 3886 3501 +1172 0 642 +1124 0 691 +1140 0 755 +1108 0 851 +1092 0 931 +1092 0 1044 +1108 0 1156 +1092 0 1237 +1092 0 1317 +1092 0 1397 +1076 0 1510 +1108 0 1606 +1108 0 1702 +1108 0 1750 +1140 0 1879 +1156 80 1975 +1204 32 2056 +1156 0 610 +1140 0 674 +1140 0 771 +1124 0 883 +1124 0 964 +1108 0 1044 +1108 32 1156 +1092 16 1220 +1076 48 1317 +1092 0 1413 +1124 0 1493 +1124 48 1590 +1108 48 1686 +1124 64 1799 +1140 128 1879 +1172 80 1959 +1188 112 2072 +1172 64 626 +1172 80 707 +1172 64 787 +1156 64 851 +1140 80 964 +1124 48 1044 +1124 96 1156 +1124 96 1237 +1124 80 1349 +1092 96 1429 +1124 112 1510 +1124 128 1622 +1140 128 1686 +1140 145 1799 +1172 161 1879 +1188 177 1991 +1237 193 2056 +1204 193 658 +1204 193 707 +1172 209 787 +1188 193 883 +1172 209 980 +1156 193 1076 +1156 209 1140 +1156 209 1237 +1140 241 1333 +1124 209 1413 +1140 225 1493 +1156 257 1622 +1140 273 1686 +1188 257 1799 +1188 273 1895 +1253 273 1991 +1237 305 2056 +1220 321 691 +1237 321 739 +1188 337 787 +1188 321 883 +1172 337 980 +1204 337 1076 +1172 337 1140 +1156 337 1237 +1220 369 1333 +1172 369 1397 +1204 369 1526 +1204 369 1622 +1204 401 1718 +1220 385 1815 +1253 401 1895 +1285 401 1975 +1317 434 2072 +1317 482 723 +1301 466 755 +1285 482 835 +1269 466 883 +1253 482 980 +1237 466 1076 +1237 466 1188 +1253 498 1253 +1253 498 1333 +1253 498 1445 +1269 498 1510 +1269 498 1606 +1285 514 1734 +1285 514 1783 +1317 530 1879 +1381 546 2007 +1413 530 2072 +1349 594 739 +1349 594 787 +1381 610 851 +1381 626 947 +1333 610 980 +1333 626 1108 +1317 642 1172 +1349 610 1253 +1333 642 1365 +1333 642 1461 +1333 642 1542 +1365 642 1606 +1397 674 1718 +1413 691 1799 +1445 674 1895 +1477 691 2007 +1493 707 2072 +1445 771 787 +1461 771 819 +1429 755 851 +1413 771 931 +1429 771 1012 +1461 771 1076 +1461 803 1204 +1445 787 1301 +1477 787 1365 +1461 819 1477 +1461 803 1558 +1477 803 1638 +1526 803 1718 +1542 819 1831 +1574 835 1911 +1638 851 2023 +1702 899 2104 +1590 915 803 +1574 931 851 +1590 931 883 +1590 947 947 +1558 947 1012 +1574 947 1124 +1558 947 1204 +1558 947 1301 +1606 996 1397 +1590 980 1461 +1622 980 1558 +1670 996 1638 +1670 1012 1734 +1686 996 1831 +1783 1044 1943 +1815 1060 2039 +1847 1044 2120 +1799 1156 835 +1799 1156 867 +1783 1156 915 +1783 1156 980 +1766 1172 1060 +1783 1156 1124 +1783 1140 1204 +1783 1172 1301 +1815 1172 1397 +1799 1172 1477 +1847 1204 1558 +1847 1204 1654 +1863 1220 1783 +1943 1237 1879 +1959 1237 1943 +2023 1269 2039 +2104 1269 2136 +2007 1413 867 +1991 1397 915 +1991 1413 947 +1991 1381 1012 +2007 1397 1060 +2007 1397 1140 +1991 1381 1204 +2072 1445 1333 +2072 1429 1397 +2072 1445 1493 +2104 1461 1606 +2104 1445 1670 +2152 1477 1766 +2200 1477 1863 +2280 1526 1991 +2329 1558 2056 +2377 1558 2152 +2312 1686 883 +2296 1670 899 +2312 1686 947 +2296 1686 996 +2312 1686 1060 +2296 1702 1156 +2296 1686 1204 +2425 1734 1285 +2361 1702 1381 +2409 1750 1461 +2457 1734 1510 +2505 1750 1606 +2537 1766 1686 +2618 1783 1750 +2634 1799 1831 +2714 1831 1895 +2794 1863 1975 +2730 2039 546 +2714 2023 594 +2746 2023 642 +2746 2039 691 +2746 2039 771 +2730 2039 867 +2762 2023 980 +2778 2056 1028 +2778 2056 1124 +2842 2088 1237 +2907 2120 1333 +2939 2136 1413 +2955 2120 1510 +3019 2168 1606 +3083 2200 1718 +3164 2216 1799 +3180 2200 1879 +3115 2409 353 +3115 2409 353 +3148 2441 450 +3115 2425 546 +3131 2441 610 +3131 2425 739 +3131 2425 867 +3164 2457 1012 +3180 2457 1092 +3228 2505 1237 +3244 2537 1413 +3228 2537 1493 +3292 2537 1606 +3324 2569 1702 +3388 2618 1847 +3404 2618 1975 +3485 2714 2184 +3372 2875 755 +3388 2891 867 +3388 2891 915 +3388 2875 899 +3372 2891 1044 +3372 2891 1124 +3404 2939 1285 +3404 2875 1317 +3437 2939 1510 +3421 2987 1638 +3421 2987 1766 +3437 2987 1863 +3485 3035 2056 +3517 3051 2200 +3517 3035 2248 +3565 3115 2473 +3565 3099 2585 +3517 3356 1461 +3501 3340 1493 +3517 3356 1510 +3485 3340 1574 +3501 3356 1654 +3501 3372 1718 +3501 3356 1831 +3517 3340 1895 +3485 3404 2056 +3501 3404 2136 +3501 3421 2312 +3517 3469 2473 +3517 3453 2569 +3517 3485 2682 +3565 3517 2842 +3581 3533 2987 +3565 3549 3131 +3549 3774 2088 +3549 3774 2088 +3581 3774 2088 +3565 3806 2184 +3549 3806 2248 +3549 3806 2312 +3533 3806 2393 +3533 3806 2473 +3533 3838 2634 +3533 3838 2714 +3549 3854 2858 +3517 3854 2939 +3549 3870 3067 +3549 3902 3228 +3549 3886 3308 +3549 3886 3404 +3581 3902 3485 +1285 0 642 +1269 0 691 +1253 0 755 +1269 0 867 +1237 0 947 +1253 0 1076 +1269 0 1140 +1237 0 1237 +1237 0 1333 +1253 0 1429 +1220 0 1510 +1237 16 1606 +1237 16 1686 +1253 32 1799 +1285 32 1879 +1285 48 1975 +1333 128 2056 +1285 0 642 +1285 0 723 +1285 0 803 +1253 0 851 +1269 0 980 +1253 16 1076 +1253 0 1124 +1253 32 1253 +1237 0 1317 +1220 32 1429 +1253 48 1493 +1237 32 1606 +1285 48 1702 +1269 48 1815 +1301 128 1911 +1301 112 1975 +1333 128 2056 +1301 48 674 +1301 48 723 +1301 80 803 +1269 80 883 +1301 80 996 +1269 80 1060 +1253 112 1156 +1269 96 1237 +1237 112 1317 +1253 112 1413 +1253 96 1510 +1269 128 1622 +1301 128 1702 +1301 128 1783 +1301 193 1895 +1317 193 1975 +1365 241 2072 +1333 177 674 +1317 177 723 +1301 177 803 +1285 177 867 +1301 177 964 +1301 225 1092 +1269 209 1140 +1269 209 1253 +1269 241 1333 +1269 241 1429 +1285 257 1526 +1285 241 1606 +1301 257 1702 +1349 289 1799 +1333 321 1895 +1381 289 1975 +1413 321 2072 +1365 353 691 +1349 337 739 +1333 353 819 +1349 337 899 +1333 353 996 +1301 353 1076 +1317 353 1172 +1333 337 1253 +1317 353 1333 +1317 369 1445 +1349 369 1510 +1365 385 1606 +1381 401 1718 +1381 385 1799 +1397 434 1895 +1397 450 1991 +1461 434 2088 +1381 466 723 +1413 498 771 +1413 482 835 +1397 482 899 +1381 498 1012 +1381 498 1076 +1365 498 1172 +1397 498 1253 +1413 514 1365 +1397 498 1429 +1397 514 1526 +1413 530 1622 +1445 514 1718 +1461 546 1799 +1445 546 1879 +1542 578 2007 +1558 578 2104 +1493 626 771 +1493 626 787 +1493 626 835 +1461 626 899 +1477 626 1012 +1461 642 1108 +1445 642 1188 +1461 642 1269 +1477 642 1349 +1477 642 1445 +1526 674 1558 +1526 658 1638 +1526 707 1750 +1526 707 1831 +1590 691 1911 +1622 723 2007 +1670 723 2104 +1590 787 787 +1590 803 835 +1574 787 883 +1558 787 947 +1590 803 1012 +1590 803 1092 +1574 803 1220 +1574 819 1301 +1590 819 1365 +1606 819 1461 +1622 835 1574 +1654 835 1654 +1638 851 1718 +1702 867 1831 +1750 867 1943 +1766 915 2023 +1831 915 2120 +1750 964 835 +1718 980 851 +1718 964 899 +1734 980 964 +1718 980 1044 +1718 964 1108 +1750 980 1204 +1750 996 1285 +1750 980 1397 +1783 996 1493 +1750 996 1574 +1799 1028 1654 +1863 1044 1750 +1879 1044 1831 +1927 1076 1927 +1927 1060 2023 +2007 1092 2136 +1911 1156 867 +1927 1172 851 +1911 1156 915 +1927 1188 996 +1911 1172 1028 +1895 1188 1140 +1911 1188 1237 +1943 1204 1317 +1975 1204 1397 +1959 1220 1510 +1991 1220 1558 +1991 1253 1670 +2023 1237 1766 +2088 1269 1863 +2120 1269 1943 +2184 1301 2039 +2248 1333 2136 +2184 1429 851 +2184 1445 883 +2184 1445 915 +2168 1445 996 +2152 1429 1044 +2168 1461 1172 +2184 1445 1220 +2200 1445 1317 +2216 1445 1397 +2232 1461 1477 +2248 1477 1574 +2312 1510 1670 +2312 1526 1766 +2377 1542 1895 +2393 1574 1975 +2473 1590 2039 +2585 1622 2104 +2489 1734 819 +2489 1734 851 +2489 1734 883 +2489 1750 947 +2505 1734 980 +2537 1766 1044 +2505 1734 1156 +2537 1766 1237 +2585 1783 1333 +2650 1815 1381 +2650 1799 1477 +2682 1799 1542 +2714 1847 1622 +2762 1831 1718 +2826 1863 1783 +2907 1895 1863 +2955 1927 1927 +2907 2088 482 +2875 2088 466 +2939 2136 578 +2939 2120 610 +2939 2136 691 +2955 2120 819 +2939 2120 915 +2955 2104 1028 +2955 2120 1092 +3019 2136 1188 +3035 2168 1317 +3035 2152 1365 +3115 2200 1510 +3164 2216 1590 +3260 2280 1718 +3260 2248 1799 +3308 2280 1895 +3228 2457 369 +3276 2489 434 +3228 2457 450 +3276 2489 610 +3276 2505 723 +3276 2489 803 +3292 2537 964 +3292 2537 1060 +3324 2553 1204 +3324 2521 1285 +3356 2553 1413 +3388 2618 1558 +3421 2618 1670 +3453 2618 1750 +3469 2650 1895 +3517 2682 2088 +3581 2730 2232 +3469 2939 883 +3501 2939 947 +3469 2971 1044 +3469 2987 1092 +3485 2971 1172 +3485 2987 1253 +3485 2955 1349 +3485 2987 1445 +3549 3035 1638 +3501 2971 1686 +3533 3051 1879 +3565 3083 2023 +3549 3083 2168 +3581 3131 2296 +3597 3164 2409 +3629 3148 2537 +3613 3196 2714 +3565 3404 1558 +3581 3388 1590 +3581 3437 1686 +3565 3388 1654 +3565 3388 1718 +3565 3437 1863 +3581 3421 1927 +3581 3469 2088 +3597 3453 2184 +3565 3485 2296 +3549 3485 2409 +3597 3517 2553 +3613 3517 2634 +3597 3533 2810 +3629 3565 2955 +3597 3549 3003 +3645 3581 3180 +3645 3822 2184 +3661 3854 2248 +3645 3822 2184 +3645 3854 2264 +3645 3822 2280 +3661 3854 2409 +3645 3854 2473 +3645 3870 2585 +3629 3838 2666 +3597 3870 2778 +3597 3854 2826 +3597 3902 3035 +3613 3886 3131 +3613 3886 3196 +3645 3950 3372 +3645 3934 3469 +3677 3934 3613 +1429 0 674 +1429 0 723 +1397 0 803 +1397 0 867 +1365 0 964 +1381 0 1060 +1381 0 1140 +1349 0 1237 +1381 0 1333 +1365 32 1429 +1397 0 1510 +1397 0 1606 +1413 32 1718 +1397 80 1799 +1413 80 1879 +1477 64 2007 +1477 128 2088 +1413 0 674 +1397 0 723 +1413 16 819 +1397 0 883 +1413 0 980 +1397 16 1060 +1365 32 1156 +1381 16 1237 +1381 64 1333 +1365 80 1413 +1413 48 1510 +1397 48 1622 +1413 32 1702 +1445 112 1815 +1445 96 1895 +1477 112 1975 +1526 161 2088 +1445 80 691 +1429 80 755 +1429 80 803 +1413 96 883 +1397 112 964 +1397 96 1076 +1397 128 1172 +1397 96 1237 +1397 96 1349 +1413 145 1429 +1413 112 1526 +1381 145 1606 +1429 193 1702 +1445 193 1799 +1477 145 1911 +1493 209 1975 +1526 241 2104 +1461 225 707 +1445 209 739 +1445 225 819 +1429 241 915 +1445 225 996 +1413 225 1076 +1429 225 1188 +1429 257 1253 +1397 257 1349 +1429 273 1445 +1461 273 1510 +1445 257 1622 +1477 289 1734 +1493 289 1799 +1526 289 1879 +1510 337 2007 +1574 321 2072 +1510 353 723 +1493 353 755 +1493 353 835 +1477 369 899 +1477 353 996 +1461 369 1092 +1461 385 1172 +1461 369 1253 +1493 369 1349 +1477 401 1429 +1461 385 1526 +1510 401 1622 +1510 385 1702 +1542 418 1815 +1574 434 1895 +1606 466 2007 +1638 466 2088 +1558 466 723 +1542 498 787 +1558 498 835 +1542 482 899 +1542 514 1012 +1574 530 1108 +1542 514 1188 +1526 530 1269 +1542 530 1365 +1558 530 1445 +1542 514 1542 +1574 530 1622 +1590 562 1702 +1622 594 1815 +1654 578 1911 +1638 594 2007 +1718 610 2104 +1622 642 787 +1622 642 803 +1638 658 851 +1638 658 947 +1638 658 1012 +1622 658 1092 +1622 674 1204 +1638 691 1301 +1654 674 1365 +1622 691 1477 +1654 691 1542 +1686 707 1654 +1686 707 1734 +1718 723 1815 +1718 755 1927 +1815 739 2023 +1847 787 2120 +1734 819 803 +1734 819 835 +1734 835 883 +1734 803 947 +1734 819 1028 +1734 835 1124 +1750 835 1204 +1766 835 1317 +1750 835 1365 +1734 835 1445 +1815 867 1574 +1815 867 1654 +1847 883 1734 +1847 899 1831 +1895 931 1927 +1959 931 2039 +1991 964 2136 +1895 996 851 +1895 1012 883 +1879 996 899 +1895 1028 980 +1911 1012 1044 +1895 1012 1124 +1879 1028 1204 +1927 1044 1333 +1927 1028 1413 +1943 1028 1477 +1943 1060 1574 +1975 1028 1654 +1975 1060 1750 +1991 1060 1847 +2088 1124 1959 +2104 1124 2039 +2184 1140 2152 +2072 1188 851 +2104 1220 883 +2104 1237 915 +2088 1237 996 +2088 1237 1044 +2088 1253 1140 +2072 1253 1220 +2104 1253 1317 +2104 1237 1381 +2136 1269 1526 +2152 1269 1590 +2184 1269 1686 +2248 1333 1766 +2280 1317 1863 +2312 1333 1959 +2329 1365 2056 +2425 1413 2168 +2345 1477 867 +2345 1477 899 +2312 1461 915 +2345 1461 980 +2409 1510 1060 +2329 1461 1156 +2377 1510 1253 +2393 1542 1333 +2393 1526 1397 +2441 1542 1493 +2441 1558 1606 +2457 1574 1702 +2521 1606 1783 +2585 1622 1831 +2618 1606 1911 +2698 1654 1991 +2794 1670 2039 +2634 1750 739 +2714 1799 723 +2714 1799 755 +2714 1799 835 +2730 1815 915 +2714 1815 980 +2730 1799 1092 +2730 1783 1172 +2762 1831 1237 +2778 1847 1317 +2858 1863 1413 +2858 1879 1510 +2907 1879 1558 +2939 1895 1670 +3003 1927 1734 +3115 1991 1815 +3131 1991 1911 +3051 2152 369 +3051 2152 434 +3051 2152 498 +3067 2136 578 +3083 2152 642 +3067 2152 771 +3083 2136 883 +3083 2136 947 +3164 2184 1076 +3180 2216 1156 +3228 2232 1285 +3212 2232 1413 +3276 2264 1510 +3324 2280 1606 +3340 2280 1734 +3404 2312 1831 +3437 2361 1959 +3404 2569 498 +3388 2521 530 +3404 2569 626 +3372 2521 626 +3421 2569 771 +3404 2553 883 +3388 2553 964 +3453 2618 1140 +3437 2618 1237 +3469 2618 1365 +3501 2666 1526 +3485 2650 1622 +3549 2698 1766 +3549 2714 1879 +3581 2730 2007 +3613 2746 2152 +3645 2810 2329 +3565 3035 1076 +3597 3035 1092 +3565 3035 1124 +3581 3067 1220 +3597 3035 1253 +3597 3051 1413 +3597 3051 1477 +3613 3051 1558 +3613 3067 1702 +3613 3083 1815 +3629 3115 1975 +3645 3148 2136 +3677 3164 2280 +3645 3164 2361 +3677 3196 2505 +3661 3228 2666 +3710 3228 2810 +3677 3485 1702 +3661 3469 1702 +3661 3469 1766 +3645 3469 1799 +3645 3485 1847 +3661 3469 1943 +3661 3469 2007 +3677 3517 2184 +3661 3517 2248 +3661 3501 2329 +3645 3565 2537 +3677 3565 2650 +3677 3549 2730 +3677 3597 2891 +3677 3613 3003 +3694 3629 3164 +3710 3629 3244 +3742 3854 2232 +3742 3886 2280 +3726 3886 2312 +3758 3886 2345 +3726 3902 2425 +3742 3902 2489 +3726 3886 2553 +3694 3886 2650 +3694 3870 2746 +3677 3870 2810 +3694 3886 2907 +3694 3886 3019 +3694 3886 3115 +3694 3934 3276 +3726 3934 3388 +3694 3967 3533 +3726 3967 3645 +1574 0 691 +1526 0 739 +1558 0 819 +1558 0 899 +1542 0 980 +1542 0 1060 +1510 0 1156 +1542 48 1253 +1526 0 1349 +1542 0 1445 +1542 48 1510 +1510 64 1606 +1542 64 1686 +1574 96 1799 +1606 112 1911 +1638 128 1991 +1654 128 2072 +1574 32 707 +1574 0 739 +1558 48 819 +1558 0 899 +1542 0 980 +1542 32 1076 +1510 48 1156 +1526 48 1253 +1526 64 1333 +1558 80 1445 +1542 48 1510 +1574 64 1622 +1558 96 1702 +1590 112 1815 +1622 112 1895 +1622 193 1991 +1670 128 2072 +1606 128 707 +1606 80 755 +1590 80 819 +1574 96 915 +1558 112 1012 +1542 96 1060 +1542 145 1172 +1590 161 1253 +1558 177 1349 +1574 161 1445 +1590 177 1526 +1558 177 1606 +1606 145 1718 +1606 193 1815 +1622 257 1895 +1670 225 1975 +1702 257 2088 +1606 257 691 +1590 257 755 +1590 273 835 +1606 257 915 +1590 257 996 +1574 289 1108 +1590 273 1188 +1606 257 1269 +1590 273 1333 +1558 273 1429 +1590 305 1542 +1606 289 1606 +1622 353 1718 +1670 321 1799 +1686 321 1895 +1702 385 1975 +1734 385 2088 +1654 369 723 +1670 369 771 +1654 385 851 +1638 385 947 +1622 385 1012 +1638 385 1092 +1654 418 1188 +1638 369 1269 +1622 401 1349 +1622 418 1429 +1638 434 1558 +1686 401 1622 +1718 466 1718 +1734 466 1815 +1750 466 1911 +1766 498 2023 +1783 530 2104 +1734 546 771 +1686 514 787 +1718 530 851 +1718 530 947 +1686 530 1012 +1686 530 1092 +1686 514 1188 +1702 546 1285 +1718 546 1365 +1718 578 1461 +1718 562 1542 +1750 578 1638 +1750 562 1734 +1783 578 1815 +1815 594 1911 +1895 658 2023 +1895 642 2104 +1815 691 787 +1783 674 819 +1799 691 883 +1783 691 947 +1783 707 1044 +1799 691 1108 +1783 707 1204 +1799 707 1301 +1783 707 1365 +1815 707 1445 +1815 739 1558 +1863 755 1654 +1879 739 1750 +1911 755 1847 +1927 787 1927 +1959 803 2023 +2007 819 2104 +1927 851 819 +1927 851 819 +1943 867 883 +1927 867 947 +1911 867 1028 +1911 883 1124 +1911 851 1204 +1927 899 1317 +1927 883 1413 +1975 899 1510 +1975 915 1558 +1975 899 1638 +2039 947 1734 +2056 947 1831 +2088 964 1943 +2088 980 2007 +2200 1028 2136 +2072 1044 867 +2072 1044 867 +2056 1044 899 +2056 1028 980 +2072 1044 1060 +2056 1044 1124 +2056 1060 1220 +2072 1060 1317 +2056 1060 1397 +2104 1076 1477 +2136 1092 1558 +2168 1108 1670 +2184 1124 1799 +2200 1124 1847 +2248 1172 1959 +2345 1188 2039 +2377 1204 2152 +2264 1253 851 +2280 1285 899 +2264 1269 931 +2248 1269 996 +2280 1269 1044 +2264 1269 1140 +2312 1317 1220 +2329 1317 1317 +2329 1333 1429 +2312 1301 1510 +2361 1333 1590 +2361 1317 1670 +2377 1349 1783 +2505 1397 1879 +2489 1397 1959 +2553 1413 2056 +2666 1477 2136 +2521 1558 867 +2521 1558 883 +2505 1558 947 +2521 1542 964 +2537 1574 1060 +2521 1558 1124 +2489 1542 1220 +2585 1606 1317 +2602 1590 1381 +2618 1622 1445 +2666 1606 1558 +2682 1606 1638 +2746 1638 1702 +2746 1638 1766 +2858 1686 1831 +2907 1734 1911 +2939 1702 1991 +2939 1879 594 +2842 1831 658 +2842 1847 723 +2923 1879 787 +2939 1863 851 +2907 1879 915 +2955 1895 980 +2939 1895 1092 +2955 1895 1172 +3003 1927 1269 +3035 1927 1365 +3067 1975 1461 +3131 1991 1526 +3131 1991 1638 +3212 2023 1718 +3228 2023 1783 +3292 2056 1911 +3244 2216 337 +3260 2216 353 +3228 2200 401 +3260 2232 482 +3244 2200 658 +3260 2216 755 +3260 2232 851 +3308 2280 996 +3356 2280 1092 +3372 2280 1188 +3388 2296 1317 +3404 2296 1445 +3421 2329 1542 +3469 2377 1670 +3517 2393 1815 +3549 2441 1959 +3597 2505 2104 +3533 2666 642 +3533 2618 610 +3533 2666 739 +3533 2666 787 +3549 2650 883 +3549 2650 964 +3533 2650 1060 +3581 2714 1237 +3565 2698 1333 +3613 2714 1493 +3597 2714 1590 +3645 2746 1718 +3645 2762 1863 +3677 2810 1991 +3694 2858 2184 +3726 2858 2296 +3726 2923 2489 +3677 3067 1188 +3694 3115 1253 +3694 3115 1301 +3677 3115 1365 +3694 3099 1397 +3694 3148 1574 +3694 3115 1590 +3710 3148 1750 +3694 3148 1847 +3710 3148 1959 +3742 3148 2056 +3710 3180 2200 +3710 3244 2377 +3742 3212 2457 +3758 3276 2666 +3758 3260 2762 +3806 3340 2987 +3758 3533 1831 +3774 3549 1847 +3758 3533 1879 +3758 3533 1911 +3758 3565 2039 +3758 3565 2104 +3758 3565 2200 +3742 3549 2264 +3758 3581 2393 +3742 3597 2489 +3774 3597 2602 +3758 3613 2698 +3774 3629 2875 +3742 3661 3035 +3774 3645 3083 +3774 3677 3244 +3774 3710 3404 +3806 3886 2296 +3822 3902 2312 +3854 3886 2345 +3822 3902 2377 +3790 3886 2425 +3822 3886 2473 +3822 3934 2634 +3822 3934 2698 +3790 3934 2794 +3774 3934 2907 +3790 3934 3003 +3790 3950 3115 +3806 3950 3228 +3774 3967 3324 +3790 3967 3453 +3806 3983 3565 +3806 3983 3677 +1718 0 707 +1718 0 755 +1702 0 819 +1686 0 899 +1686 0 996 +1686 0 1092 +1702 48 1172 +1718 32 1253 +1686 32 1349 +1686 64 1429 +1686 48 1510 +1702 128 1622 +1718 112 1718 +1766 128 1799 +1783 128 1895 +1799 241 2023 +1815 225 2088 +1718 64 723 +1718 80 771 +1702 80 819 +1686 96 931 +1686 48 996 +1718 32 1076 +1718 64 1188 +1702 80 1253 +1718 80 1349 +1734 128 1445 +1702 145 1542 +1702 209 1606 +1766 161 1718 +1734 177 1799 +1815 257 1911 +1799 241 2023 +1831 305 2088 +1750 112 723 +1750 128 787 +1734 128 835 +1734 145 915 +1702 145 996 +1718 177 1076 +1702 193 1172 +1734 209 1269 +1718 225 1349 +1718 209 1461 +1734 193 1542 +1734 241 1638 +1750 209 1702 +1783 257 1815 +1831 273 1895 +1847 337 2007 +1895 305 2104 +1766 273 723 +1766 289 787 +1766 289 819 +1750 305 931 +1718 289 1012 +1718 305 1092 +1734 305 1188 +1734 321 1285 +1750 321 1365 +1766 305 1445 +1783 369 1558 +1799 353 1638 +1847 369 1734 +1831 401 1831 +1847 418 1927 +1879 434 2007 +1911 450 2120 +1831 385 739 +1815 385 787 +1815 401 867 +1815 401 931 +1783 401 1028 +1766 401 1092 +1799 450 1188 +1799 434 1301 +1831 434 1365 +1831 466 1445 +1831 482 1542 +1831 498 1654 +1863 482 1718 +1895 498 1831 +1927 514 1911 +1975 530 2007 +1991 546 2120 +1879 562 787 +1863 546 803 +1863 562 867 +1847 562 915 +1847 578 1028 +1847 594 1108 +1847 578 1188 +1879 578 1301 +1879 594 1365 +1895 594 1445 +1911 594 1542 +1927 642 1654 +1943 642 1750 +1975 642 1815 +2023 658 1911 +2039 674 2007 +2072 691 2120 +1975 723 819 +1959 707 835 +1959 723 883 +1959 723 931 +1959 739 1044 +1927 723 1108 +1975 755 1220 +1991 739 1301 +1991 771 1413 +2007 771 1477 +2039 771 1574 +2023 787 1654 +2023 803 1750 +2104 819 1847 +2136 835 1959 +2152 835 2023 +2200 851 2120 +2088 883 819 +2104 899 867 +2088 883 883 +2120 915 964 +2136 915 1044 +2120 915 1140 +2136 931 1237 +2120 931 1317 +2104 947 1381 +2136 947 1493 +2152 947 1542 +2168 947 1670 +2168 964 1750 +2280 1012 1863 +2280 996 1943 +2329 1060 2039 +2345 1060 2120 +2232 1076 835 +2248 1092 883 +2248 1076 931 +2248 1076 980 +2280 1124 1060 +2264 1108 1140 +2264 1092 1204 +2280 1124 1333 +2280 1140 1429 +2312 1156 1510 +2345 1156 1590 +2361 1156 1654 +2425 1188 1750 +2441 1220 1863 +2457 1237 1975 +2553 1253 2072 +2585 1301 2168 +2425 1333 851 +2441 1317 899 +2457 1333 931 +2457 1333 996 +2425 1333 1060 +2473 1349 1140 +2473 1349 1237 +2489 1349 1317 +2489 1365 1429 +2553 1397 1493 +2553 1413 1622 +2602 1429 1670 +2618 1445 1815 +2746 1477 1879 +2714 1461 1943 +2794 1510 1991 +2842 1526 2088 +2746 1606 787 +2746 1606 819 +2746 1622 851 +2730 1622 899 +2746 1606 964 +2746 1606 1060 +2778 1638 1140 +2810 1654 1220 +2810 1654 1317 +2875 1686 1381 +2875 1670 1493 +2907 1670 1574 +2939 1702 1622 +2971 1702 1718 +3115 1766 1783 +3164 1815 1847 +3228 1847 1927 +3067 1927 514 +3067 1927 514 +3067 1927 610 +3148 1959 658 +3083 1911 723 +3131 1959 851 +3131 1959 931 +3180 1975 996 +3196 2007 1124 +3212 1991 1220 +3260 2023 1317 +3244 2007 1413 +3276 2023 1493 +3356 2056 1606 +3372 2088 1686 +3469 2136 1815 +3533 2168 1943 +3421 2264 289 +3453 2296 401 +3453 2296 466 +3437 2296 514 +3485 2329 658 +3453 2312 771 +3453 2329 899 +3469 2312 1012 +3533 2361 1140 +3501 2361 1253 +3549 2409 1397 +3581 2409 1510 +3565 2409 1622 +3629 2489 1766 +3645 2473 1879 +3677 2489 1959 +3742 2585 2168 +3694 2746 771 +3710 2746 819 +3694 2746 867 +3694 2746 899 +3677 2730 1028 +3677 2746 1108 +3677 2762 1220 +3677 2746 1333 +3726 2826 1526 +3742 2810 1590 +3742 2858 1783 +3758 2842 1879 +3774 2858 1991 +3790 2923 2152 +3774 2923 2296 +3822 2955 2457 +3806 3003 2569 +3806 3196 1381 +3790 3180 1413 +3806 3196 1461 +3790 3196 1477 +3790 3196 1558 +3806 3180 1638 +3806 3196 1702 +3774 3228 1895 +3806 3212 1959 +3806 3244 2104 +3838 3228 2216 +3806 3292 2361 +3838 3308 2521 +3838 3292 2634 +3854 3324 2762 +3854 3356 2907 +3870 3372 3051 +3870 3597 1943 +3854 3597 1975 +3854 3613 1991 +3870 3581 2039 +3870 3645 2184 +3870 3645 2216 +3870 3629 2312 +3854 3629 2409 +3886 3629 2489 +3822 3645 2618 +3854 3694 2746 +3854 3677 2842 +3870 3677 2939 +3838 3710 3083 +3838 3758 3244 +3886 3758 3356 +3870 3774 3501 +3934 3918 2361 +3934 3934 2393 +3934 3934 2393 +3934 3934 2425 +3918 3950 2537 +3934 3934 2569 +3886 3934 2634 +3918 3950 2746 +3902 3950 2842 +3886 3967 2939 +3886 3950 3051 +3902 3950 3131 +3902 3967 3260 +3870 3983 3388 +3886 3999 3501 +3918 3999 3613 +3886 4015 3710 +1863 32 723 +1863 32 771 +1847 48 835 +1847 64 915 +1847 80 1012 +1847 112 1092 +1847 161 1204 +1863 145 1285 +1847 161 1365 +1847 112 1429 +1895 145 1542 +1895 209 1638 +1911 193 1734 +1927 257 1831 +1943 241 1911 +1991 273 2007 +2023 305 2120 +1863 112 723 +1863 48 771 +1879 80 835 +1879 96 899 +1879 128 1012 +1863 145 1108 +1847 161 1172 +1863 145 1285 +1879 209 1365 +1879 241 1445 +1895 225 1542 +1895 273 1654 +1927 289 1734 +1959 225 1815 +1975 289 1911 +2007 353 2023 +2088 353 2104 +1879 225 723 +1895 177 771 +1911 209 835 +1895 209 899 +1879 225 996 +1879 177 1092 +1911 241 1204 +1895 257 1269 +1895 305 1365 +1911 273 1445 +1911 305 1558 +1927 305 1654 +1959 305 1718 +1991 321 1831 +1975 353 1911 +2023 369 2007 +2088 418 2088 +1943 353 771 +1959 321 819 +1943 321 851 +1927 321 947 +1927 353 1028 +1911 353 1092 +1927 385 1188 +1927 353 1285 +1927 385 1349 +1943 385 1461 +1959 353 1542 +1959 401 1638 +2007 418 1734 +2007 450 1815 +2039 466 1927 +2072 482 2023 +2136 530 2152 +1991 498 771 +1975 434 803 +1991 466 867 +1975 482 964 +1959 466 1028 +1943 482 1124 +1991 498 1204 +1975 498 1285 +1975 482 1381 +1991 514 1477 +2023 530 1558 +2056 578 1654 +2088 530 1750 +2104 578 1863 +2120 578 1927 +2136 610 2007 +2216 626 2104 +2056 594 787 +2039 594 835 +2056 610 867 +2023 594 947 +2039 610 1028 +2088 626 1108 +2072 642 1220 +2088 642 1301 +2088 642 1381 +2120 658 1477 +2120 674 1574 +2120 707 1670 +2136 707 1750 +2184 723 1847 +2248 723 1927 +2264 755 2039 +2312 787 2136 +2168 771 819 +2168 771 851 +2152 771 883 +2152 771 964 +2168 803 1028 +2168 787 1140 +2168 803 1220 +2152 803 1317 +2200 819 1397 +2200 835 1493 +2216 835 1590 +2216 851 1670 +2280 851 1750 +2280 867 1847 +2361 915 1927 +2361 915 2056 +2425 947 2120 +2264 964 819 +2280 964 851 +2280 964 915 +2280 947 964 +2280 947 1044 +2280 964 1124 +2329 980 1237 +2296 980 1333 +2361 1012 1397 +2329 996 1493 +2393 1028 1574 +2393 1012 1686 +2425 1060 1783 +2505 1108 1863 +2505 1092 1943 +2553 1124 2072 +2569 1124 2168 +2441 1156 819 +2441 1156 867 +2473 1156 915 +2521 1204 980 +2441 1156 1044 +2489 1188 1124 +2505 1204 1253 +2505 1204 1333 +2521 1204 1429 +2521 1204 1526 +2521 1237 1606 +2569 1253 1686 +2602 1253 1783 +2666 1285 1879 +2714 1317 1991 +2730 1317 2072 +2826 1365 2136 +2698 1429 835 +2682 1413 851 +2682 1413 915 +2698 1445 996 +2698 1445 1060 +2714 1445 1140 +2698 1445 1253 +2714 1461 1349 +2714 1445 1429 +2778 1477 1493 +2826 1477 1574 +2810 1477 1622 +2891 1526 1718 +2923 1526 1766 +2987 1558 1847 +3035 1542 1911 +3099 1606 2007 +3003 1718 658 +2987 1718 658 +2987 1686 739 +2971 1686 835 +3003 1702 867 +3003 1718 964 +3035 1718 1076 +3115 1750 1124 +3003 1702 1204 +3083 1750 1317 +3148 1766 1413 +3180 1783 1493 +3212 1799 1542 +3276 1831 1638 +3324 1863 1734 +3356 1863 1799 +3404 1911 1911 +3324 2039 401 +3308 2023 450 +3292 2023 482 +3308 2023 546 +3308 2023 642 +3324 2023 771 +3324 2023 883 +3372 2072 996 +3421 2088 1092 +3421 2104 1188 +3437 2088 1285 +3485 2136 1429 +3549 2168 1526 +3565 2152 1622 +3613 2200 1750 +3613 2200 1847 +3694 2280 2007 +3629 2409 466 +3629 2409 530 +3629 2425 578 +3613 2409 610 +3613 2425 771 +3645 2441 883 +3645 2441 996 +3661 2441 1124 +3661 2441 1188 +3694 2489 1365 +3710 2505 1477 +3710 2489 1574 +3726 2521 1718 +3806 2569 1895 +3790 2602 2007 +3822 2618 2152 +3870 2698 2345 +3838 2858 980 +3806 2842 1012 +3806 2842 1012 +3822 2858 1108 +3806 2858 1188 +3838 2842 1253 +3822 2842 1365 +3838 2923 1558 +3854 2907 1654 +3854 2923 1750 +3854 2923 1863 +3854 2923 1991 +3886 3003 2200 +3854 2987 2296 +3902 3019 2457 +3918 3083 2618 +3918 3083 2714 +3918 3260 1526 +3918 3276 1574 +3902 3276 1606 +3918 3276 1654 +3902 3276 1702 +3918 3308 1847 +3902 3308 1943 +3902 3308 2039 +3918 3340 2168 +3918 3324 2264 +3918 3356 2409 +3950 3404 2553 +3934 3404 2634 +3950 3421 2810 +3918 3453 2971 +3918 3485 3083 +3950 3469 3212 +3967 3677 2088 +3999 3661 2088 +3967 3694 2136 +3967 3677 2168 +3983 3661 2232 +3967 3726 2361 +3950 3677 2393 +3967 3710 2537 +3967 3694 2618 +3983 3726 2746 +3983 3710 2826 +3983 3742 2987 +3999 3774 3115 +3967 3774 3196 +3934 3774 3324 +3934 3758 3388 +3999 3822 3597 +4015 3967 2409 +4015 3983 2457 +3999 3967 2473 +4047 3967 2521 +4015 3967 2569 +4015 3967 2618 +4015 3999 2730 +4015 3967 2826 +3999 3983 2891 +3999 3999 3003 +4015 3999 3099 +3999 3999 3196 +3999 3999 3340 +3999 4031 3453 +3967 4015 3533 +3983 4031 3661 +3967 4063 3838 +2072 177 755 +2056 161 787 +2056 177 867 +2039 177 931 +2023 193 1028 +2023 209 1108 +2039 177 1188 +2039 209 1285 +2072 209 1397 +2072 241 1477 +2088 241 1558 +2104 289 1670 +2088 305 1734 +2136 337 1831 +2184 369 1927 +2232 401 2056 +2264 450 2104 +2056 225 755 +2039 225 787 +2039 241 867 +2023 241 931 +2056 225 1012 +2039 225 1092 +2056 273 1204 +2056 241 1285 +2056 273 1397 +2088 273 1477 +2088 305 1558 +2104 289 1638 +2136 369 1734 +2152 353 1815 +2200 385 1943 +2216 434 2007 +2248 450 2104 +2088 289 787 +2072 273 819 +2072 289 867 +2072 289 947 +2088 273 1028 +2072 273 1124 +2072 305 1204 +2088 337 1285 +2056 353 1381 +2088 337 1445 +2120 401 1558 +2152 418 1670 +2168 401 1734 +2200 401 1831 +2216 450 1943 +2232 514 2023 +2296 498 2120 +2120 385 755 +2120 385 819 +2120 385 867 +2104 401 931 +2120 434 1028 +2120 385 1108 +2120 401 1188 +2120 434 1285 +2152 482 1397 +2152 466 1493 +2184 466 1558 +2184 498 1654 +2200 530 1718 +2232 530 1831 +2248 546 1927 +2329 594 2056 +2361 610 2136 +2184 546 787 +2184 546 835 +2184 546 883 +2200 530 964 +2184 546 1044 +2216 530 1124 +2200 546 1220 +2200 562 1301 +2200 594 1397 +2216 562 1477 +2232 610 1590 +2248 642 1654 +2280 642 1750 +2312 658 1863 +2329 658 1943 +2361 658 2039 +2425 707 2136 +2248 691 803 +2264 707 835 +2280 691 899 +2264 674 964 +2264 691 1044 +2232 691 1140 +2248 707 1220 +2280 723 1317 +2296 739 1397 +2312 739 1510 +2345 739 1574 +2329 755 1654 +2361 755 1750 +2361 771 1847 +2409 803 1959 +2489 851 2056 +2537 867 2120 +2377 835 803 +2329 835 835 +2345 851 883 +2345 867 964 +2345 835 1044 +2361 867 1156 +2345 867 1220 +2377 867 1317 +2361 867 1397 +2393 883 1493 +2441 883 1574 +2457 915 1670 +2505 947 1799 +2505 980 1863 +2602 996 1975 +2634 1028 2056 +2650 1028 2152 +2521 1060 835 +2521 1060 867 +2505 1060 915 +2521 1076 980 +2505 1044 1044 +2521 1060 1140 +2553 1060 1237 +2521 1044 1301 +2569 1108 1429 +2585 1092 1510 +2602 1124 1606 +2634 1140 1686 +2618 1140 1766 +2682 1140 1879 +2746 1172 1991 +2810 1237 2072 +2842 1237 2136 +2714 1253 851 +2650 1237 851 +2698 1237 931 +2650 1253 980 +2682 1253 1076 +2730 1301 1172 +2730 1301 1285 +2714 1269 1349 +2746 1301 1429 +2778 1317 1510 +2810 1317 1622 +2794 1317 1670 +2794 1333 1783 +2923 1413 1863 +2971 1397 1927 +3035 1429 1975 +3115 1461 2056 +2939 1493 771 +2987 1526 771 +2939 1477 835 +2971 1526 899 +2971 1526 947 +2955 1526 1044 +2971 1510 1124 +2971 1526 1220 +3067 1574 1285 +3083 1574 1413 +3051 1542 1461 +3067 1574 1542 +3131 1606 1622 +3148 1590 1702 +3260 1654 1783 +3324 1686 1847 +3421 1734 1943 +3260 1799 498 +3228 1766 594 +3228 1766 642 +3212 1766 707 +3260 1815 739 +3276 1799 851 +3260 1783 947 +3324 1847 1028 +3308 1847 1124 +3372 1863 1253 +3372 1879 1349 +3421 1895 1429 +3469 1911 1526 +3533 1943 1606 +3565 1975 1702 +3597 1975 1815 +3661 2007 1911 +3485 2104 289 +3565 2136 385 +3565 2136 434 +3565 2136 546 +3597 2168 674 +3549 2136 755 +3597 2152 867 +3613 2168 996 +3629 2168 1108 +3645 2216 1237 +3661 2200 1365 +3710 2264 1510 +3742 2264 1622 +3758 2296 1702 +3774 2280 1831 +3822 2377 1975 +3854 2377 2088 +3774 2537 626 +3790 2553 691 +3790 2553 691 +3790 2521 771 +3822 2602 947 +3838 2585 1028 +3774 2537 1108 +3854 2569 1253 +3838 2602 1365 +3854 2602 1477 +3870 2618 1622 +3870 2634 1766 +3918 2698 1943 +3934 2698 2007 +3918 2730 2152 +3983 2810 2377 +3983 2794 2457 +3934 2955 1156 +3934 2955 1204 +3934 2971 1253 +3934 2971 1285 +3967 3003 1397 +3950 3003 1493 +3934 3003 1590 +3950 2987 1702 +3950 2987 1766 +3967 3035 1927 +3967 3051 2072 +3967 3035 2152 +3967 3083 2312 +3967 3115 2505 +4015 3131 2618 +4015 3164 2762 +4031 3212 2923 +4031 3356 1702 +4031 3388 1783 +4031 3388 1831 +4015 3356 1799 +4015 3388 1927 +4031 3388 1991 +4047 3421 2152 +4047 3421 2232 +4031 3437 2329 +4031 3404 2409 +4015 3437 2521 +4015 3469 2682 +4031 3485 2794 +4047 3485 2923 +4015 3533 3115 +4047 3533 3212 +4063 3581 3356 +4095 3726 2200 +4095 3726 2232 +4095 3726 2264 +4095 3726 2264 +4095 3774 2409 +4095 3774 2473 +4079 3774 2569 +4063 3774 2634 +4047 3774 2714 +4063 3774 2794 +4063 3758 2923 +4047 3774 3019 +4079 3774 3131 +4079 3822 3292 +4063 3822 3388 +4047 3854 3533 +4063 3854 3645 +4095 3999 2537 +4095 3983 2489 +4095 3999 2521 +4095 3999 2585 +4095 3999 2634 +4095 4015 2730 +4095 3999 2762 +4095 3999 2858 +4095 4015 2939 +4095 4015 3035 +4095 4031 3164 +4063 4047 3324 +4079 4047 3421 +4047 4047 3517 +4047 4047 3613 +4015 4063 3822 +4031 4063 3918 +2248 289 755 +2248 289 819 +2248 289 851 +2264 241 931 +2248 257 1028 +2264 305 1124 +2264 337 1204 +2280 305 1317 +2296 337 1413 +2296 369 1493 +2280 401 1574 +2312 385 1670 +2329 434 1734 +2393 418 1863 +2409 466 1943 +2441 450 2007 +2473 530 2136 +2280 385 787 +2280 321 803 +2248 289 851 +2280 337 964 +2264 353 1028 +2248 353 1124 +2280 353 1220 +2280 385 1333 +2312 369 1413 +2312 385 1477 +2296 401 1558 +2329 466 1670 +2329 434 1718 +2377 450 1831 +2441 498 1943 +2457 546 2039 +2473 530 2104 +2296 401 787 +2312 434 851 +2296 401 883 +2264 401 947 +2280 434 1044 +2312 418 1124 +2296 418 1220 +2296 401 1317 +2312 482 1397 +2312 466 1477 +2361 466 1574 +2377 514 1654 +2393 498 1750 +2393 530 1831 +2425 578 1927 +2473 562 2039 +2505 562 2136 +2329 498 787 +2329 498 819 +2345 514 899 +2345 482 947 +2329 482 1044 +2329 498 1124 +2345 514 1204 +2361 562 1301 +2377 562 1397 +2377 562 1477 +2409 562 1574 +2393 578 1654 +2425 594 1766 +2441 626 1863 +2521 626 1959 +2569 691 2039 +2569 674 2120 +2377 578 803 +2409 626 835 +2409 626 883 +2409 642 964 +2425 610 1012 +2425 626 1124 +2425 642 1237 +2409 658 1317 +2393 658 1413 +2409 691 1493 +2441 691 1574 +2457 691 1670 +2505 691 1750 +2521 739 1863 +2569 755 1943 +2618 787 2039 +2714 835 2136 +2473 755 787 +2473 771 851 +2441 739 883 +2457 755 964 +2473 739 1060 +2457 739 1124 +2457 755 1204 +2489 771 1333 +2537 819 1413 +2553 819 1526 +2537 819 1590 +2585 883 1686 +2585 899 1783 +2634 867 1847 +2698 947 1943 +2714 947 2056 +2778 980 2136 +2634 931 851 +2585 899 851 +2585 947 915 +2618 947 996 +2634 964 1076 +2618 964 1140 +2602 964 1220 +2634 964 1333 +2682 1012 1445 +2682 1028 1526 +2698 1028 1590 +2714 1012 1702 +2730 1044 1766 +2762 1044 1879 +2842 1092 1991 +2858 1092 2072 +2923 1156 2168 +2762 1156 835 +2746 1108 867 +2730 1124 899 +2746 1108 947 +2762 1140 1060 +2746 1140 1140 +2794 1156 1269 +2778 1140 1333 +2826 1204 1445 +2826 1204 1493 +2826 1204 1606 +2907 1237 1718 +2907 1253 1783 +2971 1285 1847 +3035 1301 1943 +3051 1301 2007 +3131 1333 2088 +2907 1333 851 +2987 1365 835 +2971 1365 899 +2955 1381 947 +2955 1365 1044 +2955 1365 1092 +3019 1397 1220 +3019 1397 1269 +3035 1397 1333 +3019 1397 1477 +3051 1429 1526 +3083 1429 1590 +3148 1445 1670 +3228 1493 1718 +3260 1493 1815 +3340 1526 1895 +3356 1558 1943 +3196 1590 626 +3212 1606 674 +3212 1606 707 +3196 1606 771 +3196 1606 835 +3276 1638 915 +3276 1654 1012 +3292 1670 1124 +3276 1622 1220 +3324 1670 1285 +3340 1670 1413 +3372 1702 1461 +3437 1734 1542 +3469 1750 1622 +3517 1766 1734 +3549 1783 1783 +3645 1831 1895 +3501 1927 385 +3469 1911 418 +3501 1927 498 +3485 1895 578 +3485 1911 658 +3565 1959 755 +3565 1975 883 +3549 1959 1012 +3565 1943 1108 +3597 1975 1204 +3613 1975 1301 +3677 2023 1445 +3726 2056 1542 +3742 2088 1654 +3742 2056 1750 +3822 2136 1895 +3886 2168 2023 +3742 2248 369 +3790 2296 482 +3758 2232 498 +3790 2296 642 +3806 2280 739 +3822 2296 883 +3790 2280 980 +3806 2296 1060 +3822 2280 1172 +3854 2393 1365 +3870 2377 1461 +3886 2377 1558 +3902 2377 1702 +3918 2425 1831 +3967 2457 1991 +3983 2489 2104 +4031 2505 2216 +3967 2650 835 +3999 2714 931 +3950 2634 867 +3950 2634 947 +3999 2682 1076 +3967 2634 1140 +3983 2682 1301 +3999 2682 1365 +3983 2746 1574 +3983 2730 1654 +3999 2746 1783 +4031 2794 1975 +4031 2810 2072 +4063 2858 2280 +4079 2842 2345 +4063 2891 2489 +4095 2923 2650 +4095 3067 1365 +4095 3067 1397 +4047 3083 1429 +4079 3067 1510 +4047 3083 1542 +4063 3083 1622 +4063 3115 1783 +4079 3115 1895 +4079 3131 1991 +4079 3131 2088 +4095 3180 2248 +4063 3164 2345 +4095 3196 2521 +4095 3228 2714 +4095 3276 2794 +4095 3292 2955 +4095 3324 3131 +4095 3469 1911 +4095 3469 1943 +4095 3469 1943 +4095 3485 2039 +4095 3485 2088 +4095 3485 2152 +4095 3485 2248 +4095 3485 2329 +4095 3517 2489 +4095 3533 2585 +4095 3533 2698 +4095 3533 2810 +4095 3581 2955 +4095 3613 3099 +4095 3629 3244 +4095 3629 3356 +4095 3677 3517 +4095 3806 2361 +4095 3790 2345 +4095 3758 2296 +4095 3806 2425 +4095 3822 2489 +4095 3806 2553 +4095 3806 2618 +4095 3806 2714 +4095 3822 2810 +4095 3822 2891 +4095 3838 3051 +4095 3838 3131 +4095 3870 3244 +4095 3870 3372 +4095 3854 3453 +4095 3870 3581 +4095 3902 3710 +4095 4063 2618 +4095 4063 2618 +4095 4063 2650 +4095 4047 2682 +4095 4047 2746 +4095 4063 2826 +4095 4063 2891 +4095 4047 2971 +4095 4031 3035 +4095 4047 3131 +4095 4063 3324 +4095 4063 3421 +4095 4063 3549 +4095 4079 3661 +4095 4079 3790 +4095 4079 3886 +4095 4095 4031 diff --git a/packages/storybook-static/storyboard-site/assets/textures/SpecularHDR.dds b/packages/storybook-static/storyboard-site/assets/textures/SpecularHDR.dds new file mode 100644 index 00000000..5e388dea Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/SpecularHDR.dds differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nx.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nx.jpg new file mode 100644 index 00000000..f87788b9 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nx.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_ny.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_ny.jpg new file mode 100644 index 00000000..de0e0cbe Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_ny.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nz.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nz.jpg new file mode 100644 index 00000000..9ff99325 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_nz.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_px.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_px.jpg new file mode 100644 index 00000000..31e5ae2d Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_px.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_py.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_py.jpg new file mode 100644 index 00000000..b4684fb0 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_py.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_pz.jpg b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_pz.jpg new file mode 100644 index 00000000..7ce59f69 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/TropicalSunnyDay_pz.jpg differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/albedo.png b/packages/storybook-static/storyboard-site/assets/textures/albedo.png new file mode 100644 index 00000000..45200354 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/albedo.png differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/environment.dds b/packages/storybook-static/storyboard-site/assets/textures/environment.dds new file mode 100644 index 00000000..e8c89af1 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/environment.dds differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/grass.png b/packages/storybook-static/storyboard-site/assets/textures/grass.png new file mode 100644 index 00000000..6a072ab0 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/grass.png differ diff --git a/packages/storybook-static/storyboard-site/assets/textures/reflectivity.png b/packages/storybook-static/storyboard-site/assets/textures/reflectivity.png new file mode 100644 index 00000000..5504dc60 Binary files /dev/null and b/packages/storybook-static/storyboard-site/assets/textures/reflectivity.png differ diff --git a/packages/storybook-static/storyboard-site/favicon.ico b/packages/storybook-static/storyboard-site/favicon.ico new file mode 100644 index 00000000..d18513a6 Binary files /dev/null and b/packages/storybook-static/storyboard-site/favicon.ico differ diff --git a/packages/storybook-static/storyboard-site/manifest.json b/packages/storybook-static/storyboard-site/manifest.json new file mode 100644 index 00000000..12592547 --- /dev/null +++ b/packages/storybook-static/storyboard-site/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "react-babylonjs examples", + "name": "react-babylonjs examples", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/yarn.lock b/yarn.lock index 10791eb4..74a0b005 100644 --- a/yarn.lock +++ b/yarn.lock @@ -171,7 +171,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.12.10", "@babel/core@^7.15.5", "@babel/core@^7.16.0", "@babel/core@^7.7.5": +"@babel/core@^7.1.0", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.15.5", "@babel/core@^7.16.0", "@babel/core@^7.16.7", "@babel/core@^7.7.5": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== @@ -201,7 +201,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.15.4", "@babel/generator@^7.16.7", "@babel/generator@^7.16.8": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.15.4", "@babel/generator@^7.16.7", "@babel/generator@^7.16.8", "@babel/generator@^7.9.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== @@ -225,7 +225,7 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.8.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== @@ -445,7 +445,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.15.5", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.7.0": +"@babel/parser@^7.0.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.15.5", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.7.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== @@ -841,7 +841,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-flow-strip-types@^7.16.7": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== @@ -1212,7 +1212,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.8", "@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.16", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.8", "@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== @@ -1228,7 +1228,7 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== @@ -1244,7 +1244,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.12.13", "@babel/types@^7.12.7", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== @@ -1314,11 +1314,24 @@ babylonjs-gltf2interface "4.2.1" tslib ">=1.10.0" +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@discoveryjs/json-ext@^0.5.3": version "0.5.6" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" @@ -1331,7 +1344,7 @@ dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" -"@emotion/babel-plugin@^11.2.0", "@emotion/babel-plugin@^11.3.0": +"@emotion/babel-plugin@^11.2.0", "@emotion/babel-plugin@^11.3.0", "@emotion/babel-plugin@^11.7.1": version "11.7.2" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== @@ -1401,6 +1414,17 @@ "@emotion/utils" "0.11.3" babel-plugin-emotion "^10.0.27" +"@emotion/css@^11.7.1": + version "11.7.1" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.7.1.tgz#516b717340d36b0bbd2304ba7e1a090e866f8acc" + integrity sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg== + dependencies: + "@emotion/babel-plugin" "^11.7.1" + "@emotion/cache" "^11.7.1" + "@emotion/serialize" "^1.0.0" + "@emotion/sheet" "^1.0.3" + "@emotion/utils" "^1.0.0" + "@emotion/hash@0.8.0", "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" @@ -1430,7 +1454,7 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== -"@emotion/react@^11.1.5": +"@emotion/react@^11.1.5", "@emotion/react@^11.7.1": version "11.7.1" resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.7.1.tgz#3f800ce9b20317c13e77b8489ac4a0b922b2fe07" integrity sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw== @@ -1454,7 +1478,7 @@ "@emotion/utils" "0.11.3" csstype "^2.5.7" -"@emotion/serialize@^1.0.2": +"@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== @@ -1470,7 +1494,7 @@ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== -"@emotion/sheet@^1.1.0": +"@emotion/sheet@^1.0.3", "@emotion/sheet@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== @@ -1498,7 +1522,7 @@ "@emotion/styled-base" "^10.3.0" babel-plugin-emotion "^10.0.27" -"@emotion/styled@^11.3.0": +"@emotion/styled@^11.3.0", "@emotion/styled@^11.6.0": version "11.6.0" resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.6.0.tgz#9230d1a7bcb2ebf83c6a579f4c80e0664132d81d" integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw== @@ -1559,6 +1583,11 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@fontsource/roboto@^4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-4.5.1.tgz#63f7b783f755d8f6727eb60198627e7e1be3ac20" + integrity sha512-3mhfL+eNPG/woMNqwD/OHaW5qMpeGEBsDwzmhFmjB1yUV+M+M9P0NhP/AyHvnGz3DrqkvZ7CPzNMa+UkVLeELg== + "@gar/promisify@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" @@ -1818,7 +1847,7 @@ update-notifier "^2.2.0" yargs "^8.0.2" -"@iarna/toml@^2.2.5": +"@iarna/toml@^2.2.0", "@iarna/toml@^2.2.5": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== @@ -1844,6 +1873,38 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@jimp/bmp@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.14.0.tgz#6df246026554f276f7b354047c6fff9f5b2b5182" @@ -2191,6 +2252,92 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@mui/base@5.0.0-alpha.64": + version "5.0.0-alpha.64" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.64.tgz#1d108458932a81694efbf49f8b588e0a6bba3ff3" + integrity sha512-lqUFbAyYPl3uDaTxGWIUWx9Zin5APv5Rrn/oUcnm/71Isd5dJ94zoGHCTdNy2sxhDRcXRshsdC2dfdwIWxhkZA== + dependencies: + "@babel/runtime" "^7.16.3" + "@emotion/is-prop-valid" "^1.1.1" + "@mui/utils" "^5.2.3" + "@popperjs/core" "^2.4.4" + clsx "^1.1.1" + prop-types "^15.7.2" + react-is "^17.0.2" + +"@mui/icons-material@^5.2.5": + version "5.2.5" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.2.5.tgz#c6575430b565c023232147934c45775630a53f02" + integrity sha512-uQiUz+l0xy+2jExyKyU19MkMAR2F7bQFcsQ5hdqAtsB14Jw2zlmIAD55mV6f0NxKCut7Rx6cA3ZpfzlzAfoK8Q== + dependencies: + "@babel/runtime" "^7.16.3" + +"@mui/material@^5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.2.8.tgz#50bbf7f04306c122524a02dd2a0827d79b2bbd05" + integrity sha512-GYNYoTDw3C07D1rkB9pTS3xMH3gL0p3kb27SVMrMqP3AWrFxfrS73OnsonJh6Uy/F22pYX6rJxiFOhPq5+i4Eg== + dependencies: + "@babel/runtime" "^7.16.3" + "@mui/base" "5.0.0-alpha.64" + "@mui/system" "^5.2.8" + "@mui/types" "^7.1.0" + "@mui/utils" "^5.2.3" + "@types/react-transition-group" "^4.4.4" + clsx "^1.1.1" + csstype "^3.0.10" + hoist-non-react-statics "^3.3.2" + prop-types "^15.7.2" + react-is "^17.0.2" + react-transition-group "^4.4.2" + +"@mui/private-theming@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.2.3.tgz#6d4e7d8309adc932b444fdd091caec339c430be4" + integrity sha512-Lc1Cmu8lSsYZiXADi9PBb17Ho82ZbseHQujUFAcp6bCJ5x/d+87JYCIpCBMagPu/isRlFCwbziuXPmz7WOzJPQ== + dependencies: + "@babel/runtime" "^7.16.3" + "@mui/utils" "^5.2.3" + prop-types "^15.7.2" + +"@mui/styled-engine@^5.2.6": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.2.6.tgz#eac4a98b05b17190c2155b31b0e36338b3fb09f2" + integrity sha512-bqAhli8eGS6v2qxivy2/4K0Ag8o//jsu1G2G6QcieFiT6y7oIF/nd/6Tvw6OSm3roOTifVQWNKwkt1yFWhGS+w== + dependencies: + "@babel/runtime" "^7.16.3" + "@emotion/cache" "^11.7.1" + prop-types "^15.7.2" + +"@mui/system@^5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.2.8.tgz#c8a7adff69b50fea8ec9cb20a1f5bdab33c247f5" + integrity sha512-tje1HRubQUk+cDJBG5F83X1j0XzVe+qhellKxByrJVOEEDHoSpbc8UW+NCLSuBBHvOikxihuv3SS4VOWOo2/BQ== + dependencies: + "@babel/runtime" "^7.16.3" + "@mui/private-theming" "^5.2.3" + "@mui/styled-engine" "^5.2.6" + "@mui/types" "^7.1.0" + "@mui/utils" "^5.2.3" + clsx "^1.1.1" + csstype "^3.0.10" + prop-types "^15.7.2" + +"@mui/types@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.0.tgz#5ed928c5a41cfbf9a4be82ea3bbdc47bcc9610d5" + integrity sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ== + +"@mui/utils@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.2.3.tgz#994f3a500679804483732596fcfa531e59c56445" + integrity sha512-sQujlajIS0zQKcGIS6tZR0L1R+ib26B6UtuEn+cZqwKHsPo3feuS+SkdscYBdcCdMbrZs4gj8WIJHl2z6tbSzQ== + dependencies: + "@babel/runtime" "^7.16.3" + "@types/prop-types" "^15.7.4" + "@types/react-is" "^16.7.1 || ^17.0.0" + prop-types "^15.7.2" + react-is "^17.0.2" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2233,6 +2380,698 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@parcel/babel-ast-utils@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/babel-ast-utils/-/babel-ast-utils-2.2.0.tgz#8e1ab1f0118c1477ea50dd404d23d861502f7547" + integrity sha512-rIvqRJZ3ocPk9lZMQMlTgau3CO2bCI4fJb7lwiXVwK7E5XkJWcxyB3hplNXkSBCMDd69sQ9PNdZFW6wwzONuNQ== + dependencies: + "@babel/parser" "^7.0.0" + "@parcel/babylon-walk" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + astring "^1.6.2" + +"@parcel/babylon-walk@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/babylon-walk/-/babylon-walk-2.2.0.tgz#822ba7c74272d605a1edef24e7f57492373a2674" + integrity sha512-7H32Ln6hUAMaW46ba1S44l5EZ8l+boqQrV3iOVZEyPUUToOmFUD/TER+51M2CioXShvxdSZLVITKvbZLWRbTig== + dependencies: + "@babel/types" "^7.12.13" + lodash.clone "^4.5.0" + +"@parcel/bundler-default@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.2.0.tgz#85d5e8ae79641a9d9043ffdc2948ea4919dcf8b7" + integrity sha512-h661kIWbjcym8fh/cpTOosROCAMF/NgGdtQlQggxg9JKzH1Gj2ukxPk2uaJAML7k1MvKOF9B8PN1BRIGY3mxXA== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/cache@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.2.0.tgz#a3a12b6630e609b22b42b19a0a232656e50f1559" + integrity sha512-vzIuiui+VCIdvttIKIYen+IVNn6JbPv3I6MbJoNGM+UycVeK9N0yNAhSUbtZzGiBeyt1fLhq+46DSs11gV5IfA== + dependencies: + "@parcel/fs" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/utils" "^2.2.0" + lmdb "^2.0.2" + +"@parcel/codeframe@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.2.0.tgz#76c6f7c617e7cef692d72950129e0d59a66d9ab6" + integrity sha512-mszI8sRyDvzqcixb82dCXZKGrt/uQu2VVDsjGp9Tra1ZDJcHqWAw4ikcXVrzPnYqV6QxbD/MPt3q8ktgLKZv+A== + dependencies: + chalk "^4.1.0" + emphasize "^4.2.0" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +"@parcel/compressor-raw@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.2.0.tgz#6b93a4697b62eebe1ab7d0622a5651f220e1391b" + integrity sha512-w/SpIKuhlABjWQtWi6NyyHmgDMvEHsjvvGa9OhEycODz67KKEohkQ/YT5TmjBVBuljfY5XAocVKIKNuONV0DYA== + dependencies: + "@parcel/plugin" "^2.2.0" + +"@parcel/config-default@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.2.0.tgz#fef389dcfd49985de9901fd792a231970a240997" + integrity sha512-Xj4WaYpKxqAf5PEHMdRfOJSjFFslISQjPwRhoXTjHTCgzDHu/js+IsQ3iK1BDLsgq1g0KyLUVbP4xjzjfW/ANw== + dependencies: + "@parcel/bundler-default" "^2.2.0" + "@parcel/compressor-raw" "^2.2.0" + "@parcel/namer-default" "^2.2.0" + "@parcel/optimizer-cssnano" "^2.2.0" + "@parcel/optimizer-htmlnano" "^2.2.0" + "@parcel/optimizer-image" "^2.2.0" + "@parcel/optimizer-svgo" "^2.2.0" + "@parcel/optimizer-terser" "^2.2.0" + "@parcel/packager-css" "^2.2.0" + "@parcel/packager-html" "^2.2.0" + "@parcel/packager-js" "^2.2.0" + "@parcel/packager-raw" "^2.2.0" + "@parcel/packager-svg" "^2.2.0" + "@parcel/reporter-dev-server" "^2.2.0" + "@parcel/resolver-default" "^2.2.0" + "@parcel/runtime-browser-hmr" "^2.2.0" + "@parcel/runtime-js" "^2.2.0" + "@parcel/runtime-react-refresh" "^2.2.0" + "@parcel/runtime-service-worker" "^2.2.0" + "@parcel/transformer-babel" "^2.2.0" + "@parcel/transformer-css" "^2.2.0" + "@parcel/transformer-html" "^2.2.0" + "@parcel/transformer-image" "^2.2.0" + "@parcel/transformer-js" "^2.2.0" + "@parcel/transformer-json" "^2.2.0" + "@parcel/transformer-postcss" "^2.2.0" + "@parcel/transformer-posthtml" "^2.2.0" + "@parcel/transformer-raw" "^2.2.0" + "@parcel/transformer-react-refresh-wrap" "^2.2.0" + "@parcel/transformer-svg" "^2.2.0" + +"@parcel/core@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.2.0.tgz#0586b0bbc9dcda48720a62cad799a3b3464b24e7" + integrity sha512-5VvSEIHqfvTSk7aX1dcvyhZTkhSiJcma8SDpQ5wTCDhK0SScInl+y7yH2v8soUaRMDE3LD4uzYLaSoJeJH/BpQ== + dependencies: + "@parcel/cache" "^2.2.0" + "@parcel/diagnostic" "^2.2.0" + "@parcel/events" "^2.2.0" + "@parcel/fs" "^2.2.0" + "@parcel/graph" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/package-manager" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + "@parcel/workers" "^2.2.0" + abortcontroller-polyfill "^1.1.9" + base-x "^3.0.8" + browserslist "^4.6.6" + clone "^2.1.1" + dotenv "^7.0.0" + dotenv-expand "^5.1.0" + json-source-map "^0.6.1" + json5 "^1.0.1" + micromatch "^4.0.2" + msgpackr "^1.5.1" + nullthrows "^1.1.1" + semver "^5.7.1" + +"@parcel/diagnostic@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.2.0.tgz#717eba5d34da337c5ec0aa26cd2d2868da600edb" + integrity sha512-NJcuf7e3mbgcsaqaRq7XFLeYjAm4PJ+ZBNQGZhnnMgPDT4PjOAPUqBTBIjWyjbqRyxEosgSMbMxsZs6+U4Tt/g== + dependencies: + json-source-map "^0.6.1" + nullthrows "^1.1.1" + +"@parcel/events@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.2.0.tgz#a599aa4237b90672b01f6886934e88d8e1fd4b13" + integrity sha512-d5H9jPnCjVuNErNcDVFwxHK5zEUNr4wTcSH0CIeLshq/Z5mGhDlLC42QN4PuTR+9vHc56LlmEVrEKsLcTY5v8g== + +"@parcel/fs-search@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/fs-search/-/fs-search-2.2.0.tgz#de2be8829bb86db650594a1e4f37167afcac7334" + integrity sha512-EsyNFKGgixxGHTNEmfY3xGMEpAAFwEquHbaYn76SlXfQ6CLHjfGLPU5DkodSbiYE2uGwGbDQdChF60kYrHhIeQ== + dependencies: + detect-libc "^1.0.3" + +"@parcel/fs-write-stream-atomic@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/fs-write-stream-atomic/-/fs-write-stream-atomic-2.2.0.tgz#1b73f52151973b064208d7db35f8ffec6ccb2a11" + integrity sha512-c3nJJrsmxaFq0qDyRybq1f6hA7pD/gBj5N3FfFUbabMhKcPf/1tA9me4je4qiErtFPU25RmcL2X36mCrF9SvIg== + dependencies: + graceful-fs "^4.1.2" + iferr "^1.0.2" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +"@parcel/fs@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.2.0.tgz#1c9b13025b24f1c117bd712eab80717b7d4ff045" + integrity sha512-dn0TZAH98OYaSQwk5JrpfNmoPXn8tH5lbHKKm8VP8a1RhrG5TdynYbeZ8uu5XQ2FK1+M66/HtAdFLBLlevlWrw== + dependencies: + "@parcel/fs-search" "^2.2.0" + "@parcel/fs-write-stream-atomic" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + "@parcel/watcher" "^2.0.0" + "@parcel/workers" "^2.2.0" + graceful-fs "^4.2.4" + mkdirp "^0.5.1" + ncp "^2.0.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + utility-types "^3.10.0" + +"@parcel/graph@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-2.2.0.tgz#8a13b9e8c17c0074f9acbdffdf9f45ce37a14a47" + integrity sha512-3c1AZWO7ndpHPBxK1R+z+jS2MBBlsu2bKWVfUAPU3I9tGCGXKOhH5i/gO/jURSHx3g5s6ygZbfljAodpZ7W2DQ== + dependencies: + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/hash@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/hash/-/hash-2.2.0.tgz#12eb373a7fe64c791822a0655bd661e632e45e06" + integrity sha512-lXN4dY3y5ZxUP52jhd+C99kSWJRjIbh0lMpMqMGhkdIRoJUpvv24kQ2aItcgqazWWR9SS1NDZ0/z7+vHPMmEFw== + dependencies: + detect-libc "^1.0.3" + xxhash-wasm "^0.4.2" + +"@parcel/logger@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.2.0.tgz#ceb6783cc9fa807837f8a1b6a17856746c511753" + integrity sha512-HEiPq7EVmttDVZocebNbHDDhTWDUVD8UizLkRrLCtdRQGTcK0+WFitooamhjCQKXG0T/4/dh8ojIfWTQPMCFLg== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/events" "^2.2.0" + +"@parcel/markdown-ansi@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.2.0.tgz#507c2cd533a09ac27bb799d2905962c67c7b2861" + integrity sha512-N46Yun+jRA97rEhOKyMC3awIULw6KRPsV2JkI9yfc5EiOOA1CYmVNIB6OmgmuuvZYwq9OoHxB+XFkXF+yxiWBA== + dependencies: + chalk "^4.1.0" + +"@parcel/namer-default@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.2.0.tgz#51bee03db280b671677b2324bac118bab4c3369e" + integrity sha512-Iz5MLGTTLd5zQ+CbyV/4VjOiTFaQJaMwwu3W/GfaI2eLou2d9bazFaa786b4UM9u0LjLKYaUUzWDohllSwBwSg== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/node-libs-browser@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/node-libs-browser/-/node-libs-browser-2.2.0.tgz#bf5feabe76378f6504a4a72250a9438ec4892792" + integrity sha512-RtaJG+cdo60+ffq+tD9OwtTAqRG4cAyrFxWbeqYPb+RenpZJBWBJHRy1C5cjtH98sfXPzwMzROayQviFBvRq5w== + dependencies: + assert "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.5.0" + console-browserify "^1.2.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.12.0" + domain-browser "^3.5.0" + events "^3.1.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "^1.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + stream-browserify "^3.0.0" + stream-http "^3.1.0" + string_decoder "^1.3.0" + timers-browserify "^2.0.11" + tty-browserify "^0.0.1" + url "^0.11.0" + util "^0.12.3" + vm-browserify "^1.1.2" + +"@parcel/node-resolver-core@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.2.0.tgz#8aca3e8904a628e77d62bb0a8d310d0dcfc8960f" + integrity sha512-/YssRfsNLMQAYuNAGMOqThTbiWHQLJbDxsT7V/L387UkinR7TZl0ZKNjAwmb+DMD2oTKZfgLcUnLCcEyg9numg== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/node-libs-browser" "^2.2.0" + "@parcel/utils" "^2.2.0" + micromatch "^4.0.4" + nullthrows "^1.1.1" + +"@parcel/optimizer-cssnano@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-cssnano/-/optimizer-cssnano-2.2.0.tgz#7df8d0f2b85ea088c4154167b71680cc0ab678c9" + integrity sha512-YpVFJO9v8TqGZVvonu5OOmUS7AOn1z9t+YaqiuD/ytJGyePVPIBoZ9H6TlL17jLv0gbAXTTv1zoLDmae4/ruZQ== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + cssnano "^5.0.5" + postcss "^8.3.0" + +"@parcel/optimizer-htmlnano@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.2.0.tgz#a12f77bbf9c4de6468d62f73cb8e1a108ede6c3c" + integrity sha512-Lrsjz5sG5uayhIGAcAv5IqOPY8FJnsy4XeT0EUc70cAI9p3NS48HZqqPfWAn9nsMqu3EBhKNyFpiaJ4LY6LNkg== + dependencies: + "@parcel/plugin" "^2.2.0" + htmlnano "^1.0.1" + nullthrows "^1.1.1" + posthtml "^0.16.5" + svgo "^2.4.0" + +"@parcel/optimizer-image@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.2.0.tgz#d8ebc71bff53cc5ccde5e5cc0e2d2523f5ff0b59" + integrity sha512-bvrR7wX4GbcqR38MzSVImedyL3huFeMxyjdpElq6J4RKIGY3KK/+k4VhVzU0wGqIx+XTuJxNJWJGkJ8i+mESEw== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + "@parcel/workers" "^2.2.0" + detect-libc "^1.0.3" + +"@parcel/optimizer-svgo@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.2.0.tgz#fa84d90c51571266c96c815494a5321f03df3208" + integrity sha512-gBMQPn4EGOGsEQI0MjK1PoD7w2QrMvoyk7QvSbES1F91lhYh4e3zc1op3G/hdT6IiudlrbNgsSvMZCuxyFp6Uw== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + svgo "^2.4.0" + +"@parcel/optimizer-terser@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.2.0.tgz#db672ca93c67326de64aa58aacde2c012ae71ba5" + integrity sha512-R0QC9JAFJpoPS4mUltVLHbiLOeyv5G5kmM2MhJN3VYJyJNForMHvFwFBRQLxp8GbJ9pU3P36dN8jRfrlPQffog== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + terser "^5.2.0" + +"@parcel/package-manager@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.2.0.tgz#8c37dd1cb5e508b33f2600a5228873d5837b2aa6" + integrity sha512-FTh8/E6AMvRJTbNav7MD8ZULvTuZhUKBpfQu07oL1khE4O6KYyQ8NBGk3W221dfY+vXoM2+b+4BrKBgw8Sn3EA== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/fs" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + "@parcel/workers" "^2.2.0" + command-exists "^1.2.6" + cross-spawn "^6.0.4" + nullthrows "^1.1.1" + semver "^5.7.1" + split2 "^3.1.1" + +"@parcel/packager-css@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.2.0.tgz#d2c13249f8ecaab571b4d301bb94f64ef065a6a6" + integrity sha512-FUn7HEDb3q6/T4Z0We+kpD5zKYwEkK2ClTyDAEDvnqtEz2A+DIrvxarwtW8NlA+uSKOH+kioMrV7Gdl0RpN5XA== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + postcss "^8.3.0" + +"@parcel/packager-html@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.2.0.tgz#af3e53d2270e82301c08831c1913595b0e629aef" + integrity sha512-Hbp7z/1TQb5WZcystsO6ICuUVJblkVaWMw60hVDezkLsKTB87Qc81OIsqyST3LMhqM7NipsNqpaXvmg3wF6zrA== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + +"@parcel/packager-js@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.2.0.tgz#f0347dd240d77c42bc9f007f26bb174144d9eacc" + integrity sha512-dQmJqRAjy0RxWqGDSkfpyxMcUx3btqltSdK/Z8sUPVvNfss1gHRuz3Ee5CJxNoLLN8On+qM4xAvq2W3y16psbA== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + globals "^13.2.0" + nullthrows "^1.1.1" + +"@parcel/packager-raw@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.2.0.tgz#83de58ed88830d49066a6141497d035a201c0f19" + integrity sha512-Iz/rltpChammeEUotDZqzZr5WZcJGr2ro68GBt/8/oMU0HDWItsWUF8EtsqSuPiQWYU+65xcXPguk2cQ1qXObg== + dependencies: + "@parcel/plugin" "^2.2.0" + +"@parcel/packager-svg@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.2.0.tgz#7e86a83b385c2d3134444d499f344a6a13f06570" + integrity sha512-APNuRVV6fRg36rL+H4nORCOe/gxzkDjF8UUldQLbxZdsYaL+9YvJA+4vmULce96b9Fcq7ZOkqUeDvQmWw9kLNw== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + posthtml "^0.16.4" + +"@parcel/packager-ts@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-ts/-/packager-ts-2.2.0.tgz#b16c6bb4f037145485fcb0c8c12eac1f3190696d" + integrity sha512-qKU6v6iJluTkKaqP42zoojILoM55OqWY1FYM8b3L9Egl9ojuBXgYt4p8bb0gIIonIXaFWGZ8pPpiC7Ll7p6DVw== + dependencies: + "@parcel/plugin" "^2.2.0" + +"@parcel/plugin@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.2.0.tgz#dfd80fd5c8e9663b2a08b1235297ab7abdadcca4" + integrity sha512-etIxpizU14aZELSV/qEeuufoC5fLgopQ9I0j/Y9ExSmlU3NH79NeQo0JPP1TU49ZOL8Si9o/D6tlhojle6GbzA== + dependencies: + "@parcel/types" "^2.2.0" + +"@parcel/reporter-cli@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.2.0.tgz#2f220cc2d5bf02674dd1b1c546794b34785422e5" + integrity sha512-FVRnSu5Yba/18X3KWiJEXLfT8KugsNoQmvnfL7FDgVbdxUS/RWPeAwICfXPH9pkqZBl9c7QcMDVtnSD3xNR8FA== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + chalk "^4.1.0" + filesize "^6.1.0" + nullthrows "^1.1.1" + ora "^5.2.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + term-size "^2.2.1" + wrap-ansi "^7.0.0" + +"@parcel/reporter-dev-server@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.2.0.tgz#307d386197f45bd2c7b8e25c5c25142d89400b87" + integrity sha512-r6FRJ1BU/zHZvAxSvG5p0o2ZJgEkYDqU2y99a5tvRhQAIMupNp9Oc3PkAIOcoGtM3aiJvGO5pwDBoOpNwS4hwQ== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + connect "^3.7.0" + ejs "^3.1.6" + http-proxy-middleware "^1.0.0" + nullthrows "^1.1.1" + serve-handler "^6.0.0" + ws "^7.0.0" + +"@parcel/resolver-default@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.2.0.tgz#8e45d483e26e6df0698f9c1d93d1d7535f38df5c" + integrity sha512-mDEmFVcNI4AAnKZ2P44AqKGVpG2vt9npmRNRyCw1QZvCnETiTVvHl0AngVtZRP6DVw0MeuPt7JaFWy3DQ+LMnQ== + dependencies: + "@parcel/node-resolver-core" "^2.2.0" + "@parcel/plugin" "^2.2.0" + +"@parcel/runtime-browser-hmr@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.2.0.tgz#458f77b46190de6835457bf3cf5dc1ae554a6dcb" + integrity sha512-Y3K8bpm06xZ2IgzS8l8iBhHoc04CcJzwWsRS60xGHikDxkZWbUMCvxMjgUS6NmDo62aY3dFkD6VVFKZIRnWxCQ== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + +"@parcel/runtime-js@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.2.0.tgz#a0ba9345390398c372e3fe2fea944916ad554b62" + integrity sha512-XgI/lmX/7Lp9y9KpnxehryvbHtKs9KVLs6V6MmiMXb7s74S/A6cj4cWq+AhSfz2mZtvMJAhIw3bl5vYNx8qEog== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/runtime-react-refresh@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.2.0.tgz#1f4a56a83aa90df1432628560309f1c93c663449" + integrity sha512-bnIW3K37cH2PoGXl5NX8401exe97VGORz5YTAm6BSHiXKWZkOHwE6dTj6/PydQRm4NLAiYlJ6hvxcu5QkF7/jw== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + react-refresh "^0.9.0" + +"@parcel/runtime-service-worker@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.2.0.tgz#630f97b8b136287b9825e09242bf1c02331da96d" + integrity sha512-+lwIBdTbhvhkYYNKG5ZxMaQ2wY/eaJqDjVelEpfvuoRzjR+v2YwKyAP4wV8DKzMb/lbtj6fsG+GerqaSwGVdDg== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/source-map@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@parcel/source-map/-/source-map-2.0.0.tgz#41cf004109bbf277ceaf096a58838ff6a59af774" + integrity sha512-njoUJpj2646NebfHp5zKJeYD1KwhsfQIoU9TnCTHmF9fGOaPbClmeq12G6/4ZqGASftRq+YhhukFBi/ncWKGvw== + dependencies: + detect-libc "^1.0.3" + globby "^11.0.3" + +"@parcel/transformer-babel@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.2.0.tgz#0dda0da9f6f9df59d5e2dcc13085c96a84b6985f" + integrity sha512-amZIncU9Ld/SuIWajntAOXwsgYl6h+5e2qBIPYuFhZX3FrbhHJFJQ27GJxOmRu+C09JOpAQk7vlr6Oi6jLvxNw== + dependencies: + "@babel/core" "^7.12.0" + "@babel/generator" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.4" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@parcel/babel-ast-utils" "^2.2.0" + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + browserslist "^4.6.6" + core-js "^3.2.1" + json5 "^2.1.0" + nullthrows "^1.1.1" + semver "^5.7.0" + +"@parcel/transformer-css@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.2.0.tgz#b06fd42112f375541bcaaa3565a99d7b1d5aefa1" + integrity sha512-90GNysl/E8ScT6VxAqkgmsOi5HxkzX5xuj8YjjyKGls2DO3wZKjIi8q5ZGKjKLcWfKdF5gCzuvuObcg9nyMLug== + dependencies: + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + css-modules-loader-core "^1.1.0" + nullthrows "^1.1.1" + postcss "^8.3.0" + postcss-modules "^3.2.2" + postcss-value-parser "^4.1.0" + semver "^5.7.1" + +"@parcel/transformer-html@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.2.0.tgz#2149b6cad3e8d49cf331823abc6ea13b81f0501b" + integrity sha512-Swvo4TUqyGcwN3AsUMRg5dZRaJnS2DUapJlr7wHmf5bL8Q0GOuGDLLZpK5SOmQn9aZSJ6uoof5gu9zoca+s5Ig== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^5.7.1" + +"@parcel/transformer-image@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.2.0.tgz#8348f426cadb3cae1d7a7adbca3a3d9bc9ef3d11" + integrity sha512-9MRmgNRi8Dg+GMA1378smh0m/xfzPpTljR23jKvwviNsz54Tf67pC328DGaI6+5eNIw4fYFZxJTXcOSAVVKk2Q== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/workers" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/transformer-js@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.2.0.tgz#06b2b323e6839d35e8e56395d99726fe052c82cb" + integrity sha512-sD9NXeO6j6wEe8zkRcVU235fLGhyBWEhOpAbqd23+YjFgwpYq58aqw0v2tX3Ifv+jFuw8wYvRbN7Eq4hCKdjSw== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/utils" "^2.2.0" + "@parcel/workers" "^2.2.0" + "@swc/helpers" "^0.2.11" + browserslist "^4.6.6" + detect-libc "^1.0.3" + micromatch "^4.0.2" + nullthrows "^1.1.1" + regenerator-runtime "^0.13.7" + semver "^5.7.1" + +"@parcel/transformer-json@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.2.0.tgz#f053c0c04e6b6b2b060c4ac28077dbbede8c2ccc" + integrity sha512-SukzfuncSeK0nFahA4cgSNM9JAltp1TZBiIFTi6sufAfpr4g8de04uk8l09dPxEggSkRGFGvxiNeJfxXGqEkMg== + dependencies: + "@parcel/plugin" "^2.2.0" + json5 "^2.1.0" + +"@parcel/transformer-postcss@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.2.0.tgz#0ddc5455f58dab1fe873307c02a86a334f164ea3" + integrity sha512-u8aZ63oL9N28HXZTQPVz3eYoza+BzI86qXqrpT5nsTEHypnRiskih25ucwkYjWyBrOUavIn+ihLO7qKaVgGixQ== + dependencies: + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + clone "^2.1.1" + css-modules-loader-core "^1.1.0" + nullthrows "^1.1.1" + postcss-modules "^3.2.2" + postcss-value-parser "^4.1.0" + semver "^5.7.1" + +"@parcel/transformer-posthtml@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.2.0.tgz#dc85d0e474df2a2cd3a5ed61cb241bc2edd59e64" + integrity sha512-7xtnLh2wrVLZiU0pTkUWNwr2S4v3u/lgDDSr6UNQcjDHMdMUdbN8CIoraYNm3cEiTzb8O6OQEYHyH2ZEc753Xw== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^5.7.1" + +"@parcel/transformer-raw@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.2.0.tgz#f5c623996b0e819bca87ede51d73de9bcc277a57" + integrity sha512-xSSulmsPFNi6T/Ji/GeWIe3UatHEAemIBX3KZsvDDjy0P4olaNmeU/IvL+bb1H4NXKynOAgzyIR0S7bEpIj6Fw== + dependencies: + "@parcel/plugin" "^2.2.0" + +"@parcel/transformer-react-refresh-wrap@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.2.0.tgz#f6c6040b9d1edaecd880e8c21f66211cf6ae19fb" + integrity sha512-bPFXG7nB3dleH1pAfvlPXOY02CR5DZCoAGmu+D24VUyXXIEOX6RlB6nGls10FL7FSMLT1Q2iuJCS4DsFMIXLsw== + dependencies: + "@parcel/plugin" "^2.2.0" + "@parcel/utils" "^2.2.0" + react-refresh "^0.9.0" + +"@parcel/transformer-svg@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.2.0.tgz#f38c8f2809afa162380af0fb98d26e695cb2119a" + integrity sha512-tiGRVgwm/Fc36H/JUkvzcHAs+BPfOVcb171bgu5zUkDhfFj6ty5fvAQ9OThHJ6mV1vv/KGJuPbH4N1+wW/P4zQ== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/plugin" "^2.2.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^5.7.1" + +"@parcel/transformer-typescript-types@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.2.0.tgz#208ec2753f5bd4d73f629e6ef8c7034d2b23c486" + integrity sha512-+d98cJVDRQc9zy6o+J5YsSccSqsNVdWuK/PTw6EACMPzmg2k8mGecyccXAoaz1/VBJo0MuMDAENMTQA1tZAKNQ== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/plugin" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/ts-utils" "^2.2.0" + nullthrows "^1.1.1" + +"@parcel/ts-utils@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.2.0.tgz#49ac0886ad9004096cb2ac3e4464c996eafd3da7" + integrity sha512-ULU3ydGejuynQ1fenSCrURF3iPvUrggWaoDK2EHahk+MuILnbXFndwb9ZgHeS4FyAmmBiZVYrslWdzdOjda0mQ== + dependencies: + nullthrows "^1.1.1" + +"@parcel/types@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.2.0.tgz#781cacacda6ccb02c4f0454463ec408a28f4f9bb" + integrity sha512-QmzC/EowXifXYCRwWZS1/jC5yiWCV1R5YuKDhEj9AgKU6LOAMXAnfBwYB4jRnY+1Zv+n/Pf2LD24sz02sXzScQ== + dependencies: + "@parcel/cache" "^2.2.0" + "@parcel/diagnostic" "^2.2.0" + "@parcel/fs" "^2.2.0" + "@parcel/package-manager" "^2.2.0" + "@parcel/source-map" "^2.0.0" + "@parcel/workers" "^2.2.0" + utility-types "^3.10.0" + +"@parcel/utils@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.2.0.tgz#92d88f4603f943d10208728369881c667b3b6fd6" + integrity sha512-H1SqGvbhlNIFoiMTLX/aEGCGG0KYWQCc9Nf5BJ+75/lTaznZKCcUgv4pqu5j2PxmKlyl61aNkX69H9lWjdcvMw== + dependencies: + "@iarna/toml" "^2.2.0" + "@parcel/codeframe" "^2.2.0" + "@parcel/diagnostic" "^2.2.0" + "@parcel/hash" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/markdown-ansi" "^2.2.0" + "@parcel/source-map" "^2.0.0" + ansi-html-community "0.0.8" + chalk "^4.1.0" + clone "^2.1.1" + fast-glob "3.1.1" + fastest-levenshtein "^1.0.8" + is-glob "^4.0.0" + is-url "^1.2.2" + json5 "^1.0.1" + lru-cache "^6.0.0" + micromatch "^4.0.4" + node-forge "^1.2.1" + nullthrows "^1.1.1" + open "^7.0.3" + terminal-link "^2.1.1" + +"@parcel/watcher@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.5.tgz#f913a54e1601b0aac972803829b0eece48de215b" + integrity sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@parcel/workers@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.2.0.tgz#12f9774c9dc3c4e6a8427e9c7b79ee59dc20f2b6" + integrity sha512-qJTC+61LMz5eBHvT0lT+auoTKDzh/FemQrWzCdcQZjgECQyLYdD6GtMeCZP745pDfXcYZpflbSGZChIUnt1yDg== + dependencies: + "@parcel/diagnostic" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/types" "^2.2.0" + "@parcel/utils" "^2.2.0" + chrome-trace-event "^1.0.2" + nullthrows "^1.1.1" + "@philpl/buble@^0.19.7": version "0.19.7" resolved "https://registry.yarnpkg.com/@philpl/buble/-/buble-0.19.7.tgz#27231e6391393793b64bc1c982fc7b593198b893" @@ -2484,11 +3323,18 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": +"@popperjs/core@^2.10.1", "@popperjs/core@^2.4.4", "@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": version "2.11.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== +"@react-aria/ssr@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.0.tgz#b7163e6224725c30121932a8d1422ef91d1fab22" + integrity sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-spring/animated@9.0.0-rc.3": version "9.0.0-rc.3" resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.0.0-rc.3.tgz#e792cb76aacecfc78db2be6020ac11ce96503eb5" @@ -2519,6 +3365,29 @@ fluids "^0.1.6" tslib "^1.11.1" +"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.5.tgz#e7acbea237bfc9e479970500cf87538b41a1ed02" + integrity sha512-tLGtY0aHeIfT7aPwUkvQuhIy3+q3w4iqmUzFLPlOAf/vNUacLaBt1j/S//jv/dQhenRh8jvswyMojCwmLvJw8A== + dependencies: + dequal "^2.0.2" + +"@restart/ui@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-0.2.5.tgz#e94204cbc88a9d13d1d20ce9cdf4713998b7c0fa" + integrity sha512-3dP8pMFickPpvAG5MVQW53HnJl0c17h7MwvI4nNy9QF66sHSYVchudlqlI8eOSaqnmc5YVjGura63vMb9LTNbQ== + dependencies: + "@babel/runtime" "^7.13.16" + "@popperjs/core" "^2.10.1" + "@react-aria/ssr" "^3.0.1" + "@restart/hooks" "^0.4.0" + "@types/warning" "^3.0.0" + dequal "^2.0.2" + dom-helpers "^5.2.0" + prop-types "^15.7.2" + uncontrollable "^7.2.1" + warning "^4.0.3" + "@rollup/plugin-json@^4.0.2": version "4.1.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" @@ -2551,6 +3420,14 @@ estree-walker "^2.0.1" picomatch "^2.2.2" +"@s-libs/micro-dash@12": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@s-libs/micro-dash/-/micro-dash-12.0.0.tgz#79dd682a2545467b4fe9d123253f6178d8afce23" + integrity sha512-TQlYM5YJj/NZ6FuicfjAg3Lv5xeZ69Sp2CwEVVcqD19LcyZd6zjEnWgRpbglWsozhQHsBpXtoIKoUQMuW6UTpQ== + dependencies: + tslib "^2.1.0" + utility-types "^3.10.0" + "@sideway/address@^4.1.3": version "4.1.3" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.3.tgz#d93cce5d45c5daec92ad76db492cc2ee3c64ab27" @@ -2606,21 +3483,202 @@ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@storybook/addon-actions@6.4.13", "@storybook/addon-actions@^6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.4.13.tgz#3c33cbffb8857f27f528d0e35ae9ba806d95ee0b" + integrity sha512-Bf/M3Kdq60xj48oXnRCm7+qstWL9wT8rjFPFm7+A0NSfVSlox6pFU5SfPuOI4Za/6Ll2XDaYwsaF3QYHX0jQAA== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + polished "^4.0.5" + prop-types "^15.7.2" + react-inspector "^5.1.0" + regenerator-runtime "^0.13.7" + telejson "^5.3.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + uuid-browser "^3.1.0" + +"@storybook/addon-backgrounds@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.13.tgz#e233daa7e5bcf417bfd885e1ad7e2d8d7873e9ad" + integrity sha512-U+TowEgEHCWifdnaJE5P7kgRHjYrztwpjp/8tX4iXHlCVFBFid+v4EKqXQGbvTzX66g2Yfv/h68NGEpcFW/svQ== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + global "^4.4.0" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-controls@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.4.13.tgz#7875abb01ddcf893dd915bf2f965f97b53cfae84" + integrity sha512-XDaeYcwCi4qQ8hGXn4Mbdb6CQGGfZoBm5UjUaWBjDJdo54AyZv3VYdNgWFdiitqk5LRyh2omHD54EditM774NQ== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-common" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/node-logger" "6.4.13" + "@storybook/store" "6.4.13" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + lodash "^4.17.21" + ts-dedent "^2.0.0" + +"@storybook/addon-docs@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.4.13.tgz#7d6990d3afcb4e6334891880ea55da7cab118719" + integrity sha512-frsHcZD3jabIXxYkenwigJhAiqmbeBztc1cUTMWSZ9kVDJN6h2msq/vD0LEotfjcvDe3XS2HZgBjdDJ1UUUj/g== + dependencies: + "@babel/core" "^7.12.10" + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@jest/transform" "^26.6.2" + "@mdx-js/loader" "^1.6.22" + "@mdx-js/mdx" "^1.6.22" + "@mdx-js/react" "^1.6.22" + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/builder-webpack4" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/csf-tools" "6.4.13" + "@storybook/node-logger" "6.4.13" + "@storybook/postinstall" "6.4.13" + "@storybook/preview-web" "6.4.13" + "@storybook/source-loader" "6.4.13" + "@storybook/store" "6.4.13" + "@storybook/theming" "6.4.13" + acorn "^7.4.1" + acorn-jsx "^5.3.1" + acorn-walk "^7.2.0" + core-js "^3.8.2" + doctrine "^3.0.0" + escodegen "^2.0.0" + fast-deep-equal "^3.1.3" + global "^4.4.0" + html-tags "^3.1.0" + js-string-escape "^1.0.1" + loader-utils "^2.0.0" + lodash "^4.17.21" + nanoid "^3.1.23" + p-limit "^3.1.0" + prettier "<=2.3.0" + prop-types "^15.7.2" + react-element-to-jsx-string "^14.3.4" + regenerator-runtime "^0.13.7" + remark-external-links "^8.0.0" + remark-slug "^6.0.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-essentials@^6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.4.13.tgz#9deec5014dcad4ce58c66e5a6f7bf289cea0f10f" + integrity sha512-ekvyeVckKkffGQMzp6cT0/Mi8Wo1fqF/DGp3vJIcIrExfvuZa/qi8PoHyx+cr8dfI0b8Jf8Lv7qcLIxNnkA5Bg== + dependencies: + "@storybook/addon-actions" "6.4.13" + "@storybook/addon-backgrounds" "6.4.13" + "@storybook/addon-controls" "6.4.13" + "@storybook/addon-docs" "6.4.13" + "@storybook/addon-measure" "6.4.13" + "@storybook/addon-outline" "6.4.13" + "@storybook/addon-toolbars" "6.4.13" + "@storybook/addon-viewport" "6.4.13" + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/node-logger" "6.4.13" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + +"@storybook/addon-links@^6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-6.4.13.tgz#fbec1ef4d29a14d6d0dc85c6be473eebad91a31a" + integrity sha512-d/uxMZoEjgCRhVvJXYIKJ0VtHARA7p7/oDxBMiexBDGZ2FzZWtq/nejdER539X71JMUkjkaqTs+ekTunZe0eMg== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/router" "6.4.13" + "@types/qs" "^6.9.5" + core-js "^3.8.2" + global "^4.4.0" + prop-types "^15.7.2" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" -"@sinonjs/samsam@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" - integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== +"@storybook/addon-measure@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.4.13.tgz#dcf2f3f791f662a35a1331f8133d1c3bae3b823b" + integrity sha512-uOnJrSWNlMznScCfeXkhqlenLoz6DBgNgBxuP7P6TiF5cxq7Xwv23RX3Hj1nzybP+wvUPEj08FBCh8BqgGOsOA== dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + core-js "^3.8.2" + global "^4.4.0" -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@storybook/addon-outline@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.4.13.tgz#891955b0d88de843863d3e5860f29754bc98144b" + integrity sha512-9BR70PRQeHtED/NkDp6JPRPrpKA43AubgRu4PHUJ0sbaD7o2DMHPKtt2AcsZoL7JSeGDl30cYzfn3pVZDPVxEA== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" "@storybook/addon-storysource@^6.3.12": version "6.4.12" @@ -2642,6 +3700,35 @@ react-syntax-highlighter "^13.5.3" regenerator-runtime "^0.13.7" +"@storybook/addon-toolbars@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.4.13.tgz#c28fb72897709f689cda3675d3c0a4c26a6fe20d" + integrity sha512-57/bO5MsVnRjmxff+JjQzqjWCzX1KDHR8zla1RpaGsW5ejXcQumW38Xbp0OCscD7wGLL/b58GM/9OIk38LqBwA== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + +"@storybook/addon-viewport@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.4.13.tgz#0307e7664ef1c791d5f0f28e11e229d2cc7c35c1" + integrity sha512-EzgPyLRTDgezSlZ7yCKDhR/VcKBECEdd7JCLiuVbfrThVhaKzM9gCx5pDnc0qTflx0DagqkIWFHNVPQt2KnQ3g== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + global "^4.4.0" + memoizerific "^1.11.3" + prop-types "^15.7.2" + regenerator-runtime "^0.13.7" + "@storybook/addons@6.4.12": version "6.4.12" resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.12.tgz#87e5d37d54478582708b2b4cce57b4cf0abb952f" @@ -2659,6 +3746,23 @@ global "^4.4.0" regenerator-runtime "^0.13.7" +"@storybook/addons@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.13.tgz#df35a7ad908018125eb817ec6a3af05fac09543a" + integrity sha512-2oxZ/VOuXUpOvtKGy+fR1FNwyfaTkzKs9I6cZq2zbEGK2q/5x6rtczwNRm5PjK35At+VurMq0E+IHH10JO9vHw== + dependencies: + "@storybook/api" "6.4.13" + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/router" "6.4.13" + "@storybook/theming" "6.4.13" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + "@storybook/api@6.4.12": version "6.4.12" resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.12.tgz#47bf0085c681acdae2f35d3c314745c591b0ddf6" @@ -2682,10 +3786,33 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/builder-webpack4@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.4.12.tgz#bb500f7c89c4063710b520493d17a3217ee097c6" - integrity sha512-TS9rZdykeaURiLRA6JaP9AtrT9VF7O+UTMBZbSlKk3L/v67/WqfpsXsjB9DYHd8xlAlQJ/EBrWqPCIjORpwMAQ== +"@storybook/api@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.13.tgz#bf5ced25a31c4c76432fd57a133406f8e2a1ce45" + integrity sha512-Hr5/dL4tLnQPjrUlVdhsYMSAuJmsZcu3jdfqpjbsDC9S2HNaVtyHGBhQ33jD8+xtXoorsuS7t4SfWzLOgPPflg== + dependencies: + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/router" "6.4.13" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.4.13" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + telejson "^5.3.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/builder-webpack4@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.4.13.tgz#529087b9d64c3634e237f0a837f97fe1db4a564a" + integrity sha512-Vjvje/XpFirVY6bOU+ahS2niapjA0Qams5jBE8YnPUhbigqsLOMMpnJ+C505xC6S5VW0lMkhJpCQ1NQyva3sRw== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -2708,22 +3835,22 @@ "@babel/preset-env" "^7.12.11" "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" - "@storybook/addons" "6.4.12" - "@storybook/api" "6.4.12" - "@storybook/channel-postmessage" "6.4.12" - "@storybook/channels" "6.4.12" - "@storybook/client-api" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/components" "6.4.12" - "@storybook/core-common" "6.4.12" - "@storybook/core-events" "6.4.12" - "@storybook/node-logger" "6.4.12" - "@storybook/preview-web" "6.4.12" - "@storybook/router" "6.4.12" + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/channel-postmessage" "6.4.13" + "@storybook/channels" "6.4.13" + "@storybook/client-api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-common" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/node-logger" "6.4.13" + "@storybook/preview-web" "6.4.13" + "@storybook/router" "6.4.13" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.12" - "@storybook/theming" "6.4.12" - "@storybook/ui" "6.4.12" + "@storybook/store" "6.4.13" + "@storybook/theming" "6.4.13" + "@storybook/ui" "6.4.13" "@types/node" "^14.0.10" "@types/webpack" "^4.41.26" autoprefixer "^9.8.6" @@ -2745,7 +3872,6 @@ postcss-flexbugs-fixes "^4.2.1" postcss-loader "^4.2.0" raw-loader "^4.0.2" - react-dev-utils "^11.0.4" stable "^0.1.8" style-loader "^1.3.0" terser-webpack-plugin "^4.2.3" @@ -2758,26 +3884,26 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.2.2" -"@storybook/channel-postmessage@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.4.12.tgz#5da3758c238ca3878cec3cad012cc52ba7cc3ade" - integrity sha512-zVHOa++JmcBYb8kNvaqkwLtNXWyaJ2jFZpZ/VJpe+q+pzMoM199DqRfahZ0xasPJC3gMlRxFNYCWZCqIIYFPoQ== +"@storybook/channel-postmessage@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.4.13.tgz#e299a75db2e572662b9bd7f92bc9eedd2df51dd9" + integrity sha512-fyju7H/t2oDp9yci6KImRDPr9FnGV6B0juJ+2kEtVAmeDo55BScjT96SQuS/uk4c0wo6NZMrCt6HiC4zOmrD6g== dependencies: - "@storybook/channels" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/core-events" "6.4.12" + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" core-js "^3.8.2" global "^4.4.0" qs "^6.10.0" telejson "^5.3.2" -"@storybook/channel-websocket@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.4.12.tgz#752a64a61640c0b78096752abcc8ca7f13152343" - integrity sha512-uwO7KOR2EMdnDRneWTEIOMbIXNDDTAPpy3hJOO8JGTbGtVbimQBvlQG2ZkbZxxTl0bALQTvi8BvePMEcWlu8sw== +"@storybook/channel-websocket@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.4.13.tgz#6a85b6c846097f3a601038dcd58e8f624a9a3600" + integrity sha512-edc/KRF2dpMyCI67ik8loo2cNh7TUP8HoO/YJBVPTEGmOQxMWgmYs+loTd1xoZAFBdkVKvLXBiu8umPpdh2MpA== dependencies: - "@storybook/channels" "6.4.12" - "@storybook/client-logger" "6.4.12" + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" core-js "^3.8.2" global "^4.4.0" telejson "^5.3.2" @@ -2791,18 +3917,27 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.4.12.tgz#61a7b33c2ccce2cd0da150127d2c67c944650639" - integrity sha512-WLHkXnIOJzzmaTHAeOR94LIUMbgpQnQGokFOuda/tJ5HwhDFXVFUKgoK45eAfOyYVTcDaXSEFjpCF++qB/txFA== +"@storybook/channels@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.4.13.tgz#d79005f712be7575be093d917c13f3a0033bb44d" + integrity sha512-QWvm2TiqPZVPQLBq7ETcABNi17HIhNaXhJJUyNFBBXFtAHcbzMRFEBi6gkCVXK7QdtFo3Z68TU5htDkwjYVerg== dependencies: - "@storybook/addons" "6.4.12" - "@storybook/channel-postmessage" "6.4.12" - "@storybook/channels" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/core-events" "6.4.12" + core-js "^3.8.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-api@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.4.13.tgz#7cc59353a1329a6e9fca7247ae255d5ebceb80a4" + integrity sha512-YoF0iKeOTv06HFTLSg1M8Fs9JZwFcNhGFHXv7/LtuTZ9n6ATgaZm7eTTdKrn1d8Qjxql7c7Lm/7mdZgus9ByBA== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/channel-postmessage" "6.4.13" + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/store" "6.4.12" + "@storybook/store" "6.4.13" "@types/qs" "^6.9.5" "@types/webpack-env" "^1.16.0" core-js "^3.8.2" @@ -2825,6 +3960,14 @@ core-js "^3.8.2" global "^4.4.0" +"@storybook/client-logger@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.4.13.tgz#2467ee13c7f85e9f6c0d9cd64c11ee7a109b060a" + integrity sha512-VPrrgJRURztXAKTeHOpzKMAHnNupkGApUDNlPIs0Qxyn5gaSiy806q4XPoROno3mVgEe+7Chf86hRiL8pJnlCA== + dependencies: + core-js "^3.8.2" + global "^4.4.0" + "@storybook/components@6.4.12": version "6.4.12" resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.4.12.tgz#3eac6466c02d80810156d9644db79195e810b206" @@ -2855,21 +3998,51 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/core-client@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.4.12.tgz#b27b67dcd222b2ef45e3f3995650a514c16d8b33" - integrity sha512-xKD3u/Taw2NafO6QQyl0q7jJ+C/8H8XQj6C5POVd5LUju/pT1K4Udg1wsAJpc1BtJU8Gtzj+8hxC0s9Zi+y0WQ== +"@storybook/components@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.4.13.tgz#2e7f109ecef63ae0c6f096939d69e26abbb39c6b" + integrity sha512-edeoYycQMsPaXPyPvYV4Aoiz4A/9kPsZt0Wf2zBGMGX6cpaGV3aoy8pFBl6XSq2hPxIn8JdcB/8MK3/tj35h4w== dependencies: - "@storybook/addons" "6.4.12" - "@storybook/channel-postmessage" "6.4.12" - "@storybook/channel-websocket" "6.4.12" - "@storybook/client-api" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/core-events" "6.4.12" + "@popperjs/core" "^2.6.0" + "@storybook/client-logger" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + "@storybook/theming" "6.4.13" + "@types/color-convert" "^2.0.0" + "@types/overlayscrollbars" "^1.12.0" + "@types/react-syntax-highlighter" "11.0.5" + color-convert "^2.0.1" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + markdown-to-jsx "^7.1.3" + memoizerific "^1.11.3" + overlayscrollbars "^1.13.1" + polished "^4.0.5" + prop-types "^15.7.2" + react-colorful "^5.1.2" + react-popper-tooltip "^3.1.1" + react-syntax-highlighter "^13.5.3" + react-textarea-autosize "^8.3.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/core-client@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.4.13.tgz#c25a6f5916f9642c64a9f2aeb9f5f7cee12b053a" + integrity sha512-1m7cAlF16mtVdSNmP8a4z00GCkw2dMyUyJX8snzgYGLD5FaqPLyNGJIidqllHsBUXBfEL2FSu+E9QygK12+O1w== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/channel-postmessage" "6.4.13" + "@storybook/channel-websocket" "6.4.13" + "@storybook/client-api" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/preview-web" "6.4.12" - "@storybook/store" "6.4.12" - "@storybook/ui" "6.4.12" + "@storybook/preview-web" "6.4.13" + "@storybook/store" "6.4.13" + "@storybook/ui" "6.4.13" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" core-js "^3.8.2" @@ -2881,10 +4054,10 @@ unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/core-common@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.4.12.tgz#cdc0e8e2b3bb9ea9cac104d6159eb8eae757f9c4" - integrity sha512-4xxFCZChMB23xeq3xARtccUyQQQwYgKkzasWKuUaC4E9Zj1h04IxBa92rYMey5HNlGUvAvQ2I/kRo5mg2GRmZw== +"@storybook/core-common@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.4.13.tgz#019ce8089d5f3a96c436f208962fbf711ccf8e5c" + integrity sha512-KoFa4yktuqWsW+/O6uc7iba25X9eKhp80l9tHsa1RWE94mQdCBUo5VsNoe35JvqFSDOspQ+brCe6vBUaIYe+cQ== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -2907,7 +4080,7 @@ "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.4.12" + "@storybook/node-logger" "6.4.13" "@storybook/semver" "^7.3.2" "@types/node" "^14.0.10" "@types/pretty-hrtime" "^1.0.0" @@ -2943,22 +4116,29 @@ dependencies: core-js "^3.8.2" -"@storybook/core-server@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.4.12.tgz#d5daa9312f0c62d11bc8ff02fec726cc91a33ef4" - integrity sha512-mn/gk6nuBvzb9opcPdDG37cnPoMuwIuyn1eaU4ew2oFjrveLHmgJwh6LZ1A/kfJXvcNE9Z/YI4N1Ctvfxqm7/A== +"@storybook/core-events@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.4.13.tgz#caf1adafd743f8d53a151bc402449f841896cb9c" + integrity sha512-zNlzNv7qVXjLf7yfvY9KfLvDY8nVskxrjmz0+21rIqUefS9+7SWBrtJJURpCaoPf/BmACqh/6c1RnuOY7TESnw== + dependencies: + core-js "^3.8.2" + +"@storybook/core-server@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.4.13.tgz#cbc11d442a8be6f06929c8d655e9b752204ebca9" + integrity sha512-i3zrtHHkV6/b+jJF65BQu+YuXen+T/MF1f5J+li5nvJnLKhssVQmvpGvWyJezT3OgFkC1+BFBokFY6NXHHw77g== dependencies: "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-webpack4" "6.4.12" - "@storybook/core-client" "6.4.12" - "@storybook/core-common" "6.4.12" - "@storybook/core-events" "6.4.12" + "@storybook/builder-webpack4" "6.4.13" + "@storybook/core-client" "6.4.13" + "@storybook/core-common" "6.4.13" + "@storybook/core-events" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/csf-tools" "6.4.12" - "@storybook/manager-webpack4" "6.4.12" - "@storybook/node-logger" "6.4.12" + "@storybook/csf-tools" "6.4.13" + "@storybook/manager-webpack4" "6.4.13" + "@storybook/node-logger" "6.4.13" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.12" + "@storybook/store" "6.4.13" "@types/node" "^14.0.10" "@types/node-fetch" "^2.5.7" "@types/pretty-hrtime" "^1.0.0" @@ -2991,18 +4171,18 @@ webpack "4" ws "^8.2.3" -"@storybook/core@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.4.12.tgz#2b7ddf79f8dd6837086ca9c2a91ff6f26fffef87" - integrity sha512-R9mtesIhQQw258QjfWYnTSGWKChwdyrWUku/9oDUswsJ18nDYRBQ588pEb2QSpVa5eD3+evVC6fYCDVnaE8PcA== +"@storybook/core@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.4.13.tgz#a317df48d72cb4e7ac9fda6f935be7b2d67f5877" + integrity sha512-OSbji5w4jrGNALbxJwktZhi8qw4bGgL88dL72O40173b8ROLBOGkEkkz/BpHbqx2PhS9sGVNVMK2b2BwAiiu7g== dependencies: - "@storybook/core-client" "6.4.12" - "@storybook/core-server" "6.4.12" + "@storybook/core-client" "6.4.13" + "@storybook/core-server" "6.4.13" -"@storybook/csf-tools@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.4.12.tgz#6b37a94e7b3dbfa50d0adea0103a2bc544e29e1e" - integrity sha512-8fAqNSxNvEpO03ynjGDHY8rQbpJzs0aejWMFzHp9bqvtCWgYMNX+gcjFeVvJXjpi91+XmNtE0cS4UZGCy8AbhQ== +"@storybook/csf-tools@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.4.13.tgz#393b19f3901784d7c820abbe7379977e7ec5f15c" + integrity sha512-eEYQdr/N4bsiQFxNEUkfQ/KyqdnUecwFS7V1k16/m/dP7cfinwW2Yo+9t77uWe3Qmzj9RbM6jrdWxXEUZ6MwvQ== dependencies: "@babel/core" "^7.12.10" "@babel/generator" "^7.12.11" @@ -3018,7 +4198,7 @@ global "^4.4.0" js-string-escape "^1.0.1" lodash "^4.17.21" - prettier "^2.2.1" + prettier "<=2.3.0" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" @@ -3029,20 +4209,20 @@ dependencies: lodash "^4.17.15" -"@storybook/manager-webpack4@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.4.12.tgz#eb0ef11d294d49a63df8bd090bf1ddcf695bd872" - integrity sha512-S1mCURQ+dV6a9qNrnzudrV5N4cQCgxNnw+MICGVSD275WfCiZQb3Wl3Vnet5Gmhb/4Y/ElUYGLY0d6bHqibTGA== +"@storybook/manager-webpack4@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.4.13.tgz#69d6d60818192dc18d6b2dee9548482e8abf6a54" + integrity sha512-aUUIvSf1nUSuPEdLFcbXbEbm+WlBrpX+Ce+Ee5zuMpggfiMeq4H4UB5QuluB8oLUcJA/ZoQZ9m4pPfUZDH0O0w== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-transform-template-literals" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.4.12" - "@storybook/core-client" "6.4.12" - "@storybook/core-common" "6.4.12" - "@storybook/node-logger" "6.4.12" - "@storybook/theming" "6.4.12" - "@storybook/ui" "6.4.12" + "@storybook/addons" "6.4.13" + "@storybook/core-client" "6.4.13" + "@storybook/core-common" "6.4.13" + "@storybook/node-logger" "6.4.13" + "@storybook/theming" "6.4.13" + "@storybook/ui" "6.4.13" "@types/node" "^14.0.10" "@types/webpack" "^4.41.26" babel-loader "^8.0.0" @@ -3071,10 +4251,10 @@ webpack-dev-middleware "^3.7.3" webpack-virtual-modules "^0.2.2" -"@storybook/node-logger@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.4.12.tgz#fd91be1de469361a713f018c0ddb58af14ff0abc" - integrity sha512-oVWmafSzTEmqsb9lbhoDtKXslDC9pZcSvpKc1aK+8C0apUdirit1eH0sb5oT8roc9EPu9uFWO2HEgyMOdkHwnQ== +"@storybook/node-logger@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.4.13.tgz#67f294e56b5014c81dde542940f9a17f7d74604a" + integrity sha512-L0WJjJ3MTkdSpCaC1xSJ1/SJzblQ8E3tYKSI3M3890711gfxtSM/9CfuatQ6ibTXcm5d8bW6TUJayTD4I8vUPg== dependencies: "@types/npmlog" "^4.1.2" chalk "^4.1.0" @@ -3082,17 +4262,24 @@ npmlog "^5.0.1" pretty-hrtime "^1.0.3" -"@storybook/preview-web@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.4.12.tgz#3a16d6b2e2514babd23f8666b0127d4009c18ba7" - integrity sha512-7m9d6Tk7mPsvJUiIE9p1/rmJhh97ba1vdPxR4Z1l9Z9b/UQgE4W5n4MtgtqIGGt7RXdmhTAjgEI/J8BBFDpCuA== +"@storybook/postinstall@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.4.13.tgz#508f73e0a2f07ba994554d43daad0f6b49945ffa" + integrity sha512-7SzFt0BDFOI0vFKc0Ba5slkQaur3AEN9211U7pBbzgp6HxBjiTT5fqLET+dvk30ke8YtOauj0LZ+uHx9TNYrBA== dependencies: - "@storybook/addons" "6.4.12" - "@storybook/channel-postmessage" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/core-events" "6.4.12" + core-js "^3.8.2" + +"@storybook/preview-web@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.4.13.tgz#14b9e106f3cc00dd411a43be9cd280e5e8a0ecfc" + integrity sha512-z21N09iWrzi2sX5+06aNvxPVp0rzntO7seM7zIPxqpFiEsAoPodkVJka3YyJpgK3S2JtgipmIgvLJeLXENLr3g== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/channel-postmessage" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/store" "6.4.12" + "@storybook/store" "6.4.13" ansi-to-html "^0.6.11" core-js "^3.8.2" global "^4.4.0" @@ -3117,22 +4304,22 @@ react-docgen-typescript "^2.0.0" tslib "^2.0.0" -"@storybook/react@^6.3.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.4.12.tgz#6451dd8f553f09b1f71d901663030da0a47ffb8a" - integrity sha512-+o/Gb6QvQlMs6pPSElW86ebIB1maditHEXADNvm3VwKfz7SrLKB7rbZuE2WmhxzlW6NI11xGVImUv19QG3SH7g== +"@storybook/react@^6.3.12", "@storybook/react@^6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.4.13.tgz#f51f2c56dd57554dbb53fdbfd0b5a20a3ad914b8" + integrity sha512-bmHGeAAad0qoEfselx3qvWlPf1fWccDgki3TneFWYTSoybZOuu0PWJp+M7kqWMxcyvdwQImjA9F+vCc7CUuF9w== dependencies: "@babel/preset-flow" "^7.12.1" "@babel/preset-react" "^7.12.10" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.1" - "@storybook/addons" "6.4.12" - "@storybook/core" "6.4.12" - "@storybook/core-common" "6.4.12" + "@storybook/addons" "6.4.13" + "@storybook/core" "6.4.13" + "@storybook/core-common" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/node-logger" "6.4.12" + "@storybook/node-logger" "6.4.13" "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.253f8c1.0" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.12" + "@storybook/store" "6.4.13" "@types/webpack-env" "^1.16.0" babel-plugin-add-react-displayname "^0.0.5" babel-plugin-named-asset-import "^0.3.1" @@ -3141,8 +4328,7 @@ global "^4.4.0" lodash "^4.17.21" prop-types "^15.7.2" - react-dev-utils "^11.0.4" - react-refresh "^0.10.0" + react-refresh "^0.11.0" read-pkg-up "^7.0.1" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" @@ -3165,6 +4351,23 @@ react-router-dom "^6.0.0" ts-dedent "^2.0.0" +"@storybook/router@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.4.13.tgz#f83dc12b21906f9a671d4e963cac747972d848c7" + integrity sha512-6KbIpSL8QhGglzGb+tWTvAF/2EVpmgwlU5VP6Xs3GANcOc3VeXWl1fcJD6CNPp2DHwjkblW+21dcoHqfljnTmg== + dependencies: + "@storybook/client-logger" "6.4.13" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + history "5.0.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + qs "^6.10.0" + react-router "^6.0.0" + react-router-dom "^6.0.0" + ts-dedent "^2.0.0" + "@storybook/semver@^7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" @@ -3189,14 +4392,30 @@ prettier "^2.2.1" regenerator-runtime "^0.13.7" -"@storybook/store@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.4.12.tgz#ab4b694f63c6ea50fd0b22e3994fed8ba6c7b7aa" - integrity sha512-Sgjo8i6pqeaEWaD5jMVo6Z2fhpDX9lmhnq6UFKpzXlni7qBNjgQPyETH95nTDoApOd5VLsgdvkGMWiKBLdFbUQ== +"@storybook/source-loader@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.4.13.tgz#ba7b379148885eb53c838e520c7b4882c82e891b" + integrity sha512-3M2VRt/ABGpm2G9MxkWAufvacPFDdHl+gvkNOq4lRhFw8uAh78xoXb1n0heOOuYGtJbw1+UHNOh4ahZGCWYxJg== dependencies: - "@storybook/addons" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/core-events" "6.4.12" + "@storybook/addons" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/csf" "0.0.2--canary.87bc651.0" + core-js "^3.8.2" + estraverse "^5.2.0" + global "^4.4.0" + loader-utils "^2.0.0" + lodash "^4.17.21" + prettier "<=2.3.0" + regenerator-runtime "^0.13.7" + +"@storybook/store@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.4.13.tgz#afeccc2dfe0126208d869da199f702635858c1e5" + integrity sha512-VUDYwn1PHTa92kaJFCWqP+QS5wsHO9us2prhHnD7k9qvvQrbxD2DewtGxdT7cRHbZI8jY5CiqMVKilZRaXSM3Q== + dependencies: + "@storybook/addons" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/core-events" "6.4.13" "@storybook/csf" "0.0.2--canary.87bc651.0" core-js "^3.8.2" fast-deep-equal "^3.1.3" @@ -3210,7 +4429,7 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/theming@6.4.12", "@storybook/theming@^6.3.12": +"@storybook/theming@6.4.12": version "6.4.12" resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.12.tgz#a6f15284ffe9c03d91335203903c38883855c8f3" integrity sha512-f40OgKpI0ymnCiXaY2KeDqYUrHBVxxYYww1WfyQXMv8tv5Mx64nqD8IL/Vyf6t/Wdl5jLdgbgLITwqIij9WJPg== @@ -3228,21 +4447,39 @@ resolve-from "^5.0.0" ts-dedent "^2.0.0" -"@storybook/ui@6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.4.12.tgz#7b460e4128b750d79a39f097356cef5a5f370318" - integrity sha512-POkMFc0pTH6u/EiRpZpLCD1iRUektWhuWnF2cQEgP00ZY8rveOS6lfLZSnmrFKfkmVW9OARH4fcnlzNpwu1y6A== +"@storybook/theming@6.4.13", "@storybook/theming@^6.3.12": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.13.tgz#1a8aadeddb6c3a115f739aa1a4bbd7e65d4a3830" + integrity sha512-oWRoNnvO4QnRnplZ74DVdU4k91eqw8y0Xqn6lzZBeC8hq6mYWldgfj1LZ24gJhVtEIa7ZKoyujGUygHaH8WXHw== dependencies: "@emotion/core" "^10.1.1" - "@storybook/addons" "6.4.12" - "@storybook/api" "6.4.12" - "@storybook/channels" "6.4.12" - "@storybook/client-logger" "6.4.12" - "@storybook/components" "6.4.12" - "@storybook/core-events" "6.4.12" - "@storybook/router" "6.4.12" + "@emotion/is-prop-valid" "^0.8.6" + "@emotion/styled" "^10.0.27" + "@storybook/client-logger" "6.4.13" + core-js "^3.8.2" + deep-object-diff "^1.1.0" + emotion-theming "^10.0.27" + global "^4.4.0" + memoizerific "^1.11.3" + polished "^4.0.5" + resolve-from "^5.0.0" + ts-dedent "^2.0.0" + +"@storybook/ui@6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.4.13.tgz#79e04f988ca537a4c350fe470ad7c14392794b8b" + integrity sha512-EvpWk2iHjfiWkuMuzYz5fXl4r7S9Q80EtFFVkaBEZfIoKjvIkxppGQ3kz892ZdXzuazzvni2qcb7OJA9S7AgLw== + dependencies: + "@emotion/core" "^10.1.1" + "@storybook/addons" "6.4.13" + "@storybook/api" "6.4.13" + "@storybook/channels" "6.4.13" + "@storybook/client-logger" "6.4.13" + "@storybook/components" "6.4.13" + "@storybook/core-events" "6.4.13" + "@storybook/router" "6.4.13" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.12" + "@storybook/theming" "6.4.13" copy-to-clipboard "^3.3.1" core-js "^3.8.2" core-js-pure "^3.8.2" @@ -3286,6 +4523,16 @@ "@babel/runtime" "^7.10.5" "@emotion/is-prop-valid" "^0.8.7" +"@swc/helpers@^0.2.11": + version "0.2.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.2.14.tgz#20288c3627442339dd3d743c944f7043ee3590f0" + integrity sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA== + +"@swc/helpers@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.3.2.tgz#02b370431fb8827450577ff852d56fc5fb4e0b40" + integrity sha512-qEru2uaH1vKZNCZR4rFCUZaflsBP7IWiGcIoQe22qi5tm+HEG/yPdhSba+ZCNTWk2xyYpx/nEFkncDY3orEx3w== + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -3376,6 +4623,11 @@ resolved "https://registry.yarnpkg.com/@types/configstore/-/configstore-2.1.1.tgz#cd1e8553633ad3185c3f2f239ecff5d2643e92b6" integrity sha1-zR6FU2M60xhcPy8jns/10mQ+krY= +"@types/cookie@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" + integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== + "@types/cookie@^0.4.0": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -3451,6 +4703,13 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + "@types/hast@^2.0.0": version "2.3.4" resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" @@ -3458,6 +4717,14 @@ dependencies: "@types/unist" "*" +"@types/hoist-non-react-statics@^3.0.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^5.0.0": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" @@ -3468,23 +4735,42 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/http-proxy@^1.17.7": +"@types/http-proxy@^1.17.5", "@types/http-proxy@^1.17.7": version "1.17.8" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== dependencies: "@types/node" "*" +"@types/invariant@^2.2.33": + version "2.2.35" + resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== + "@types/is-function@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.1.tgz#2d024eace950c836d9e3335a66b97960ae41d022" integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== -"@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -3586,12 +4872,17 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== +"@types/prettier@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf" + integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w== + "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== -"@types/prop-types@*": +"@types/prop-types@*", "@types/prop-types@^15.7.3", "@types/prop-types@^15.7.4": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== @@ -3620,6 +4911,13 @@ dependencies: "@types/react" "*" +"@types/react-is@^16.7.1 || ^17.0.0": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" + integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + dependencies: + "@types/react" "*" + "@types/react-reconciler@^0.26.4": version "0.26.4" resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.4.tgz#651404be172cf29b65cddf246d8d964b4e448399" @@ -3634,7 +4932,21 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.33": +"@types/react-tabs@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/react-tabs/-/react-tabs-2.3.4.tgz#b63662ee52e59a86ec33b78b9721d8163a46394c" + integrity sha512-HQzhKW+RF/7h14APw/2cu4Nnt+GmsTvfBKbFdn/NbYpb8Q+iB65wIkPHz4VRKDxWtOpNFpOUtzt5r0LRmQMfOA== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.1", "@types/react-transition-group@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^17.0.33": version "17.0.38" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== @@ -3725,6 +5037,11 @@ "@types/unist" "*" "@types/vfile-message" "*" +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= + "@types/webpack-env@^1.16.0": version "1.16.3" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" @@ -3758,6 +5075,18 @@ dependencies: "@types/node" "*" +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yoga-layout@1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" @@ -4122,6 +5451,11 @@ JSONStream@^1.3.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1, abbrev@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -4134,6 +5468,11 @@ abort-controller@3.0.0: dependencies: event-target-shim "^5.0.0" +abortcontroller-polyfill@^1.1.9: + version "1.7.3" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" + integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -4152,6 +5491,14 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== +acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" @@ -4162,12 +5509,22 @@ acorn-jsx@^5.0.1, acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^6.1.1, acorn@^6.4.1: +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn-walk@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.1.1, acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.4.0: +acorn@^7.4.0, acorn@^7.4.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -4398,6 +5755,11 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -4447,7 +5809,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0, anymatch@~3.1.1, anymatch@~3.1.2: +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -4573,6 +5935,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -4685,6 +6052,16 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -4707,6 +6084,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +astring@^1.6.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.1.tgz#a91c4afd4af3523e11f31242a3d5d9af62bb6cc6" + integrity sha512-Aj3mbwVzj7Vve4I/v2JYOPFkCGM2YS7OqQTNSxmUR+LECRpokuPgAYghePgr6SALDo5bD5DlfbSaYjOzGJZOLQ== + async-cache@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/async-cache/-/async-cache-1.1.0.tgz#4a9a5a89d065ec5d8e5254bd9ee96ba76c532b5a" @@ -4719,11 +6101,21 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async-retry-ng@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/async-retry-ng/-/async-retry-ng-2.0.1.tgz#f5285ec1c52654a2ba6a505d0c18b1eadfaebd41" integrity sha512-iitlc2murdQ3/A5Re3CcplQBEf7vOmFrFQ6RFn3+/+zZUyIHYkZnnEziMSa6YIb2Bs2EJEPZWReTxjHqvQbDbw== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -4896,6 +6288,17 @@ babel-plugin-extract-import-names@1.6.22: dependencies: "@babel/helper-plugin-utils" "7.10.4" +babel-plugin-istanbul@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + babel-plugin-lodash@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" @@ -5084,6 +6487,13 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs= +base-x@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-arraybuffer@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" @@ -5178,7 +6588,7 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^4.0.0, bl@^4.0.3: +bl@^4.0.0, bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -5228,6 +6638,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +bootstrap@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" + integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q== + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -5305,6 +6720,11 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -5381,7 +6801,7 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.3, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.19.1: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.3, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.6: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== @@ -5392,7 +6812,7 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4 node-releases "^2.0.1" picocolors "^1.0.0" -bser@^2.0.0: +bser@2.1.1, bser@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== @@ -5754,6 +7174,13 @@ cannon@^0.6.2: resolved "https://registry.yarnpkg.com/cannon/-/cannon-0.6.2.tgz#1e7bc72dd5841982f3c104c2bc578bfa4fb1c572" integrity sha1-HnvHLdWEGYLzwQTCvFeL+k+xxXI= +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" @@ -5783,6 +7210,17 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -6005,7 +7443,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: +classnames@2.x, classnames@^2.2.1, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== @@ -6059,6 +7497,11 @@ cli-spinners@^1.0.1: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + cli-table3@^0.5.0, cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -6170,7 +7613,12 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.1.1: +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +clsx@^1.1.0, clsx@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== @@ -6225,7 +7673,7 @@ codesandbox-import-utils@^2.2.3: istextorbinary "^2.2.1" lz-string "^1.4.4" -codesandbox@^2.1.11: +codesandbox@^2.1.11, codesandbox@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/codesandbox/-/codesandbox-2.2.3.tgz#092de403506d9e4c5358cd61dc84068c3ee8ceea" integrity sha512-IAkWFk6UUglOhSemI7UFgNNL/jgg+1YjVEIllFULLgsaHhFnY51pCqAifMNuAd5d9Zp4Nk/xMgrEaGNV0L4Xlg== @@ -6355,7 +7803,7 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -command-exists@^1.2.4: +command-exists@^1.2.4, command-exists@^1.2.6: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== @@ -6375,12 +7823,12 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.2.0: +commander@^7.0.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^8.3.0: +commander@^8.0.0, commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -6506,6 +7954,16 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + connectivity@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/connectivity/-/connectivity-1.0.2.tgz#1816a4217b126a8fb331c5247f7e9c5c0a25ae96" @@ -6513,7 +7971,7 @@ connectivity@^1.0.0: dependencies: once "^1.3.0" -console-browserify@^1.1.0: +console-browserify@^1.1.0, console-browserify@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== @@ -6536,6 +7994,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -6553,7 +8016,7 @@ convert-hrtime@^3.0.0: resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz#62c7593f5809ca10be8da858a6d2f702bcda00aa" integrity sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA== -convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -6565,7 +8028,7 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.1, cookie@^0.4.1, cookie@~0.4.1: +cookie@0.4.1, cookie@^0.4.0, cookie@^0.4.1, cookie@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== @@ -6620,10 +8083,10 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.0.4, core-js@^3.14.0, core-js@^3.17.2, core-js@^3.6.5, core-js@^3.8.2: - version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" - integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== +core-js@^3.0.4, core-js@^3.14.0, core-js@^3.17.2, core-js@^3.2.1, core-js@^3.6.5, core-js@^3.8.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== core-util-is@1.0.2: version "1.0.2" @@ -6672,7 +8135,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7.0.0: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -6797,7 +8260,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -6808,7 +8271,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypto-browserify@^3.11.0: +crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== @@ -6895,6 +8358,18 @@ css-minimizer-webpack-plugin@^2.0.0: serialize-javascript "^5.0.1" source-map "^0.6.1" +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -6936,6 +8411,14 @@ css-selector-parser@^1.0.0: resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + css-to-react-native@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" @@ -7031,7 +8514,7 @@ cssnano-utils@^3.0.0: resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.0.0.tgz#c0b9fcd6e4f05c5155b07e9ab11bf94b97163057" integrity sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA== -cssnano@^5.0.0: +cssnano@^5.0.0, cssnano@^5.0.5, cssnano@^5.0.8: version "5.0.15" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.15.tgz#8779eaf60e3665e6a12687c814d375cc9f78db76" integrity sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ== @@ -7047,12 +8530,24 @@ csso@^4.0.2, csso@^4.2.0: dependencies: css-tree "^1.1.2" +cssom@0.3.x, cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + csstype@^2.5.7: version "2.6.19" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== -csstype@^3.0.2: +csstype@^3.0.10, csstype@^3.0.2: version "3.0.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== @@ -7089,6 +8584,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + dataloader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" @@ -7207,7 +8711,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -7309,6 +8813,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +dequal@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -7446,6 +8955,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-align@^1.7.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" + integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -7453,6 +8967,14 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dom-iterator/-/dom-iterator-1.0.0.tgz#9c09899846ec41c2d257adc4d6015e4759ef05ad" @@ -7496,6 +9018,11 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domain-browser@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-3.5.0.tgz#3a11f5df52fd9d60d7f1c79a62fde2d158c42b09" + integrity sha512-zrzUu6auyZWRexjCEPJnfWc30Hupxh2lJZOJAF3qa2bCuD4O/55t0FvQt3ZMhEw++gjNkwdkOVZh8yA32w/Vfw== + domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -7506,6 +9033,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domhandler@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" @@ -7520,7 +9054,7 @@ domhandler@^3.0.0: dependencies: domelementtype "^2.0.1" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== @@ -7591,6 +9125,11 @@ dotenv@^5.0.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== +dotenv@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c" + integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g== + dotenv@^8.0.0, dotenv@^8.5.1, dotenv@^8.6.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" @@ -7678,6 +9217,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.17: version "1.4.44" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz#8a41923afdd6ef5ddabe001626036ba5d1d64ae6" @@ -7742,6 +9288,15 @@ emotion@^11.0.0: resolved "https://registry.yarnpkg.com/emotion/-/emotion-11.0.0.tgz#e33353668e72f0adea1f6fba790dc6c5b05b45d9" integrity sha512-QW3CRqic3aRw1OBOcnvxaHEpCmxtlGwZ5tM9dV5rY3Rn+F41E8EgTPOqJ5VfsqQ5ZXHDs2zSDyUwGI0ZfC2+5A== +emphasize@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/emphasize/-/emphasize-4.2.0.tgz#6b6fdc4d212cb7eafea1c7cdd595dfd6cfc508d9" + integrity sha512-yGKvcFUHlBsUPwlxTlzKLR8+zhpbitkFOMCUxN8fTJng9bdH3WNzUGkhdaGdjndSUgqmMPBN7umfwnUdLz5Axg== + dependencies: + chalk "^4.0.0" + highlight.js "~10.4.0" + lowlight "~1.17.0" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -7840,6 +9395,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -7981,6 +9541,11 @@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + es6-promise@^4.0.3, es6-promise@^4.1.0: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -8046,6 +9611,30 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.11.0: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" @@ -8273,7 +9862,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -8292,7 +9881,7 @@ esrecurse@^4.1.0, esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -8389,7 +9978,7 @@ events@^1.1.0: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -events@^3.0.0, events@^3.2.0: +events@^3.0.0, events@^3.1.0, events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -8402,6 +9991,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -8603,6 +10197,17 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -8636,16 +10241,28 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fastest-levenshtein@^1.0.12: +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + fastq@^1.13.0, fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -8667,6 +10284,13 @@ fb-watchman@2.0.0: dependencies: bser "^2.0.0" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + fd@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/fd/-/fd-0.0.3.tgz#b3240de86dbf5a345baae7382a07d4713566ff0c" @@ -8739,6 +10363,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" @@ -8763,6 +10394,11 @@ filesize@^3.6.1: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -8785,7 +10421,7 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= -finalhandler@~1.1.2: +finalhandler@1.1.2, finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -9194,16 +10830,16 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" +fsevents@^2.1.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -9818,6 +11454,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" + genfun@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" @@ -9884,6 +11527,11 @@ get-port@^3.2.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= +get-port@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" + integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -10020,7 +11668,7 @@ github-release-notes@0.17.2: require-yaml "0.0.1" valid-url "^1.0.9" -github-slugger@^1.2.1: +github-slugger@^1.0.0, github-slugger@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== @@ -10048,7 +11696,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -10084,7 +11732,7 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -10157,7 +11805,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: +globals@^13.2.0, globals@^13.6.0, globals@^13.9.0: version "13.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== @@ -10445,6 +12093,13 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -10455,6 +12110,11 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -10681,11 +12341,16 @@ header-case@^1.0.0: no-case "^2.2.0" upper-case "^1.1.3" -highlight.js@^10.1.1, highlight.js@~10.7.0: +highlight.js@^10.1.1, highlight.js@^10.4.1, highlight.js@~10.7.0: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +highlight.js@~10.4.0: + version "10.4.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" + integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== + history@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" @@ -10709,7 +12374,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -10742,6 +12407,13 @@ hosted-git-info@^3.0.8: dependencies: lru-cache "^6.0.0" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" @@ -10770,6 +12442,16 @@ html-minifier-terser@^5.0.1: relateurl "^0.2.7" terser "^4.6.3" +html-tags@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98" + integrity sha1-x43mW1Zjqll5id0rerSSANfk25g= + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + html-void-elements@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" @@ -10790,6 +12472,23 @@ html-webpack-plugin@^4.0.0: tapable "^1.1.3" util.promisify "1.0.0" +htmlnano@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-1.1.1.tgz#aea50e1d7ac156370ea766d4cd75f2d3d1a953cc" + integrity sha512-diMNyqTPx4uGwlxrTs0beZCy8L/GxGIFGHWv20OYhthLcdYkDOP/d4Ja5MbGgVJZMakZUM21KpMk5qWZrBGSdw== + dependencies: + cosmiconfig "^7.0.1" + cssnano "^5.0.8" + postcss "^8.3.6" + posthtml "^0.16.5" + purgecss "^4.0.0" + relateurl "^0.2.7" + srcset "^4.0.0" + svgo "^2.6.1" + terser "^5.8.0" + timsort "^0.3.0" + uncss "^0.17.3" + htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -10822,6 +12521,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + http-cache-semantics@^3.8.0, http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -10862,6 +12571,17 @@ http-proxy-agent@^2.0.0, http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -10937,6 +12657,11 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -11033,6 +12758,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -11051,7 +12781,7 @@ inflight@^1.0.4, inflight@~1.0.6: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -11206,7 +12936,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^3.0.0, is-absolute-url@^3.0.3: +is-absolute-url@^3.0.0, is-absolute-url@^3.0.1, is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== @@ -11382,6 +13112,14 @@ is-docker@^2.0.0, is-docker@^2.2.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-dom@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" + integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -11436,6 +13174,13 @@ is-function@^1.0.1, is-function@^1.0.2: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -11469,6 +13214,13 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-html@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" + integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ= + dependencies: + html-tags "^1.0.0" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -11485,6 +13237,11 @@ is-installed-globally@^0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-invalid-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" @@ -11492,6 +13249,11 @@ is-invalid-path@^0.1.0: dependencies: is-glob "^2.0.0" +is-json@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" + integrity sha1-a+Fm0USCihMdaGiRuYPfYsOUkf8= + is-lower-case@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" @@ -11504,6 +13266,14 @@ is-map@^2.0.1, is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negative-zero@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -11548,6 +13318,11 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" @@ -11575,6 +13350,16 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -11675,7 +13460,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.7: +is-typed-array@^1.1.3, is-typed-array@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== @@ -11698,6 +13483,11 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-upper-case@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" @@ -11705,6 +13495,11 @@ is-upper-case@^1.1.0: dependencies: upper-case "^1.1.0" +is-url@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -11742,6 +13537,11 @@ is-whitespace-character@^1.0.0: resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" + integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= + is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" @@ -11834,7 +13634,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.0.1: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.0.1, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== @@ -11856,6 +13656,17 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + istanbul-lib-processinfo@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" @@ -11922,7 +13733,63 @@ iterate-value@^1.0.0, iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" -jest-worker@^26.2.1, jest-worker@^26.3.0, jest-worker@^26.5.0: +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-worker@^26.2.1, jest-worker@^26.3.0, jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -12032,6 +13899,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -12082,6 +13981,11 @@ json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/json-source-map/-/json-source-map-0.6.1.tgz#e0b1f6f4ce13a9ad57e2ae165a24d06e62c79a0f" + integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -12111,7 +14015,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.1.3: +json5@^2.1.0, json5@^2.1.2, json5@^2.1.3: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -12313,6 +14217,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + libcipm@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" @@ -12501,6 +14413,17 @@ lmdb-store@^1.6.11: ordered-binary "^1.0.0" weak-lru-cache "^1.0.0" +lmdb@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.1.5.tgz#7863d268c579b4c6bf6042a97784fe1dea6753d8" + integrity sha512-J84gtJYC6DnZvczrtBF20xIyT9dZzY24/p1wi5zHldyoW+nKuckFy+AywoiMnTBRODp/lJkNhmjqw0dQUl0pFg== + dependencies: + msgpackr "^1.5.2" + nan "^2.14.2" + node-gyp-build "^4.2.3" + ordered-binary "^1.2.3" + weak-lru-cache "^1.2.1" + load-bmfont@^1.3.1, load-bmfont@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" @@ -12560,7 +14483,7 @@ loader-utils@2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -12672,6 +14595,11 @@ lodash.chunk@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + lodash.clonedeep@4.5.0, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -12762,6 +14690,11 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" @@ -12826,6 +14759,14 @@ log-symbols@^2.1.0: dependencies: chalk "^2.0.1" +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -12877,7 +14818,7 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lowlight@^1.14.0: +lowlight@^1.14.0, lowlight@^1.17.0: version "1.20.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== @@ -12885,6 +14826,14 @@ lowlight@^1.14.0: fault "^1.0.0" highlight.js "~10.7.0" +lowlight@~1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.17.0.tgz#a1143b2fba8239df8cd5893f9fe97aaf8465af4a" + integrity sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ== + dependencies: + fault "^1.0.0" + highlight.js "~10.4.0" + lru-cache@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.0.tgz#b5cbf01556c16966febe54ceec0fb4dc90df6c28" @@ -12995,6 +14944,13 @@ make-fetch-happen@^5.0.0: socks-proxy-agent "^4.0.0" ssri "^6.0.0" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + map-age-cleaner@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -13211,7 +15167,7 @@ mdast-util-to-nlcst@^4.0.0: unist-util-position "^3.0.0" vfile-location "^3.1.0" -mdast-util-to-string@^1.0.5, mdast-util-to-string@^1.0.7, mdast-util-to-string@^1.1.0: +mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.5, mdast-util-to-string@^1.0.7, mdast-util-to-string@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== @@ -13458,6 +15414,18 @@ mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" @@ -13548,7 +15516,7 @@ minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -13758,7 +15726,7 @@ msgpackr-extract@^1.0.14: nan "^2.14.2" node-gyp-build "^4.2.3" -msgpackr@^1.5.0: +msgpackr@^1.5.0, msgpackr@^1.5.1, msgpackr@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.5.2.tgz#b400c9885642bdec27b284f8bdadbd6570b448b7" integrity sha512-OCguCkbG34x1ddO4vAzEm/4J1GTo512k9SoxV8K+EGfI/onFdpemRf0HpsVRFpxadXr4JBFgHsQUitgTlw7ZYQ== @@ -13799,7 +15767,7 @@ nanoid@^2.1.0: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== -nanoid@^3.1.30: +nanoid@^3.1.23, nanoid@^3.1.30: version "3.1.32" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.32.tgz#8f96069e6239cc0a9ae8c0d3b41a3b4933a88c0a" integrity sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw== @@ -13838,6 +15806,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + needle@^2.5.2: version "2.9.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" @@ -13915,6 +15888,11 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-addon-api@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" @@ -13961,7 +15939,12 @@ node-fetch@^2.6.1, node-fetch@^2.6.6: dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.3: +node-forge@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" + integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== + +node-gyp-build@^4.2.3, node-gyp-build@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== @@ -14406,6 +16389,11 @@ null-loader@^4.0.1: loader-utils "^2.0.0" schema-utils "^3.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -14416,6 +16404,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + nyc@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" @@ -14478,7 +16471,7 @@ object-inspect@^1.11.0, object-inspect@^1.11.1, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-is@^1.1.4: +object-is@^1.0.1, object-is@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -14642,6 +16635,18 @@ opentracing@^0.14.5: resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -14664,7 +16669,22 @@ ora@^1.3.0: cli-spinners "^1.0.1" log-symbols "^2.1.0" -ordered-binary@^1.0.0: +ora@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ordered-binary@^1.0.0, ordered-binary@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.2.3.tgz#518f637692a74d372e56230effae37b811575e36" integrity sha512-fEwMk8TNUtzQDjXKYS2ANW3fNZ/gMReCPOAsLHaqw+UDnq/8ddXAcX4lGRpTK7kAghAjkmJs1EXXbcrDbg+ruw== @@ -14759,7 +16779,7 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@3.1.0, p-limit@^3.0.2: +p-limit@3.1.0, p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -14974,6 +16994,26 @@ param-case@^3.0.3: dot-case "^3.0.4" tslib "^2.0.3" +parcel@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.2.0.tgz#43bf0c7f050417a397d7c30b4e890cfb105b4246" + integrity sha512-oyjPko23uBZZa5ihJP65CeSbO4Nmb7mj8sPU8XQbYeBOtFoSHJf9KfQ6WCy0d7gXXkXSEXdBGH18uydWoLm9AQ== + dependencies: + "@parcel/config-default" "^2.2.0" + "@parcel/core" "^2.2.0" + "@parcel/diagnostic" "^2.2.0" + "@parcel/events" "^2.2.0" + "@parcel/fs" "^2.2.0" + "@parcel/logger" "^2.2.0" + "@parcel/package-manager" "^2.2.0" + "@parcel/reporter-cli" "^2.2.0" + "@parcel/reporter-dev-server" "^2.2.0" + "@parcel/utils" "^2.2.0" + chalk "^4.1.0" + commander "^7.0.0" + get-port "^4.2.0" + v8-compile-cache "^2.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -15139,6 +17179,11 @@ parse5-htmlparser2-tree-adapter@^6.0.1: dependencies: parse5 "^6.0.1" +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -15193,7 +17238,7 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-browserify@^1.0.1: +path-browserify@^1.0.0, path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== @@ -15232,7 +17277,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: +path-is-inside@1.0.2, path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -15257,6 +17302,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -15372,7 +17422,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.4" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== @@ -15463,6 +17513,11 @@ platform@^1.3.6: resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + pngjs@^3.0.0, pngjs@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" @@ -15616,6 +17671,13 @@ postcss-minify-selectors@^5.1.1: alphanum-sort "^1.0.2" postcss-selector-parser "^6.0.5" +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -15628,6 +17690,14 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-local-by-default@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" @@ -15647,6 +17717,14 @@ postcss-modules-local-by-default@^4.0.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" @@ -15662,6 +17740,14 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -15677,6 +17763,21 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-modules@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-3.2.2.tgz#ee390de0f9f18e761e1778dfb9be26685c02c51f" + integrity sha512-JQ8IAqHELxC0N6tyCg2UF40pACY5oiL6UpiqqcIFRWqgDYO8B0jnxzoQ0EOpPrWXvcpu6BSbQU/3vSiq7w8Nhw== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + string-hash "^1.1.1" + postcss-normalize-charset@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" @@ -15763,7 +17864,16 @@ postcss-reduce-transforms@^5.0.2: dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: +postcss-selector-parser@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6: version "6.0.8" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== @@ -15792,7 +17902,25 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -15800,7 +17928,7 @@ postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15, postcss@^8.2.9, postcss@^8.3.11: +postcss@^8.2.15, postcss@^8.2.9, postcss@^8.3.0, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.3.6: version "8.4.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== @@ -15809,6 +17937,28 @@ postcss@^8.2.15, postcss@^8.2.9, postcss@^8.3.11: picocolors "^1.0.0" source-map-js "^1.0.1" +posthtml-parser@^0.10.0, posthtml-parser@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.10.1.tgz#63c41931a9339cc2c32aba14f06286d98f107abf" + integrity sha512-i7w2QEHqiGtsvNNPty0Mt/+ERch7wkgnFh3+JnBI2VgDbGlBqKW9eDVd3ENUhE1ujGFe3e3E/odf7eKhvLUyDg== + dependencies: + htmlparser2 "^7.1.1" + +posthtml-render@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205" + integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA== + dependencies: + is-json "^2.0.1" + +posthtml@^0.16.4, posthtml@^0.16.5: + version "0.16.5" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.5.tgz#d32f5cf32436516d49e0884b2367d0a1424136f6" + integrity sha512-1qOuPsywVlvymhTFIBniDXwUDwvlDri5KUQuBqjmCc8Jj4b/HDSVWU//P6rTWke5rzrk+vj7mms2w8e1vD0nnw== + dependencies: + posthtml-parser "^0.10.0" + posthtml-render "^3.0.0" + potrace@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/potrace/-/potrace-2.1.8.tgz#50f6fba92e1e39ddef6f979b0a0f841809e0acf2" @@ -15840,6 +17990,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -15862,6 +18017,11 @@ prettier-plugin-organize-imports@^2.3.4: resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.4.tgz#65473861ae5ab7960439fff270a2258558fbe9ba" integrity sha512-R8o23sf5iVL/U71h9SFUdhdOEPsi3nm42FD/oDYIZ2PQa4TNWWuWecxln6jlIQzpZTDMUeO1NicJP6lLn2TtRw== +prettier@<=2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + prettier@^2.2.1, prettier@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" @@ -15890,7 +18050,7 @@ prism-react-renderer@^1.2.0, prism-react-renderer@^1.2.1: resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== -prismjs@^1.21.0, prismjs@^1.23.0: +prismjs@^1.21.0, prismjs@^1.23.0, prismjs@^1.25.0: version "1.26.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.26.0.tgz#16881b594828bb6b45296083a8cbab46b0accd47" integrity sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ== @@ -16004,7 +18164,15 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -16133,7 +18301,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -16150,6 +18318,16 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +purgecss@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7" + integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw== + dependencies: + commander "^8.0.0" + glob "^7.1.7" + postcss "^8.3.5" + postcss-selector-parser "^6.0.6" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -16244,6 +18422,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -16267,6 +18450,66 @@ raw-loader@^4.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" +rc-align@^4.0.0: + version "4.0.11" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" + integrity sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + lodash "^4.17.21" + rc-util "^5.3.0" + resize-observer-polyfill "^1.5.1" + +rc-motion@^2.0.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" + integrity sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.2.1" + +rc-slider@^9.7.5: + version "9.7.5" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.5.tgz#193141c68e99b1dc3b746daeb6bf852946f5b7f4" + integrity sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-tooltip "^5.0.1" + rc-util "^5.16.1" + shallowequal "^1.1.0" + +rc-tooltip@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" + integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA== + dependencies: + "@babel/runtime" "^7.11.2" + rc-trigger "^5.0.0" + +rc-trigger@^5.0.0: + version "5.2.10" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" + integrity sha512-FkUf4H9BOFDaIwu42fvRycXMAvkttph9AlbCZXssZDVzz2L+QZ0ERvfB/4nX3ZFPh1Zd+uVGr1DEDeXxq4J1TA== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.5.0" + +rc-util@^5.16.1, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.5.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.16.1.tgz#374db7cb735512f05165ddc3d6b2c61c21b8b4e3" + integrity sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ== + dependencies: + "@babel/runtime" "^7.12.5" + react-is "^16.12.0" + shallowequal "^1.1.0" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -16286,11 +18529,42 @@ react-babylon-spring@^1.0.2: "@react-spring/core" "9.0.0-rc.3" "@react-spring/shared" "9.0.0-rc.3" +react-bootstrap@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.1.1.tgz#a2f162fdda5275e89712ce4ca525ace661a48131" + integrity sha512-Igagk6LziNW/HgBlMVx+QiwPVt/oqrZ7tiBKgv31VYc/56kJEU0Y+BCJS6hrQP6QmmIpdVtX8TRaanv9xsmW5A== + dependencies: + "@babel/runtime" "^7.14.0" + "@restart/hooks" "^0.4.5" + "@restart/ui" "^0.2.5" + "@types/invariant" "^2.2.33" + "@types/prop-types" "^15.7.3" + "@types/react" ">=16.14.8" + "@types/react-transition-group" "^4.4.1" + "@types/warning" "^3.0.0" + classnames "^2.3.1" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.7.2" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.1" + uncontrollable "^7.2.1" + warning "^4.0.3" + react-colorful@^5.1.2: version "5.5.1" resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.5.1.tgz#29d9c4e496f2ca784dd2bb5053a3a4340cfaf784" integrity sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg== +react-cookie@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-cookie/-/react-cookie-4.1.1.tgz#832e134ad720e0de3e03deaceaab179c4061a19d" + integrity sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A== + dependencies: + "@types/hoist-non-react-statics" "^3.0.1" + hoist-non-react-statics "^3.0.0" + universal-cookie "^4.0.0" + react-dev-utils@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" @@ -16359,6 +18633,15 @@ react-draggable@^4.4.3: clsx "^1.1.1" prop-types "^15.6.0" +react-element-to-jsx-string@^14.3.4: + version "14.3.4" + resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz#709125bc72f06800b68f9f4db485f2c7d31218a8" + integrity sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg== + dependencies: + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "17.0.2" + react-error-overlay@^6.0.9: version "6.0.10" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6" @@ -16404,11 +18687,25 @@ react-helmet@^6.1.0: react-fast-compare "^3.1.1" react-side-effect "^2.1.0" +react-icons@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" + integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== + react-id-generator@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/react-id-generator/-/react-id-generator-3.0.2.tgz#e5bc5bae463907755e809beb625fafd67ded5d56" integrity sha512-d0rqWzZ6g0P9agHtA7wX/ErQ4iV/657/0Oz+SX3kid7nR4d0YwaWjjOTIrgYHv2lICZKrxIH4BaKppKrM8fRfw== +react-inspector@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.1.tgz#58476c78fde05d5055646ed8ec02030af42953c8" + integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg== + dependencies: + "@babel/runtime" "^7.0.0" + is-dom "^1.0.0" + prop-types "^15.0.0" + react-instantsearch-core@^6.19.0: version "6.19.0" resolved "https://registry.yarnpkg.com/react-instantsearch-core/-/react-instantsearch-core-6.19.0.tgz#cd9106a590e4d2fe3c36f9eb5fa59b095ff7d1c9" @@ -16431,16 +18728,16 @@ react-instantsearch-dom@^6.11.0: react-fast-compare "^3.0.0" react-instantsearch-core "^6.19.0" -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: +react-is@17.0.2, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-layout-effect@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/react-layout-effect/-/react-layout-effect-1.0.5.tgz#0dc4e24452aee5de66c93c166f0ec512dfb1be80" @@ -16498,10 +18795,10 @@ react-reconciler@^0.26.2: object-assign "^4.1.1" scheduler "^0.20.2" -react-refresh@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" - integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-refresh@^0.9.0: version "0.9.0" @@ -16554,6 +18851,25 @@ react-syntax-highlighter@^13.5.3: prismjs "^1.21.0" refractor "^3.1.0" +react-syntax-highlighter@^15.4.5: + version "15.4.5" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.4.5.tgz#db900d411d32a65c8e90c39cd64555bf463e712e" + integrity sha512-RC90KQTxZ/b7+9iE6s9nmiFLFjWswUcfULi4GwVzdFVKVMQySkJWBuOmJFfjwjMVCo0IUUuJrWebNKyviKpwLQ== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.25.0" + refractor "^3.2.0" + +react-tabs@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.3.tgz#ccbb3e1241ad3f601047305c75db661239977f2f" + integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + react-textarea-autosize@^8.3.0: version "8.3.3" resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" @@ -16563,6 +18879,16 @@ react-textarea-autosize@^8.3.0: use-composed-ref "^1.0.0" use-latest "^1.0.0" +react-transition-group@^4.4.1, react-transition-group@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -16694,7 +19020,7 @@ readable-stream@1.1.x, readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -16769,7 +19095,7 @@ redux@4.1.2: dependencies: "@babel/runtime" "^7.9.2" -refractor@^3.1.0: +refractor@^3.1.0, refractor@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.5.0.tgz#334586f352dda4beaf354099b48c2d18e0819aec" integrity sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg== @@ -16918,6 +19244,17 @@ remark-codesandbox@^0.10.0: unist-util-is "^4.0.1" unist-util-visit "^2.0.1" +remark-external-links@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" + integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== + dependencies: + extend "^3.0.0" + is-absolute-url "^3.0.0" + mdast-util-definitions "^4.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + remark-footnotes@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" @@ -17017,6 +19354,15 @@ remark-retext@^4.0.0: dependencies: mdast-util-to-nlcst "^4.0.0" +remark-slug@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" + integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + remark-squeeze-paragraphs@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" @@ -17119,6 +19465,22 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -17192,6 +19554,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-alpn@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -17365,6 +19732,11 @@ rollup@^2.0.6: optionalDependencies: fsevents "~2.3.2" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -17437,6 +19809,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sanitize-html@^1.27.5: version "1.27.5" resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.27.5.tgz#6c8149462adb23e360e1bb71cc0bae7f08c823c7" @@ -17452,6 +19839,13 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -17518,7 +19912,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -17599,6 +19993,20 @@ serve-favicon@^2.5.0: parseurl "~1.3.2" safe-buffer "5.1.1" +serve-handler@^6.0.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + serve-static@1.14.2: version "1.14.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" @@ -18089,6 +20497,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -18106,6 +20521,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + sshpk@^1.7.0: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" @@ -18206,6 +20626,11 @@ static-site-generator-webpack-plugin@^3.4.2: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + store2@^2.12.0: version "2.13.1" resolved "https://registry.yarnpkg.com/store2/-/store2-2.13.1.tgz#fae7b5bb9d35fc53dc61cd262df3abb2f6e59022" @@ -18219,6 +20644,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -18245,6 +20678,16 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + stream-iterate@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" @@ -18290,6 +20733,11 @@ string-env-interpolation@1.0.1: resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + string-natural-compare@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" @@ -18398,7 +20846,7 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -18644,7 +21092,19 @@ supports-color@7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -18670,6 +21130,14 @@ supports-color@^9.2.1: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -18694,7 +21162,7 @@ svgo@1.3.2: unquote "~1.1.1" util.promisify "~1.0.0" -svgo@^2.7.0: +svgo@^2.4.0, svgo@^2.6.1, svgo@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== @@ -18720,6 +21188,11 @@ symbol-observable@^1.0.4: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + symbol.prototype.description@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" @@ -18854,11 +21327,19 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -term-size@^2.1.0: +term-size@^2.1.0, term-size@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== +terminal-link@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + terser-webpack-plugin@^1.4.3: version "1.4.5" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" @@ -18909,7 +21390,7 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.0.0, terser@^5.3.4, terser@^5.7.2: +terser@^5.0.0, terser@^5.2.0, terser@^5.3.4, terser@^5.7.2, terser@^5.8.0: version "5.10.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== @@ -18960,7 +21441,7 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -timers-browserify@^2.0.4: +timers-browserify@^2.0.11, timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== @@ -19017,6 +21498,11 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -19107,7 +21593,7 @@ token-types@^4.1.1: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" -tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -19115,6 +21601,13 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -19240,6 +21733,11 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +tty-browserify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -19259,6 +21757,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -19284,6 +21789,11 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.9.0.tgz#7a2d430dd966f52b6bc723da2aaa2c9867530551" + integrity sha512-uC0hJKi7eAGXUJ/YKk53RhnKxMwzHWgzf4t92oz8Qez28EBgVTfpDTB59y9hMYLzc/Wl85cD7Tv1hLZZoEJtrg== + type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -19319,7 +21829,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.5.2: +typescript@>=3.0.0, typescript@^4.5.2, typescript@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== @@ -19354,6 +21864,31 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +uncss@^0.17.3: + version "0.17.3" + resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.3.tgz#50fc1eb4ed573ffff763458d801cd86e4d69ea11" + integrity sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog== + dependencies: + commander "^2.20.0" + glob "^7.1.4" + is-absolute-url "^3.0.1" + is-html "^1.1.0" + jsdom "^14.1.0" + lodash "^4.17.15" + postcss "^7.0.17" + postcss-selector-parser "6.0.2" + request "^2.88.0" + underscore.string@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -19464,6 +21999,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + unique-filename@^1.1.0, unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -19621,7 +22161,7 @@ unist-util-visit-parents@^3.0.0, unist-util-visit-parents@^3.1.1: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: +unist-util-visit@2, unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -19637,6 +22177,14 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.4.1: dependencies: unist-util-visit-parents "^2.0.0" +universal-cookie@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/universal-cookie/-/universal-cookie-4.0.4.tgz#06e8b3625bf9af049569ef97109b4bb226ad798d" + integrity sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw== + dependencies: + "@types/cookie" "^0.3.3" + cookie "^0.4.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -19868,16 +22416,38 @@ util@^0.11.0: dependencies: inherits "2.0.3" +util@^0.12.0, util@^0.12.3: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid-browser@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" + integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= + uuid@3.4.0, uuid@^3.3.2, uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -19888,7 +22458,7 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: +v8-compile-cache@^2.0.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -20004,12 +22574,35 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== -vm-browserify@^1.0.1: +vm-browserify@^1.0.1, vm-browserify@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -warning@^4.0.2: +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== @@ -20042,14 +22635,14 @@ watchpack@^2.2.0, watchpack@^2.3.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -wcwidth@^1.0.0: +wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" -weak-lru-cache@^1.0.0: +weak-lru-cache@^1.0.0, weak-lru-cache@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.1.tgz#6b4f2da7e1701f845e71522417f1df1e39503df8" integrity sha512-O5ag1F0Xk6ui+Fg5LlosTcVAyHs6DeyiDDbOapNtFCx/KjZ82B3U9stM9hvzbVclKWn9ABPjaINX/nQkGkJkKg== @@ -20064,6 +22657,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-dev-middleware@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" @@ -20217,11 +22815,23 @@ webpack@^5.61.0: watchpack "^2.3.1" webpack-sources "^3.2.2" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + whatwg-fetch@>=0.10.0: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -20230,6 +22840,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -20320,7 +22939,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -20539,11 +23158,18 @@ ws@7.4.5: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== -"ws@^5.2.0 || ^6.0.0 || ^7.0.0": +"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.0.0: version "7.5.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== +ws@^6.1.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + ws@^8.2.3: version "8.4.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" @@ -20579,6 +23205,11 @@ xhr@^2.0.1: parse-headers "^2.0.0" xtend "^4.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" @@ -20597,6 +23228,11 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xmlhttprequest-ssl@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" @@ -20615,11 +23251,16 @@ xstate@^4.26.0, xstate@^4.26.1: resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.27.0.tgz#f3c918ac4229bd5e6dec2231e991ba55c6bfa559" integrity sha512-ohOwDM9tViC/zSSmY9261CHblDPqiaAk5vyjVbi69uJv9fGWMzlm0VDQwM2OvC61GKfXVBeuWSMkL7LPUsTpfA== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xxhash-wasm@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79" + integrity sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA== + y18n@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"