├── .gitignore
├── README.md
├── components
├── AuthCheck.js
├── HeartButton.js
├── ImageUploader.js
├── Loader.js
├── Metatags.js
├── Navbar.js
├── PostContent.js
├── PostFeed.js
└── UserProfile.js
├── firestore.rules
├── jsconfig.json
├── lib
├── context.js
├── firebase.js
└── hooks.js
├── next.config.js
├── package-lock.json
├── package.json
├── pages
├── 404.js
├── [username]
│ ├── [slug].js
│ └── index.js
├── _app.js
├── admin
│ ├── [slug].js
│ └── index.js
├── api
│ └── [username].js
├── enter.js
└── index.js
├── public
├── favicon.ico
├── google.png
├── hacker.png
└── vercel.svg
└── styles
├── Admin.module.css
├── Post.module.css
└── globals.css
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env.local
29 | .env.development.local
30 | .env.test.local
31 | .env.production.local
32 |
33 | # vercel
34 | .vercel
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Next.js + Firebase - The Full Course
2 |
3 | - [Live Demo](https://next.fireship.io/)
4 | - [Enroll in the Course](https://fireship.io/courses/react-next-firebase/)
5 |
6 | Become an expert at React, Next.js, and Firebase by building a social blogging community from scratch.
7 |
8 | Build a complex webapp inspired by sites Dev.to and Medium, featuring...
9 |
10 | - 👨🎤 Custom Firebase usernames
11 | - 📰 Bot-friendly content (SEO)
12 | - 🦾 Advanced SSR, SSG, and ISR techniques
13 | - 🔥 Firestore CRUD and data modeling
14 | - ⚛️ Reactive forms with react-hook-form
15 | - 📂 Image file uploads
16 | - 💞 Realtime hearts
17 | - 🚀 Security & Deployment
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/components/AuthCheck.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import { useContext } from 'react';
3 | import { UserContext } from '@lib/context';
4 |
5 | // Component's children only shown to logged-in users
6 | export default function AuthCheck(props) {
7 | const { username } = useContext(UserContext);
8 |
9 | return username ? props.children : props.fallback || You must be signed in;
10 | }
11 |
--------------------------------------------------------------------------------
/components/HeartButton.js:
--------------------------------------------------------------------------------
1 | import { firestore, auth, increment } from '@lib/firebase';
2 | import { useDocument } from 'react-firebase-hooks/firestore';
3 |
4 | // Allows user to heart or like a post
5 | export default function Heart({ postRef }) {
6 | // Listen to heart document for currently logged in user
7 | const heartRef = postRef.collection('hearts').doc(auth.currentUser.uid);
8 | const [heartDoc] = useDocument(heartRef);
9 |
10 | // Create a user-to-post relationship
11 | const addHeart = async () => {
12 | const uid = auth.currentUser.uid;
13 | const batch = firestore.batch();
14 |
15 | batch.update(postRef, { heartCount: increment(1) });
16 | batch.set(heartRef, { uid });
17 |
18 | await batch.commit();
19 | };
20 |
21 | // Remove a user-to-post relationship
22 | const removeHeart = async () => {
23 | const batch = firestore.batch();
24 |
25 | batch.update(postRef, { heartCount: increment(-1) });
26 | batch.delete(heartRef);
27 |
28 | await batch.commit();
29 | };
30 |
31 | return heartDoc?.exists ? (
32 | 💔 Unheart
33 | ) : (
34 | 💗 Heart
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/components/ImageUploader.js:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import { auth, storage, STATE_CHANGED } from '@lib/firebase';
3 | import Loader from './Loader';
4 |
5 | // Uploads images to Firebase Storage
6 | export default function ImageUploader() {
7 | const [uploading, setUploading] = useState(false);
8 | const [progress, setProgress] = useState(0);
9 | const [downloadURL, setDownloadURL] = useState(null);
10 |
11 | // Creates a Firebase Upload Task
12 | const uploadFile = async (e) => {
13 | // Get the file
14 | const file = Array.from(e.target.files)[0];
15 | const extension = file.type.split('/')[1];
16 |
17 | // Makes reference to the storage bucket location
18 | const ref = storage.ref(`uploads/${auth.currentUser.uid}/${Date.now()}.${extension}`);
19 | setUploading(true);
20 |
21 | // Starts the upload
22 | const task = ref.put(file);
23 |
24 | // Listen to updates to upload task
25 | task.on(STATE_CHANGED, (snapshot) => {
26 | const pct = ((snapshot.bytesTransferred / snapshot.totalBytes) * 100).toFixed(0);
27 | setProgress(pct);
28 | });
29 |
30 | // Get downloadURL AFTER task resolves (Note: this is not a native Promise)
31 | task
32 | .then((d) => ref.getDownloadURL())
33 | .then((url) => {
34 | setDownloadURL(url);
35 | setUploading(false);
36 | });
37 | };
38 |
39 | return (
40 |
41 |
42 | {uploading &&
{progress}% }
43 |
44 | {!uploading && (
45 | <>
46 |
47 | 📸 Upload Img
48 |
49 |
50 | >
51 | )}
52 |
53 | {downloadURL && {``}
}
54 |
55 | );
56 | }
57 |
--------------------------------------------------------------------------------
/components/Loader.js:
--------------------------------------------------------------------------------
1 | // Loading Spinner
2 | export default function Loader({ show }) {
3 | return show ?
: null;
4 | }
5 |
--------------------------------------------------------------------------------
/components/Metatags.js:
--------------------------------------------------------------------------------
1 | import Head from 'next/head';
2 |
3 | export default function Metatags({
4 | title = 'The Full Next.js + Firebase Course',
5 | description = 'A complete Next.js + Firebase course by Fireship.io',
6 | image = 'https://fireship.io/courses/react-next-firebase/img/featured.png',
7 | }) {
8 | return (
9 |
10 | {title}
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/components/Navbar.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import { useRouter } from 'next/router';
3 | import { useContext } from 'react';
4 | import { UserContext } from '@lib/context';
5 | import { auth } from '@lib/firebase';
6 |
7 | // Top navbar
8 | export default function Navbar() {
9 | const { user, username } = useContext(UserContext);
10 |
11 | const router = useRouter();
12 |
13 | const signOut = () => {
14 | auth.signOut();
15 | router.reload();
16 | }
17 |
18 | return (
19 |
20 |
21 |
22 |
23 | NXT
24 |
25 |
26 |
27 | {/* user is signed-in and has username */}
28 | {username && (
29 | <>
30 |
31 | Sign Out
32 |
33 |
34 |
35 | Write Posts
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | >
44 | )}
45 |
46 | {/* user is not signed OR has not created username */}
47 | {!username && (
48 |
49 |
50 | Log in
51 |
52 |
53 | )}
54 |
55 |
56 | );
57 | }
58 |
--------------------------------------------------------------------------------
/components/PostContent.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import ReactMarkdown from 'react-markdown';
3 |
4 | // UI component for main post content
5 | export default function PostContent({ post }) {
6 | const createdAt = typeof post?.createdAt === 'number' ? new Date(post.createdAt) : post.createdAt.toDate();
7 |
8 | return (
9 |
10 |
{post?.title}
11 |
12 | Written by{' '}
13 |
14 | @{post.username}
15 | {' '}
16 | on {createdAt.toISOString()}
17 |
18 |
{post?.content}
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/components/PostFeed.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 |
3 | export default function PostFeed({ posts, admin }) {
4 | return posts ? posts.map((post) => ) : null;
5 | }
6 |
7 | function PostItem({ post, admin = false }) {
8 | // Naive method to calc word count and read time
9 | const wordCount = post?.content.trim().split(/\s+/g).length;
10 | const minutesToRead = (wordCount / 100 + 1).toFixed(0);
11 |
12 | return (
13 |
14 |
15 |
16 | By @{post.username}
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 |
27 |
28 | {wordCount} words. {minutesToRead} min read
29 |
30 | 💗 {post.heartCount || 0} Hearts
31 |
32 |
33 | {/* If admin view, show extra controls for user */}
34 | {admin && (
35 | <>
36 |
37 |
38 | Edit
39 |
40 |
41 |
42 | {post.published ?
Live
:
Unpublished
}
43 | >
44 | )}
45 |
46 | );
47 | }
48 |
--------------------------------------------------------------------------------
/components/UserProfile.js:
--------------------------------------------------------------------------------
1 | // UI component for user profile
2 | export default function UserProfile({ user }) {
3 | return (
4 |
5 |
6 |
7 | @{user.username}
8 |
9 |
{user.displayName || 'Anonymous User'}
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/firestore.rules:
--------------------------------------------------------------------------------
1 | rules_version = '2';
2 | service cloud.firestore {
3 | match /databases/{database}/documents {
4 | match /{document=**} {
5 |
6 | // Required for collection group queries
7 | match /posts/{postId} {
8 | allow read;
9 | }
10 |
11 | match /users/{userId} {
12 | allow read;
13 | allow create: if isValidUser(userId);
14 | }
15 |
16 | match /usernames/{username} {
17 | allow read;
18 | allow create: if isValidUsername(username);
19 | }
20 |
21 |
22 | match /users/{userId}/posts/{postId} {
23 | allow read;
24 | allow create: if canCreatePost(userId);
25 | allow update: if canUpdatePost(userId) || canIncrementHearts(userId, postId);
26 | allow delete: if request.auth.uid == userId;
27 | }
28 |
29 | match /users/{userId}/posts/{postId}/hearts/{heartId} {
30 | allow read;
31 | allow write: if request.auth.uid == heartId;
32 | }
33 |
34 | // Users
35 |
36 | function isValidUser(userId) {
37 | let isOwner = request.auth.uid == userId;
38 | let username = request.resource.data.username;
39 | let createdValidUsername = existsAfter(/databases/$(database)/documents/usernames/$(username));
40 |
41 | return isOwner && createdValidUsername;
42 | }
43 |
44 | function isValidUsername(username) {
45 | let isOwner = request.auth.uid == request.resource.data.uid;
46 | let isValidLength = username.size() >= 3 && username.size() <= 15;
47 | let isValidUserDoc = getAfter(/databases/$(database)/documents/users/$(request.auth.uid)).data.username == username;
48 |
49 | return isOwner && isValidLength && isValidUserDoc;
50 | }
51 |
52 | // Posts
53 |
54 | function canCreatePost(userId) {
55 | let isOwner = request.auth.uid == userId;
56 | let isNow = request.time == request.resource.data.createdAt;
57 | let isValidContent = request.resource.data.content.size() < 20000 && request.resource.data.heartCount == 0;
58 | let username = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.username;
59 | let usernameMatches = username == request.resource.data.username;
60 |
61 | return isOwner && isNow && isValidContent && usernameMatches;
62 | }
63 |
64 | function canUpdatePost(userId) {
65 | let isOwner = request.auth.uid == userId;
66 | let isNow = request.time == request.resource.data.updatedAt;
67 | let isValidContent = request.resource.data.content.size() < 20000;
68 | let doesNotUpdateForbidden = !request.resource.data.diff(resource.data).affectedKeys().hasAny(['uid', 'username', 'heartCount']);
69 |
70 | return isOwner && isNow && isValidContent && doesNotUpdateForbidden;
71 | }
72 |
73 | // Hearts
74 |
75 | function canIncrementHearts(userId, postId) {
76 | let hasValidFields = request.resource.data.diff(resource.data).affectedKeys().hasOnly(['heartCount']);
77 | let currentUser = request.auth.uid;
78 | let heartDocExistsAfter = existsAfter(/databases/$(database)/documents/users/$(userId)/posts/$(postId)/hearts/$(currentUser));
79 | let heartDocExists = exists(/databases/$(database)/documents/users/$(userId)/posts/$(postId)/hearts/$(currentUser));
80 |
81 | let heartDocAdded= !heartDocExists && heartDocExistsAfter;
82 | let heartDocRemoved = heartDocExists && !heartDocExistsAfter;
83 |
84 |
85 | let countChange = request.resource.data.heartCount - resource.data.heartCount;
86 | let validChange = countChange == 1 || countChange == -1;
87 |
88 | return hasValidFields && validChange && ( countChange == 1 ? heartDocAdded : heartDocRemoved );
89 | }
90 |
91 |
92 |
93 | }
94 |
95 | }
96 | }
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": "./",
4 | "paths": {
5 | "@components/*": ["components/*"],
6 | "@styles/*": ["styles/*"],
7 | "@lib/*": ["lib/*"],
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/lib/context.js:
--------------------------------------------------------------------------------
1 | import { createContext } from 'react';
2 | export const UserContext = createContext({ user: null, username: null });
3 |
--------------------------------------------------------------------------------
/lib/firebase.js:
--------------------------------------------------------------------------------
1 | import firebase from 'firebase/app';
2 | import 'firebase/auth';
3 | import 'firebase/firestore';
4 | import 'firebase/storage';
5 |
6 | const firebaseConfig = {
7 | apiKey: 'AIzaSyBX5gkKsbOr1V0zxBuSqHWFct12dFOsQHA',
8 | authDomain: 'nextfire-demo.firebaseapp.com',
9 | projectId: 'nextfire-demo',
10 | storageBucket: 'nextfire-demo.appspot.com',
11 | messagingSenderId: '827402452263',
12 | appId: '1:827402452263:web:c9a4bea701665ddf15fd02',
13 | };
14 |
15 | if (!firebase.apps.length) {
16 | firebase.initializeApp(firebaseConfig);
17 | }
18 |
19 | // Auth exports
20 | export const auth = firebase.auth();
21 | export const googleAuthProvider = new firebase.auth.GoogleAuthProvider();
22 |
23 | // Firestore exports
24 | export const firestore = firebase.firestore();
25 | export const serverTimestamp = firebase.firestore.FieldValue.serverTimestamp;
26 | export const fromMillis = firebase.firestore.Timestamp.fromMillis;
27 | export const increment = firebase.firestore.FieldValue.increment;
28 |
29 | // Storage exports
30 | export const storage = firebase.storage();
31 | export const STATE_CHANGED = firebase.storage.TaskEvent.STATE_CHANGED;
32 |
33 | /// Helper functions
34 |
35 | /**`
36 | * Gets a users/{uid} document with username
37 | * @param {string} username
38 | */
39 | export async function getUserWithUsername(username) {
40 | const usersRef = firestore.collection('users');
41 | const query = usersRef.where('username', '==', username).limit(1);
42 | const userDoc = (await query.get()).docs[0];
43 | return userDoc;
44 | }
45 |
46 | /**`
47 | * Converts a firestore document to JSON
48 | * @param {DocumentSnapshot} doc
49 | */
50 | export function postToJSON(doc) {
51 | const data = doc.data();
52 | return {
53 | ...data,
54 | // Gotcha! firestore timestamp NOT serializable to JSON. Must convert to milliseconds
55 | createdAt: data?.createdAt.toMillis() || 0,
56 | updatedAt: data?.updatedAt.toMillis() || 0,
57 | };
58 | }
59 |
--------------------------------------------------------------------------------
/lib/hooks.js:
--------------------------------------------------------------------------------
1 | import { auth, firestore } from '@lib/firebase';
2 | import { useEffect, useState } from 'react';
3 | import { useAuthState } from 'react-firebase-hooks/auth';
4 |
5 | // Custom hook to read auth record and user profile doc
6 | export function useUserData() {
7 | const [user] = useAuthState(auth);
8 | const [username, setUsername] = useState(null);
9 |
10 | useEffect(() => {
11 | // turn off realtime subscription
12 | let unsubscribe;
13 |
14 | if (user) {
15 | const ref = firestore.collection('users').doc(user.uid);
16 | unsubscribe = ref.onSnapshot((doc) => {
17 | setUsername(doc.data()?.username);
18 | });
19 | } else {
20 | setUsername(null);
21 | }
22 |
23 | return unsubscribe;
24 | }, [user]);
25 |
26 | return { user, username };
27 | }
28 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | swcMinify: true,
3 | }
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nextfire",
3 | "version": "0.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.12.11",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
11 | "requires": {
12 | "@babel/highlight": "^7.10.4"
13 | }
14 | },
15 | "@babel/helper-plugin-utils": {
16 | "version": "7.14.5",
17 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
18 | "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ=="
19 | },
20 | "@babel/helper-validator-identifier": {
21 | "version": "7.15.7",
22 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
23 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
24 | },
25 | "@babel/highlight": {
26 | "version": "7.14.5",
27 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
28 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
29 | "requires": {
30 | "@babel/helper-validator-identifier": "^7.14.5",
31 | "chalk": "^2.0.0",
32 | "js-tokens": "^4.0.0"
33 | }
34 | },
35 | "@babel/plugin-syntax-jsx": {
36 | "version": "7.14.5",
37 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz",
38 | "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==",
39 | "requires": {
40 | "@babel/helper-plugin-utils": "^7.14.5"
41 | }
42 | },
43 | "@babel/runtime": {
44 | "version": "7.15.4",
45 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
46 | "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
47 | "requires": {
48 | "regenerator-runtime": "^0.13.4"
49 | }
50 | },
51 | "@babel/types": {
52 | "version": "7.15.0",
53 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
54 | "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
55 | "requires": {
56 | "@babel/helper-validator-identifier": "^7.14.9",
57 | "to-fast-properties": "^2.0.0"
58 | }
59 | },
60 | "@firebase/analytics": {
61 | "version": "0.6.18",
62 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.18.tgz",
63 | "integrity": "sha512-FXNtYDxbs9ynPbzUVuG94BjFPOPpgJ7156660uvCBuKgoBCIVcNqKkJQQ7TH8384fqvGjbjdcgARY9jgAHbtog==",
64 | "requires": {
65 | "@firebase/analytics-types": "0.6.0",
66 | "@firebase/component": "0.5.6",
67 | "@firebase/installations": "0.4.32",
68 | "@firebase/logger": "0.2.6",
69 | "@firebase/util": "1.3.0",
70 | "tslib": "^2.1.0"
71 | }
72 | },
73 | "@firebase/analytics-types": {
74 | "version": "0.6.0",
75 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.6.0.tgz",
76 | "integrity": "sha512-kbMawY0WRPyL/lbknBkme4CNLl+Gw+E9G4OpNeXAauqoQiNkBgpIvZYy7BRT4sNGhZbxdxXxXbruqUwDzLmvTw=="
77 | },
78 | "@firebase/app": {
79 | "version": "0.6.30",
80 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.30.tgz",
81 | "integrity": "sha512-uAYEDXyK0mmpZ8hWQj5TNd7WVvfsU8PgsqKpGljbFBG/HhsH8KbcykWAAA+c1PqL7dt/dbt0Reh1y9zEdYzMhg==",
82 | "requires": {
83 | "@firebase/app-types": "0.6.3",
84 | "@firebase/component": "0.5.6",
85 | "@firebase/logger": "0.2.6",
86 | "@firebase/util": "1.3.0",
87 | "dom-storage": "2.1.0",
88 | "tslib": "^2.1.0",
89 | "xmlhttprequest": "1.8.0"
90 | }
91 | },
92 | "@firebase/app-check": {
93 | "version": "0.3.2",
94 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.3.2.tgz",
95 | "integrity": "sha512-YjpsnV1xVTO1B836IKijRcDeceLgHQNJ/DWa+Vky9UHkm1Mi4qosddX8LZzldaWRTWKX7BN1MbZOLY8r7M/MZQ==",
96 | "requires": {
97 | "@firebase/app-check-interop-types": "0.1.0",
98 | "@firebase/app-check-types": "0.3.1",
99 | "@firebase/component": "0.5.6",
100 | "@firebase/logger": "0.2.6",
101 | "@firebase/util": "1.3.0",
102 | "tslib": "^2.1.0"
103 | }
104 | },
105 | "@firebase/app-check-interop-types": {
106 | "version": "0.1.0",
107 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz",
108 | "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA=="
109 | },
110 | "@firebase/app-check-types": {
111 | "version": "0.3.1",
112 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.3.1.tgz",
113 | "integrity": "sha512-KJ+BqJbdNsx4QT/JIT1yDj5p6D+QN97iJs3GuHnORrqL+DU3RWc9nSYQsrY6Tv9jVWcOkMENXAgDT484vzsm2w=="
114 | },
115 | "@firebase/app-types": {
116 | "version": "0.6.3",
117 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz",
118 | "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw=="
119 | },
120 | "@firebase/auth": {
121 | "version": "0.16.8",
122 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.8.tgz",
123 | "integrity": "sha512-mR0UXG4LirWIfOiCWxVmvz1o23BuKGxeItQ2cCUgXLTjNtWJXdcky/356iTUsd7ZV5A78s2NHeN5tIDDG6H4rg==",
124 | "requires": {
125 | "@firebase/auth-types": "0.10.3"
126 | }
127 | },
128 | "@firebase/auth-interop-types": {
129 | "version": "0.1.6",
130 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz",
131 | "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g=="
132 | },
133 | "@firebase/auth-types": {
134 | "version": "0.10.3",
135 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.3.tgz",
136 | "integrity": "sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA=="
137 | },
138 | "@firebase/component": {
139 | "version": "0.5.6",
140 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.6.tgz",
141 | "integrity": "sha512-GyQJ+2lrhsDqeGgd1VdS7W+Y6gNYyI0B51ovNTxeZVG/W8I7t9MwEiCWsCvfm5wQgfsKp9dkzOcJrL5k8oVO/Q==",
142 | "requires": {
143 | "@firebase/util": "1.3.0",
144 | "tslib": "^2.1.0"
145 | }
146 | },
147 | "@firebase/database": {
148 | "version": "0.11.0",
149 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.11.0.tgz",
150 | "integrity": "sha512-b/kwvCubr6G9coPlo48PbieBDln7ViFBHOGeVt/bt82yuv5jYZBEYAac/mtOVSxpf14aMo/tAN+Edl6SWqXApw==",
151 | "requires": {
152 | "@firebase/auth-interop-types": "0.1.6",
153 | "@firebase/component": "0.5.6",
154 | "@firebase/database-types": "0.8.0",
155 | "@firebase/logger": "0.2.6",
156 | "@firebase/util": "1.3.0",
157 | "faye-websocket": "0.11.3",
158 | "tslib": "^2.1.0"
159 | }
160 | },
161 | "@firebase/database-types": {
162 | "version": "0.8.0",
163 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.8.0.tgz",
164 | "integrity": "sha512-7IdjAFRfPWyG3b4wcXyghb3Y1CLCSJFZIg1xl5GbTVMttSQFT4B5NYdhsfA34JwAsv5pMzPpjOaS3/K9XJ2KiA==",
165 | "requires": {
166 | "@firebase/app-types": "0.6.3",
167 | "@firebase/util": "1.3.0"
168 | }
169 | },
170 | "@firebase/firestore": {
171 | "version": "2.4.0",
172 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.4.0.tgz",
173 | "integrity": "sha512-PQ6+lWNrvh74GvFTHT4gCutFipDmtu8D1tNNawKe+/SyL6XFgeuMYgZIpKQgkTSezVDogC7EGQTJBFnewF9pOg==",
174 | "requires": {
175 | "@firebase/component": "0.5.6",
176 | "@firebase/firestore-types": "2.4.0",
177 | "@firebase/logger": "0.2.6",
178 | "@firebase/util": "1.3.0",
179 | "@firebase/webchannel-wrapper": "0.5.1",
180 | "@grpc/grpc-js": "^1.3.2",
181 | "@grpc/proto-loader": "^0.6.0",
182 | "node-fetch": "2.6.1",
183 | "tslib": "^2.1.0"
184 | }
185 | },
186 | "@firebase/firestore-types": {
187 | "version": "2.4.0",
188 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.4.0.tgz",
189 | "integrity": "sha512-0dgwfuNP7EN6/OlK2HSNSQiQNGLGaRBH0gvgr1ngtKKJuJFuq0Z48RBMeJX9CGjV4TP9h2KaB+KrUKJ5kh1hMg=="
190 | },
191 | "@firebase/functions": {
192 | "version": "0.6.15",
193 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.15.tgz",
194 | "integrity": "sha512-b7RpLwFXi0N+HgkfK8cmkarSOoBeSrc1jNdadkCacQt+vIePkKM3E9EJXF4roWSa8GwTruodpBsvH+lK9iCAKQ==",
195 | "requires": {
196 | "@firebase/component": "0.5.6",
197 | "@firebase/functions-types": "0.4.0",
198 | "@firebase/messaging-types": "0.5.0",
199 | "node-fetch": "2.6.1",
200 | "tslib": "^2.1.0"
201 | }
202 | },
203 | "@firebase/functions-types": {
204 | "version": "0.4.0",
205 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz",
206 | "integrity": "sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ=="
207 | },
208 | "@firebase/installations": {
209 | "version": "0.4.32",
210 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.32.tgz",
211 | "integrity": "sha512-K4UlED1Vrhd2rFQQJih+OgEj8OTtrtH4+Izkx7ip2bhXSc+unk8ZhnF69D0kmh7zjXAqEDJrmHs9O5fI3rV6Tw==",
212 | "requires": {
213 | "@firebase/component": "0.5.6",
214 | "@firebase/installations-types": "0.3.4",
215 | "@firebase/util": "1.3.0",
216 | "idb": "3.0.2",
217 | "tslib": "^2.1.0"
218 | }
219 | },
220 | "@firebase/installations-types": {
221 | "version": "0.3.4",
222 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz",
223 | "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q=="
224 | },
225 | "@firebase/logger": {
226 | "version": "0.2.6",
227 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz",
228 | "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw=="
229 | },
230 | "@firebase/messaging": {
231 | "version": "0.8.0",
232 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.8.0.tgz",
233 | "integrity": "sha512-hkFHDyVe1kMcY9KEG+prjCbvS6MtLUgVFUbbQqq7JQfiv58E07YCzRUcMrJolbNi/1QHH6Jv16DxNWjJB9+/qA==",
234 | "requires": {
235 | "@firebase/component": "0.5.6",
236 | "@firebase/installations": "0.4.32",
237 | "@firebase/messaging-types": "0.5.0",
238 | "@firebase/util": "1.3.0",
239 | "idb": "3.0.2",
240 | "tslib": "^2.1.0"
241 | }
242 | },
243 | "@firebase/messaging-types": {
244 | "version": "0.5.0",
245 | "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz",
246 | "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg=="
247 | },
248 | "@firebase/performance": {
249 | "version": "0.4.18",
250 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.18.tgz",
251 | "integrity": "sha512-lvZW/TVDne2TyOpWbv++zjRn277HZpbjxbIPfwtnmKjVY1gJ+H77Qi1c2avVIc9hg80uGX/5tNf4pOApNDJLVg==",
252 | "requires": {
253 | "@firebase/component": "0.5.6",
254 | "@firebase/installations": "0.4.32",
255 | "@firebase/logger": "0.2.6",
256 | "@firebase/performance-types": "0.0.13",
257 | "@firebase/util": "1.3.0",
258 | "tslib": "^2.1.0"
259 | }
260 | },
261 | "@firebase/performance-types": {
262 | "version": "0.0.13",
263 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz",
264 | "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA=="
265 | },
266 | "@firebase/polyfill": {
267 | "version": "0.3.36",
268 | "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz",
269 | "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==",
270 | "requires": {
271 | "core-js": "3.6.5",
272 | "promise-polyfill": "8.1.3",
273 | "whatwg-fetch": "2.0.4"
274 | }
275 | },
276 | "@firebase/remote-config": {
277 | "version": "0.1.43",
278 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.43.tgz",
279 | "integrity": "sha512-laNM4MN0CfeSp7XCVNjYOC4DdV6mj0l2rzUh42x4v2wLTweCoJ/kc1i4oWMX9TI7Jw8Am5Wl71Awn1J2pVe5xA==",
280 | "requires": {
281 | "@firebase/component": "0.5.6",
282 | "@firebase/installations": "0.4.32",
283 | "@firebase/logger": "0.2.6",
284 | "@firebase/remote-config-types": "0.1.9",
285 | "@firebase/util": "1.3.0",
286 | "tslib": "^2.1.0"
287 | }
288 | },
289 | "@firebase/remote-config-types": {
290 | "version": "0.1.9",
291 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz",
292 | "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA=="
293 | },
294 | "@firebase/storage": {
295 | "version": "0.7.0",
296 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.7.0.tgz",
297 | "integrity": "sha512-ebDFKJbM5HOxVtZV+RhVEBVtlWHK+Z5L3kA5uDBA2jMYcn+8NV/crozJnEE+iRsGEco6dLK5JS+Er4qtKLpH5A==",
298 | "requires": {
299 | "@firebase/component": "0.5.6",
300 | "@firebase/storage-types": "0.5.0",
301 | "@firebase/util": "1.3.0",
302 | "node-fetch": "2.6.1",
303 | "tslib": "^2.1.0"
304 | }
305 | },
306 | "@firebase/storage-types": {
307 | "version": "0.5.0",
308 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.5.0.tgz",
309 | "integrity": "sha512-6Wv3Lu7s18hsgW7HG4BFwycTquZ3m/C8bjBoOsmPu0TD6M1GKwCzOC7qBdN7L6tRYPh8ipTj5+rPFrmhGfUVKA=="
310 | },
311 | "@firebase/util": {
312 | "version": "1.3.0",
313 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.3.0.tgz",
314 | "integrity": "sha512-SESvmYwuKOVCZ1ZxLbberbx+9cnbxpCa4CG2FUSQYqN6Ab8KyltegMDIsqMw5KyIBZ4n1phfHoOa22xo5NzAlQ==",
315 | "requires": {
316 | "tslib": "^2.1.0"
317 | }
318 | },
319 | "@firebase/webchannel-wrapper": {
320 | "version": "0.5.1",
321 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.5.1.tgz",
322 | "integrity": "sha512-dZMzN0uAjwJXWYYAcnxIwXqRTZw3o14hGe7O6uhwjD1ZQWPVYA5lASgnNskEBra0knVBsOXB4KXg+HnlKewN/A=="
323 | },
324 | "@grpc/grpc-js": {
325 | "version": "1.3.7",
326 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.7.tgz",
327 | "integrity": "sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==",
328 | "requires": {
329 | "@types/node": ">=12.12.47"
330 | }
331 | },
332 | "@grpc/proto-loader": {
333 | "version": "0.6.4",
334 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.4.tgz",
335 | "integrity": "sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==",
336 | "requires": {
337 | "@types/long": "^4.0.1",
338 | "lodash.camelcase": "^4.3.0",
339 | "long": "^4.0.0",
340 | "protobufjs": "^6.10.0",
341 | "yargs": "^16.1.1"
342 | }
343 | },
344 | "@hapi/accept": {
345 | "version": "5.0.2",
346 | "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz",
347 | "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==",
348 | "requires": {
349 | "@hapi/boom": "9.x.x",
350 | "@hapi/hoek": "9.x.x"
351 | }
352 | },
353 | "@hapi/boom": {
354 | "version": "9.1.4",
355 | "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
356 | "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
357 | "requires": {
358 | "@hapi/hoek": "9.x.x"
359 | }
360 | },
361 | "@hapi/hoek": {
362 | "version": "9.2.1",
363 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz",
364 | "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw=="
365 | },
366 | "@napi-rs/triples": {
367 | "version": "1.0.3",
368 | "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz",
369 | "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA=="
370 | },
371 | "@next/env": {
372 | "version": "12.0.1",
373 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.1.tgz",
374 | "integrity": "sha512-+eJ8mQbAcV/ZILRAgIx9xwDg6hrqm6m/7QLfEvsf2BPnsh+fwU4Xf1zgcbyqD2V4ja4OTWG6ow+Hiukgap3mZQ=="
375 | },
376 | "@next/polyfill-module": {
377 | "version": "12.0.1",
378 | "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.1.tgz",
379 | "integrity": "sha512-fTrndwGuvrQO+4myVGcPtsYI4/tmZBhHHJId7MSHWz+9gW4NFgsmDlr8OI9Th2ZXpqk5WHLsTYQ+dLiQp1zV4g=="
380 | },
381 | "@next/react-dev-overlay": {
382 | "version": "12.0.1",
383 | "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.1.tgz",
384 | "integrity": "sha512-dLv1to40bvadbr0VO8pBsbr9ddgktCLilfejOpEFQkOOrdQBUuIfegqqEDiCL9THkAO3QGYY4t/ZPfv9wrxLZQ==",
385 | "requires": {
386 | "@babel/code-frame": "7.12.11",
387 | "anser": "1.4.9",
388 | "chalk": "4.0.0",
389 | "classnames": "2.2.6",
390 | "css.escape": "1.5.1",
391 | "data-uri-to-buffer": "3.0.1",
392 | "platform": "1.3.6",
393 | "shell-quote": "1.7.2",
394 | "source-map": "0.8.0-beta.0",
395 | "stacktrace-parser": "0.1.10",
396 | "strip-ansi": "6.0.1"
397 | },
398 | "dependencies": {
399 | "ansi-regex": {
400 | "version": "5.0.1",
401 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
402 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
403 | },
404 | "chalk": {
405 | "version": "4.0.0",
406 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
407 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
408 | "requires": {
409 | "ansi-styles": "^4.1.0",
410 | "supports-color": "^7.1.0"
411 | }
412 | },
413 | "has-flag": {
414 | "version": "4.0.0",
415 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
416 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
417 | },
418 | "strip-ansi": {
419 | "version": "6.0.1",
420 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
421 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
422 | "requires": {
423 | "ansi-regex": "^5.0.1"
424 | }
425 | },
426 | "supports-color": {
427 | "version": "7.2.0",
428 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
429 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
430 | "requires": {
431 | "has-flag": "^4.0.0"
432 | }
433 | }
434 | }
435 | },
436 | "@next/react-refresh-utils": {
437 | "version": "12.0.1",
438 | "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.1.tgz",
439 | "integrity": "sha512-CjTBR9a6ai+2fUT8KFya9AiTaCnfDY34H6pDmtdJdkD+vY08AwtPpv10kzsgNEhsL06210yVzH59IsEQLBIllA=="
440 | },
441 | "@next/swc-android-arm64": {
442 | "version": "12.0.1",
443 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.1.tgz",
444 | "integrity": "sha512-zI/6zsZuO2igknzHzfaQep0PeD3d4/qdjXUcQLwLHJQtGdhPvZFMke1z3BBWZqePHVsR1JPjE4QTii7udF5qsQ==",
445 | "optional": true
446 | },
447 | "@next/swc-darwin-arm64": {
448 | "version": "12.0.1",
449 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.1.tgz",
450 | "integrity": "sha512-vRfHz7rEt9+TTfwi3uY9ObUSLhzMmgVZ96b+yOSmZ6Kxs/V46IXHOLawCnoldXylpskZ/+HTWcrB1D3aimGeZA==",
451 | "optional": true
452 | },
453 | "@next/swc-darwin-x64": {
454 | "version": "12.0.1",
455 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.1.tgz",
456 | "integrity": "sha512-mM7QLIqRUqR8I74gbZ4Uq+dY8k3Whrs98wK+vPurmDTBhXhaVnAYblEkEwe0DJGqlmjD4w6faYfCydmFI69jqw==",
457 | "optional": true
458 | },
459 | "@next/swc-linux-arm-gnueabihf": {
460 | "version": "12.0.1",
461 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.1.tgz",
462 | "integrity": "sha512-QF5LVyAWTah5i1p/yG4a8nTGRXerHoDkS3kWYCdjcwlALOiAJ9m0GUTks/O47izNokBAbZnL7URUdvtGFjP0Ng==",
463 | "optional": true
464 | },
465 | "@next/swc-linux-arm64-gnu": {
466 | "version": "12.0.1",
467 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.1.tgz",
468 | "integrity": "sha512-ETFUh373WsjUJJr32GHSDlVSgwFwS+EJUJuSH40Pr4xB6250YxuRk8ccF6QR5LHqTL4tbbVEEfCD8sZVnccP8w==",
469 | "optional": true
470 | },
471 | "@next/swc-linux-arm64-musl": {
472 | "version": "12.0.1",
473 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.1.tgz",
474 | "integrity": "sha512-pfnXNjKywXyp2DJsjFhkfOlvcNu9xa8HgEhCUKXm1OZ4pGnpeb1+UD4t5Pn9b9ggiWPzauZK1abR/9nShvbSzw==",
475 | "optional": true
476 | },
477 | "@next/swc-linux-x64-gnu": {
478 | "version": "12.0.1",
479 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.1.tgz",
480 | "integrity": "sha512-d9cXS27Ar7TTtA3BJ8gxosDDdVNSFy4MQiwsszKlEiqfGrnINeXKdVgeiOa+xxq+JxNvPzonp4sbX6k8InIocg==",
481 | "optional": true
482 | },
483 | "@next/swc-linux-x64-musl": {
484 | "version": "12.0.1",
485 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.1.tgz",
486 | "integrity": "sha512-4SAmi7riavU6TFGX7wQFioFi/vx8uJ2/Cx7ZfrYiZzzKmmuu2eM8onW1kcKu+aQD777x/kvzW4+2pWkM2gyPOA==",
487 | "optional": true
488 | },
489 | "@next/swc-win32-arm64-msvc": {
490 | "version": "12.0.1",
491 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.1.tgz",
492 | "integrity": "sha512-JRad3QyXvs5zDkeEmc6z5tEvm/ZZnjnsBY921zWw7OIcIZR5wAs+1AnRVjIxHTEHSExxOvBgPyEMpgVkB8OyxQ==",
493 | "optional": true
494 | },
495 | "@next/swc-win32-ia32-msvc": {
496 | "version": "12.0.1",
497 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.1.tgz",
498 | "integrity": "sha512-ierQmzVWPi6a7PqrdgfI6nrQ/SWJ9W5jllByyQeFIOKhOzZiz030Tw+U6V7NqE3gGNeRwpj56Iya8nUb3hlM1g==",
499 | "optional": true
500 | },
501 | "@next/swc-win32-x64-msvc": {
502 | "version": "12.0.1",
503 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.1.tgz",
504 | "integrity": "sha512-li3CCXpdMX0+wJlQpy0xZmHCgHMebaBf5X2BIAJrv8cQXYc6dejeojttXLFNCF0dNAo3UzlbP6h7N+8p6Wbakw==",
505 | "optional": true
506 | },
507 | "@node-rs/helper": {
508 | "version": "1.2.1",
509 | "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz",
510 | "integrity": "sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==",
511 | "requires": {
512 | "@napi-rs/triples": "^1.0.3"
513 | }
514 | },
515 | "@protobufjs/aspromise": {
516 | "version": "1.1.2",
517 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
518 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
519 | },
520 | "@protobufjs/base64": {
521 | "version": "1.1.2",
522 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
523 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
524 | },
525 | "@protobufjs/codegen": {
526 | "version": "2.0.4",
527 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
528 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
529 | },
530 | "@protobufjs/eventemitter": {
531 | "version": "1.1.0",
532 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
533 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
534 | },
535 | "@protobufjs/fetch": {
536 | "version": "1.1.0",
537 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
538 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
539 | "requires": {
540 | "@protobufjs/aspromise": "^1.1.1",
541 | "@protobufjs/inquire": "^1.1.0"
542 | }
543 | },
544 | "@protobufjs/float": {
545 | "version": "1.0.2",
546 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
547 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
548 | },
549 | "@protobufjs/inquire": {
550 | "version": "1.1.0",
551 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
552 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
553 | },
554 | "@protobufjs/path": {
555 | "version": "1.1.2",
556 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
557 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
558 | },
559 | "@protobufjs/pool": {
560 | "version": "1.1.0",
561 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
562 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
563 | },
564 | "@protobufjs/utf8": {
565 | "version": "1.1.0",
566 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
567 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
568 | },
569 | "@types/long": {
570 | "version": "4.0.1",
571 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
572 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
573 | },
574 | "@types/mdast": {
575 | "version": "3.0.3",
576 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
577 | "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
578 | "requires": {
579 | "@types/unist": "*"
580 | }
581 | },
582 | "@types/node": {
583 | "version": "16.7.10",
584 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz",
585 | "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA=="
586 | },
587 | "@types/unist": {
588 | "version": "2.0.3",
589 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
590 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ=="
591 | },
592 | "acorn": {
593 | "version": "8.5.0",
594 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
595 | "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q=="
596 | },
597 | "anser": {
598 | "version": "1.4.9",
599 | "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz",
600 | "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA=="
601 | },
602 | "ansi-regex": {
603 | "version": "5.0.0",
604 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
605 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
606 | },
607 | "ansi-styles": {
608 | "version": "4.3.0",
609 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
610 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
611 | "requires": {
612 | "color-convert": "^2.0.1"
613 | }
614 | },
615 | "anymatch": {
616 | "version": "3.1.2",
617 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
618 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
619 | "requires": {
620 | "normalize-path": "^3.0.0",
621 | "picomatch": "^2.0.4"
622 | }
623 | },
624 | "asn1.js": {
625 | "version": "5.4.1",
626 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
627 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
628 | "requires": {
629 | "bn.js": "^4.0.0",
630 | "inherits": "^2.0.1",
631 | "minimalistic-assert": "^1.0.0",
632 | "safer-buffer": "^2.1.0"
633 | },
634 | "dependencies": {
635 | "bn.js": {
636 | "version": "4.12.0",
637 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
638 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
639 | }
640 | }
641 | },
642 | "assert": {
643 | "version": "2.0.0",
644 | "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
645 | "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
646 | "requires": {
647 | "es6-object-assign": "^1.1.0",
648 | "is-nan": "^1.2.1",
649 | "object-is": "^1.0.1",
650 | "util": "^0.12.0"
651 | }
652 | },
653 | "available-typed-arrays": {
654 | "version": "1.0.5",
655 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
656 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
657 | },
658 | "bail": {
659 | "version": "1.0.5",
660 | "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
661 | "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
662 | },
663 | "base64-js": {
664 | "version": "1.5.1",
665 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
666 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
667 | },
668 | "big.js": {
669 | "version": "5.2.2",
670 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
671 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
672 | },
673 | "binary-extensions": {
674 | "version": "2.2.0",
675 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
676 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
677 | },
678 | "bn.js": {
679 | "version": "5.2.0",
680 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
681 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
682 | },
683 | "braces": {
684 | "version": "3.0.2",
685 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
686 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
687 | "requires": {
688 | "fill-range": "^7.0.1"
689 | }
690 | },
691 | "brorand": {
692 | "version": "1.1.0",
693 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
694 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
695 | },
696 | "browserify-aes": {
697 | "version": "1.2.0",
698 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
699 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
700 | "requires": {
701 | "buffer-xor": "^1.0.3",
702 | "cipher-base": "^1.0.0",
703 | "create-hash": "^1.1.0",
704 | "evp_bytestokey": "^1.0.3",
705 | "inherits": "^2.0.1",
706 | "safe-buffer": "^5.0.1"
707 | }
708 | },
709 | "browserify-cipher": {
710 | "version": "1.0.1",
711 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
712 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
713 | "requires": {
714 | "browserify-aes": "^1.0.4",
715 | "browserify-des": "^1.0.0",
716 | "evp_bytestokey": "^1.0.0"
717 | }
718 | },
719 | "browserify-des": {
720 | "version": "1.0.2",
721 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
722 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
723 | "requires": {
724 | "cipher-base": "^1.0.1",
725 | "des.js": "^1.0.0",
726 | "inherits": "^2.0.1",
727 | "safe-buffer": "^5.1.2"
728 | }
729 | },
730 | "browserify-rsa": {
731 | "version": "4.1.0",
732 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
733 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
734 | "requires": {
735 | "bn.js": "^5.0.0",
736 | "randombytes": "^2.0.1"
737 | }
738 | },
739 | "browserify-sign": {
740 | "version": "4.2.1",
741 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
742 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
743 | "requires": {
744 | "bn.js": "^5.1.1",
745 | "browserify-rsa": "^4.0.1",
746 | "create-hash": "^1.2.0",
747 | "create-hmac": "^1.1.7",
748 | "elliptic": "^6.5.3",
749 | "inherits": "^2.0.4",
750 | "parse-asn1": "^5.1.5",
751 | "readable-stream": "^3.6.0",
752 | "safe-buffer": "^5.2.0"
753 | }
754 | },
755 | "browserify-zlib": {
756 | "version": "0.2.0",
757 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
758 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
759 | "requires": {
760 | "pako": "~1.0.5"
761 | }
762 | },
763 | "browserslist": {
764 | "version": "4.16.6",
765 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
766 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
767 | "requires": {
768 | "caniuse-lite": "^1.0.30001219",
769 | "colorette": "^1.2.2",
770 | "electron-to-chromium": "^1.3.723",
771 | "escalade": "^3.1.1",
772 | "node-releases": "^1.1.71"
773 | }
774 | },
775 | "buffer": {
776 | "version": "5.6.0",
777 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
778 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
779 | "requires": {
780 | "base64-js": "^1.0.2",
781 | "ieee754": "^1.1.4"
782 | }
783 | },
784 | "buffer-xor": {
785 | "version": "1.0.3",
786 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
787 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
788 | },
789 | "builtin-status-codes": {
790 | "version": "3.0.0",
791 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
792 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
793 | },
794 | "bytes": {
795 | "version": "3.1.0",
796 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
797 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
798 | },
799 | "call-bind": {
800 | "version": "1.0.2",
801 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
802 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
803 | "requires": {
804 | "function-bind": "^1.1.1",
805 | "get-intrinsic": "^1.0.2"
806 | }
807 | },
808 | "caniuse-lite": {
809 | "version": "1.0.30001271",
810 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz",
811 | "integrity": "sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA=="
812 | },
813 | "chalk": {
814 | "version": "2.4.2",
815 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
816 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
817 | "requires": {
818 | "ansi-styles": "^3.2.1",
819 | "escape-string-regexp": "^1.0.5",
820 | "supports-color": "^5.3.0"
821 | },
822 | "dependencies": {
823 | "ansi-styles": {
824 | "version": "3.2.1",
825 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
826 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
827 | "requires": {
828 | "color-convert": "^1.9.0"
829 | }
830 | },
831 | "color-convert": {
832 | "version": "1.9.3",
833 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
834 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
835 | "requires": {
836 | "color-name": "1.1.3"
837 | }
838 | },
839 | "color-name": {
840 | "version": "1.1.3",
841 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
842 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
843 | }
844 | }
845 | },
846 | "character-entities": {
847 | "version": "1.2.4",
848 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
849 | "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
850 | },
851 | "character-entities-legacy": {
852 | "version": "1.1.4",
853 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
854 | "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
855 | },
856 | "character-reference-invalid": {
857 | "version": "1.1.4",
858 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
859 | "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
860 | },
861 | "chokidar": {
862 | "version": "3.5.1",
863 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
864 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
865 | "requires": {
866 | "anymatch": "~3.1.1",
867 | "braces": "~3.0.2",
868 | "fsevents": "~2.3.1",
869 | "glob-parent": "~5.1.0",
870 | "is-binary-path": "~2.1.0",
871 | "is-glob": "~4.0.1",
872 | "normalize-path": "~3.0.0",
873 | "readdirp": "~3.5.0"
874 | }
875 | },
876 | "cipher-base": {
877 | "version": "1.0.4",
878 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
879 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
880 | "requires": {
881 | "inherits": "^2.0.1",
882 | "safe-buffer": "^5.0.1"
883 | }
884 | },
885 | "classnames": {
886 | "version": "2.2.6",
887 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
888 | "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
889 | },
890 | "cliui": {
891 | "version": "7.0.4",
892 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
893 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
894 | "requires": {
895 | "string-width": "^4.2.0",
896 | "strip-ansi": "^6.0.0",
897 | "wrap-ansi": "^7.0.0"
898 | }
899 | },
900 | "color-convert": {
901 | "version": "2.0.1",
902 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
903 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
904 | "requires": {
905 | "color-name": "~1.1.4"
906 | }
907 | },
908 | "color-name": {
909 | "version": "1.1.4",
910 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
911 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
912 | },
913 | "colorette": {
914 | "version": "1.4.0",
915 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
916 | "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
917 | },
918 | "commondir": {
919 | "version": "1.0.1",
920 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
921 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
922 | },
923 | "constants-browserify": {
924 | "version": "1.0.0",
925 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
926 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
927 | },
928 | "convert-source-map": {
929 | "version": "1.7.0",
930 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
931 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
932 | "requires": {
933 | "safe-buffer": "~5.1.1"
934 | },
935 | "dependencies": {
936 | "safe-buffer": {
937 | "version": "5.1.2",
938 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
939 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
940 | }
941 | }
942 | },
943 | "core-js": {
944 | "version": "3.6.5",
945 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
946 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
947 | },
948 | "create-ecdh": {
949 | "version": "4.0.4",
950 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
951 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
952 | "requires": {
953 | "bn.js": "^4.1.0",
954 | "elliptic": "^6.5.3"
955 | },
956 | "dependencies": {
957 | "bn.js": {
958 | "version": "4.12.0",
959 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
960 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
961 | }
962 | }
963 | },
964 | "create-hash": {
965 | "version": "1.2.0",
966 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
967 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
968 | "requires": {
969 | "cipher-base": "^1.0.1",
970 | "inherits": "^2.0.1",
971 | "md5.js": "^1.3.4",
972 | "ripemd160": "^2.0.1",
973 | "sha.js": "^2.4.0"
974 | }
975 | },
976 | "create-hmac": {
977 | "version": "1.1.7",
978 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
979 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
980 | "requires": {
981 | "cipher-base": "^1.0.3",
982 | "create-hash": "^1.1.0",
983 | "inherits": "^2.0.1",
984 | "ripemd160": "^2.0.0",
985 | "safe-buffer": "^5.0.1",
986 | "sha.js": "^2.4.8"
987 | }
988 | },
989 | "crypto-browserify": {
990 | "version": "3.12.0",
991 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
992 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
993 | "requires": {
994 | "browserify-cipher": "^1.0.0",
995 | "browserify-sign": "^4.0.0",
996 | "create-ecdh": "^4.0.0",
997 | "create-hash": "^1.1.0",
998 | "create-hmac": "^1.1.0",
999 | "diffie-hellman": "^5.0.0",
1000 | "inherits": "^2.0.1",
1001 | "pbkdf2": "^3.0.3",
1002 | "public-encrypt": "^4.0.0",
1003 | "randombytes": "^2.0.0",
1004 | "randomfill": "^1.0.3"
1005 | }
1006 | },
1007 | "css.escape": {
1008 | "version": "1.5.1",
1009 | "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
1010 | "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
1011 | },
1012 | "cssnano-preset-simple": {
1013 | "version": "3.0.0",
1014 | "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz",
1015 | "integrity": "sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==",
1016 | "requires": {
1017 | "caniuse-lite": "^1.0.30001202"
1018 | }
1019 | },
1020 | "cssnano-simple": {
1021 | "version": "3.0.0",
1022 | "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz",
1023 | "integrity": "sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==",
1024 | "requires": {
1025 | "cssnano-preset-simple": "^3.0.0"
1026 | }
1027 | },
1028 | "data-uri-to-buffer": {
1029 | "version": "3.0.1",
1030 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
1031 | "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
1032 | },
1033 | "debug": {
1034 | "version": "4.3.1",
1035 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
1036 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
1037 | "requires": {
1038 | "ms": "2.1.2"
1039 | }
1040 | },
1041 | "define-properties": {
1042 | "version": "1.1.3",
1043 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
1044 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
1045 | "requires": {
1046 | "object-keys": "^1.0.12"
1047 | }
1048 | },
1049 | "depd": {
1050 | "version": "1.1.2",
1051 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1052 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
1053 | },
1054 | "des.js": {
1055 | "version": "1.0.1",
1056 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
1057 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
1058 | "requires": {
1059 | "inherits": "^2.0.1",
1060 | "minimalistic-assert": "^1.0.0"
1061 | }
1062 | },
1063 | "diffie-hellman": {
1064 | "version": "5.0.3",
1065 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1066 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1067 | "requires": {
1068 | "bn.js": "^4.1.0",
1069 | "miller-rabin": "^4.0.0",
1070 | "randombytes": "^2.0.0"
1071 | },
1072 | "dependencies": {
1073 | "bn.js": {
1074 | "version": "4.12.0",
1075 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1076 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
1077 | }
1078 | }
1079 | },
1080 | "dom-serializer": {
1081 | "version": "1.1.0",
1082 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz",
1083 | "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==",
1084 | "requires": {
1085 | "domelementtype": "^2.0.1",
1086 | "domhandler": "^3.0.0",
1087 | "entities": "^2.0.0"
1088 | }
1089 | },
1090 | "dom-storage": {
1091 | "version": "2.1.0",
1092 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz",
1093 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q=="
1094 | },
1095 | "domain-browser": {
1096 | "version": "4.19.0",
1097 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz",
1098 | "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ=="
1099 | },
1100 | "domelementtype": {
1101 | "version": "2.1.0",
1102 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
1103 | "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w=="
1104 | },
1105 | "domhandler": {
1106 | "version": "3.3.0",
1107 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
1108 | "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
1109 | "requires": {
1110 | "domelementtype": "^2.0.1"
1111 | }
1112 | },
1113 | "domutils": {
1114 | "version": "2.4.2",
1115 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz",
1116 | "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==",
1117 | "requires": {
1118 | "dom-serializer": "^1.0.1",
1119 | "domelementtype": "^2.0.1",
1120 | "domhandler": "^3.3.0"
1121 | }
1122 | },
1123 | "electron-to-chromium": {
1124 | "version": "1.3.880",
1125 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.880.tgz",
1126 | "integrity": "sha512-iwIP/6WoeSimzUKJIQtjtpVDsK8Ir8qQCMXsUBwg+rxJR2Uh3wTNSbxoYRfs+3UWx/9MAnPIxVZCyWkm8MT0uw=="
1127 | },
1128 | "elliptic": {
1129 | "version": "6.5.4",
1130 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
1131 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
1132 | "requires": {
1133 | "bn.js": "^4.11.9",
1134 | "brorand": "^1.1.0",
1135 | "hash.js": "^1.0.0",
1136 | "hmac-drbg": "^1.0.1",
1137 | "inherits": "^2.0.4",
1138 | "minimalistic-assert": "^1.0.1",
1139 | "minimalistic-crypto-utils": "^1.0.1"
1140 | },
1141 | "dependencies": {
1142 | "bn.js": {
1143 | "version": "4.12.0",
1144 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1145 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
1146 | }
1147 | }
1148 | },
1149 | "emoji-regex": {
1150 | "version": "8.0.0",
1151 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1152 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
1153 | },
1154 | "emojis-list": {
1155 | "version": "2.1.0",
1156 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
1157 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
1158 | },
1159 | "encoding": {
1160 | "version": "0.1.13",
1161 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
1162 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
1163 | "requires": {
1164 | "iconv-lite": "^0.6.2"
1165 | }
1166 | },
1167 | "entities": {
1168 | "version": "2.1.0",
1169 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
1170 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
1171 | },
1172 | "es-abstract": {
1173 | "version": "1.19.1",
1174 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
1175 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
1176 | "requires": {
1177 | "call-bind": "^1.0.2",
1178 | "es-to-primitive": "^1.2.1",
1179 | "function-bind": "^1.1.1",
1180 | "get-intrinsic": "^1.1.1",
1181 | "get-symbol-description": "^1.0.0",
1182 | "has": "^1.0.3",
1183 | "has-symbols": "^1.0.2",
1184 | "internal-slot": "^1.0.3",
1185 | "is-callable": "^1.2.4",
1186 | "is-negative-zero": "^2.0.1",
1187 | "is-regex": "^1.1.4",
1188 | "is-shared-array-buffer": "^1.0.1",
1189 | "is-string": "^1.0.7",
1190 | "is-weakref": "^1.0.1",
1191 | "object-inspect": "^1.11.0",
1192 | "object-keys": "^1.1.1",
1193 | "object.assign": "^4.1.2",
1194 | "string.prototype.trimend": "^1.0.4",
1195 | "string.prototype.trimstart": "^1.0.4",
1196 | "unbox-primitive": "^1.0.1"
1197 | }
1198 | },
1199 | "es-to-primitive": {
1200 | "version": "1.2.1",
1201 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
1202 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
1203 | "requires": {
1204 | "is-callable": "^1.1.4",
1205 | "is-date-object": "^1.0.1",
1206 | "is-symbol": "^1.0.2"
1207 | }
1208 | },
1209 | "es6-object-assign": {
1210 | "version": "1.1.0",
1211 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
1212 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw="
1213 | },
1214 | "escalade": {
1215 | "version": "3.1.1",
1216 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
1217 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
1218 | },
1219 | "escape-string-regexp": {
1220 | "version": "1.0.5",
1221 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1222 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1223 | },
1224 | "etag": {
1225 | "version": "1.8.1",
1226 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1227 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
1228 | },
1229 | "events": {
1230 | "version": "3.3.0",
1231 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
1232 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
1233 | },
1234 | "evp_bytestokey": {
1235 | "version": "1.0.3",
1236 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1237 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1238 | "requires": {
1239 | "md5.js": "^1.3.4",
1240 | "safe-buffer": "^5.1.1"
1241 | }
1242 | },
1243 | "extend": {
1244 | "version": "3.0.2",
1245 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1246 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1247 | },
1248 | "faye-websocket": {
1249 | "version": "0.11.3",
1250 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
1251 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
1252 | "requires": {
1253 | "websocket-driver": ">=0.5.1"
1254 | }
1255 | },
1256 | "fill-range": {
1257 | "version": "7.0.1",
1258 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1259 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1260 | "requires": {
1261 | "to-regex-range": "^5.0.1"
1262 | }
1263 | },
1264 | "find-cache-dir": {
1265 | "version": "3.3.1",
1266 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
1267 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
1268 | "requires": {
1269 | "commondir": "^1.0.1",
1270 | "make-dir": "^3.0.2",
1271 | "pkg-dir": "^4.1.0"
1272 | }
1273 | },
1274 | "find-up": {
1275 | "version": "4.1.0",
1276 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1277 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1278 | "requires": {
1279 | "locate-path": "^5.0.0",
1280 | "path-exists": "^4.0.0"
1281 | }
1282 | },
1283 | "firebase": {
1284 | "version": "8.10.0",
1285 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-8.10.0.tgz",
1286 | "integrity": "sha512-GCABTbJdo88QgzX5OH/vsfKBWvTRbLUylGlYXtO7uYo1VErfGd2BWW9ATlJP5Gxx+ClDfyvVTvcs2rcNWn3uUA==",
1287 | "requires": {
1288 | "@firebase/analytics": "0.6.18",
1289 | "@firebase/app": "0.6.30",
1290 | "@firebase/app-check": "0.3.2",
1291 | "@firebase/app-types": "0.6.3",
1292 | "@firebase/auth": "0.16.8",
1293 | "@firebase/database": "0.11.0",
1294 | "@firebase/firestore": "2.4.0",
1295 | "@firebase/functions": "0.6.15",
1296 | "@firebase/installations": "0.4.32",
1297 | "@firebase/messaging": "0.8.0",
1298 | "@firebase/performance": "0.4.18",
1299 | "@firebase/polyfill": "0.3.36",
1300 | "@firebase/remote-config": "0.1.43",
1301 | "@firebase/storage": "0.7.0",
1302 | "@firebase/util": "1.3.0"
1303 | }
1304 | },
1305 | "foreach": {
1306 | "version": "2.0.5",
1307 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1308 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
1309 | },
1310 | "fsevents": {
1311 | "version": "2.3.2",
1312 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1313 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1314 | "optional": true
1315 | },
1316 | "function-bind": {
1317 | "version": "1.1.1",
1318 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1319 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1320 | },
1321 | "get-caller-file": {
1322 | "version": "2.0.5",
1323 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1324 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
1325 | },
1326 | "get-intrinsic": {
1327 | "version": "1.1.1",
1328 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
1329 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
1330 | "requires": {
1331 | "function-bind": "^1.1.1",
1332 | "has": "^1.0.3",
1333 | "has-symbols": "^1.0.1"
1334 | }
1335 | },
1336 | "get-orientation": {
1337 | "version": "1.1.2",
1338 | "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz",
1339 | "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==",
1340 | "requires": {
1341 | "stream-parser": "^0.3.1"
1342 | }
1343 | },
1344 | "get-symbol-description": {
1345 | "version": "1.0.0",
1346 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
1347 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
1348 | "requires": {
1349 | "call-bind": "^1.0.2",
1350 | "get-intrinsic": "^1.1.1"
1351 | }
1352 | },
1353 | "glob-parent": {
1354 | "version": "5.1.2",
1355 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1356 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1357 | "requires": {
1358 | "is-glob": "^4.0.1"
1359 | }
1360 | },
1361 | "glob-to-regexp": {
1362 | "version": "0.4.1",
1363 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
1364 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
1365 | },
1366 | "goober": {
1367 | "version": "2.0.28",
1368 | "resolved": "https://registry.npmjs.org/goober/-/goober-2.0.28.tgz",
1369 | "integrity": "sha512-chb/2a0PiCW0isKEfO2FWa++SON4hrUANY5G/evhkuBk1M4k3ehm3JilctICB5AiPYbRlE+b0qFGzfDJW7z3Jw=="
1370 | },
1371 | "graceful-fs": {
1372 | "version": "4.2.8",
1373 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
1374 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
1375 | },
1376 | "has": {
1377 | "version": "1.0.3",
1378 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1379 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1380 | "requires": {
1381 | "function-bind": "^1.1.1"
1382 | }
1383 | },
1384 | "has-bigints": {
1385 | "version": "1.0.1",
1386 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
1387 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
1388 | },
1389 | "has-flag": {
1390 | "version": "3.0.0",
1391 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1392 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
1393 | },
1394 | "has-symbols": {
1395 | "version": "1.0.2",
1396 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
1397 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
1398 | },
1399 | "has-tostringtag": {
1400 | "version": "1.0.0",
1401 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
1402 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
1403 | "requires": {
1404 | "has-symbols": "^1.0.2"
1405 | }
1406 | },
1407 | "hash-base": {
1408 | "version": "3.1.0",
1409 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
1410 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
1411 | "requires": {
1412 | "inherits": "^2.0.4",
1413 | "readable-stream": "^3.6.0",
1414 | "safe-buffer": "^5.2.0"
1415 | }
1416 | },
1417 | "hash.js": {
1418 | "version": "1.1.7",
1419 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
1420 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
1421 | "requires": {
1422 | "inherits": "^2.0.3",
1423 | "minimalistic-assert": "^1.0.1"
1424 | }
1425 | },
1426 | "he": {
1427 | "version": "1.2.0",
1428 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1429 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
1430 | },
1431 | "hmac-drbg": {
1432 | "version": "1.0.1",
1433 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
1434 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
1435 | "requires": {
1436 | "hash.js": "^1.0.3",
1437 | "minimalistic-assert": "^1.0.0",
1438 | "minimalistic-crypto-utils": "^1.0.1"
1439 | }
1440 | },
1441 | "html-to-react": {
1442 | "version": "1.4.5",
1443 | "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.5.tgz",
1444 | "integrity": "sha512-KONZUDFPg5OodWaQu2ymfkDmU0JA7zB1iPfvyHehTmMUZnk0DS7/TyCMTzsLH6b4BvxX15g88qZCXFhJWktsmA==",
1445 | "requires": {
1446 | "domhandler": "^3.3.0",
1447 | "htmlparser2": "^5.0",
1448 | "lodash.camelcase": "^4.3.0",
1449 | "ramda": "^0.27.1"
1450 | }
1451 | },
1452 | "htmlparser2": {
1453 | "version": "5.0.1",
1454 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz",
1455 | "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==",
1456 | "requires": {
1457 | "domelementtype": "^2.0.1",
1458 | "domhandler": "^3.3.0",
1459 | "domutils": "^2.4.2",
1460 | "entities": "^2.0.0"
1461 | }
1462 | },
1463 | "http-errors": {
1464 | "version": "1.7.3",
1465 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
1466 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
1467 | "requires": {
1468 | "depd": "~1.1.2",
1469 | "inherits": "2.0.4",
1470 | "setprototypeof": "1.1.1",
1471 | "statuses": ">= 1.5.0 < 2",
1472 | "toidentifier": "1.0.0"
1473 | }
1474 | },
1475 | "http-parser-js": {
1476 | "version": "0.5.3",
1477 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
1478 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg=="
1479 | },
1480 | "https-browserify": {
1481 | "version": "1.0.0",
1482 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
1483 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
1484 | },
1485 | "iconv-lite": {
1486 | "version": "0.6.3",
1487 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
1488 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
1489 | "requires": {
1490 | "safer-buffer": ">= 2.1.2 < 3.0.0"
1491 | }
1492 | },
1493 | "idb": {
1494 | "version": "3.0.2",
1495 | "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz",
1496 | "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw=="
1497 | },
1498 | "ieee754": {
1499 | "version": "1.2.1",
1500 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1501 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
1502 | },
1503 | "image-size": {
1504 | "version": "1.0.0",
1505 | "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
1506 | "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
1507 | "requires": {
1508 | "queue": "6.0.2"
1509 | }
1510 | },
1511 | "inherits": {
1512 | "version": "2.0.4",
1513 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1514 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1515 | },
1516 | "internal-slot": {
1517 | "version": "1.0.3",
1518 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
1519 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
1520 | "requires": {
1521 | "get-intrinsic": "^1.1.0",
1522 | "has": "^1.0.3",
1523 | "side-channel": "^1.0.4"
1524 | }
1525 | },
1526 | "is-alphabetical": {
1527 | "version": "1.0.4",
1528 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
1529 | "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
1530 | },
1531 | "is-alphanumerical": {
1532 | "version": "1.0.4",
1533 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
1534 | "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
1535 | "requires": {
1536 | "is-alphabetical": "^1.0.0",
1537 | "is-decimal": "^1.0.0"
1538 | }
1539 | },
1540 | "is-arguments": {
1541 | "version": "1.1.1",
1542 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
1543 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
1544 | "requires": {
1545 | "call-bind": "^1.0.2",
1546 | "has-tostringtag": "^1.0.0"
1547 | }
1548 | },
1549 | "is-bigint": {
1550 | "version": "1.0.4",
1551 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
1552 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
1553 | "requires": {
1554 | "has-bigints": "^1.0.1"
1555 | }
1556 | },
1557 | "is-binary-path": {
1558 | "version": "2.1.0",
1559 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1560 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1561 | "requires": {
1562 | "binary-extensions": "^2.0.0"
1563 | }
1564 | },
1565 | "is-boolean-object": {
1566 | "version": "1.1.2",
1567 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
1568 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
1569 | "requires": {
1570 | "call-bind": "^1.0.2",
1571 | "has-tostringtag": "^1.0.0"
1572 | }
1573 | },
1574 | "is-callable": {
1575 | "version": "1.2.4",
1576 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
1577 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
1578 | },
1579 | "is-date-object": {
1580 | "version": "1.0.5",
1581 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
1582 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
1583 | "requires": {
1584 | "has-tostringtag": "^1.0.0"
1585 | }
1586 | },
1587 | "is-decimal": {
1588 | "version": "1.0.4",
1589 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
1590 | "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
1591 | },
1592 | "is-extglob": {
1593 | "version": "2.1.1",
1594 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1595 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
1596 | },
1597 | "is-fullwidth-code-point": {
1598 | "version": "3.0.0",
1599 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1600 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
1601 | },
1602 | "is-generator-function": {
1603 | "version": "1.0.10",
1604 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
1605 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
1606 | "requires": {
1607 | "has-tostringtag": "^1.0.0"
1608 | }
1609 | },
1610 | "is-glob": {
1611 | "version": "4.0.3",
1612 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1613 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1614 | "requires": {
1615 | "is-extglob": "^2.1.1"
1616 | }
1617 | },
1618 | "is-hexadecimal": {
1619 | "version": "1.0.4",
1620 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
1621 | "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
1622 | },
1623 | "is-nan": {
1624 | "version": "1.3.2",
1625 | "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
1626 | "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
1627 | "requires": {
1628 | "call-bind": "^1.0.0",
1629 | "define-properties": "^1.1.3"
1630 | }
1631 | },
1632 | "is-negative-zero": {
1633 | "version": "2.0.1",
1634 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
1635 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
1636 | },
1637 | "is-number": {
1638 | "version": "7.0.0",
1639 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1640 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
1641 | },
1642 | "is-number-object": {
1643 | "version": "1.0.6",
1644 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
1645 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
1646 | "requires": {
1647 | "has-tostringtag": "^1.0.0"
1648 | }
1649 | },
1650 | "is-plain-obj": {
1651 | "version": "2.1.0",
1652 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
1653 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
1654 | },
1655 | "is-regex": {
1656 | "version": "1.1.4",
1657 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
1658 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
1659 | "requires": {
1660 | "call-bind": "^1.0.2",
1661 | "has-tostringtag": "^1.0.0"
1662 | }
1663 | },
1664 | "is-shared-array-buffer": {
1665 | "version": "1.0.1",
1666 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
1667 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
1668 | },
1669 | "is-string": {
1670 | "version": "1.0.7",
1671 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
1672 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
1673 | "requires": {
1674 | "has-tostringtag": "^1.0.0"
1675 | }
1676 | },
1677 | "is-symbol": {
1678 | "version": "1.0.4",
1679 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
1680 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
1681 | "requires": {
1682 | "has-symbols": "^1.0.2"
1683 | }
1684 | },
1685 | "is-typed-array": {
1686 | "version": "1.1.8",
1687 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
1688 | "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
1689 | "requires": {
1690 | "available-typed-arrays": "^1.0.5",
1691 | "call-bind": "^1.0.2",
1692 | "es-abstract": "^1.18.5",
1693 | "foreach": "^2.0.5",
1694 | "has-tostringtag": "^1.0.0"
1695 | }
1696 | },
1697 | "is-weakref": {
1698 | "version": "1.0.1",
1699 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
1700 | "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
1701 | "requires": {
1702 | "call-bind": "^1.0.0"
1703 | }
1704 | },
1705 | "jest-worker": {
1706 | "version": "27.0.0-next.5",
1707 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz",
1708 | "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==",
1709 | "requires": {
1710 | "@types/node": "*",
1711 | "merge-stream": "^2.0.0",
1712 | "supports-color": "^8.0.0"
1713 | },
1714 | "dependencies": {
1715 | "has-flag": {
1716 | "version": "4.0.0",
1717 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1718 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
1719 | },
1720 | "supports-color": {
1721 | "version": "8.1.1",
1722 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1723 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1724 | "requires": {
1725 | "has-flag": "^4.0.0"
1726 | }
1727 | }
1728 | }
1729 | },
1730 | "js-tokens": {
1731 | "version": "4.0.0",
1732 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1733 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1734 | },
1735 | "json5": {
1736 | "version": "1.0.1",
1737 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
1738 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
1739 | "requires": {
1740 | "minimist": "^1.2.0"
1741 | }
1742 | },
1743 | "loader-utils": {
1744 | "version": "1.2.3",
1745 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
1746 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
1747 | "requires": {
1748 | "big.js": "^5.2.2",
1749 | "emojis-list": "^2.0.0",
1750 | "json5": "^1.0.1"
1751 | }
1752 | },
1753 | "locate-path": {
1754 | "version": "5.0.0",
1755 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1756 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1757 | "requires": {
1758 | "p-locate": "^4.1.0"
1759 | }
1760 | },
1761 | "lodash.camelcase": {
1762 | "version": "4.3.0",
1763 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
1764 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
1765 | },
1766 | "lodash.debounce": {
1767 | "version": "4.0.8",
1768 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
1769 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
1770 | },
1771 | "lodash.kebabcase": {
1772 | "version": "4.1.1",
1773 | "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
1774 | "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY="
1775 | },
1776 | "lodash.sortby": {
1777 | "version": "4.7.0",
1778 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
1779 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
1780 | },
1781 | "long": {
1782 | "version": "4.0.0",
1783 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1784 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
1785 | },
1786 | "loose-envify": {
1787 | "version": "1.4.0",
1788 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1789 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1790 | "requires": {
1791 | "js-tokens": "^3.0.0 || ^4.0.0"
1792 | }
1793 | },
1794 | "make-dir": {
1795 | "version": "3.1.0",
1796 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1797 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1798 | "requires": {
1799 | "semver": "^6.0.0"
1800 | }
1801 | },
1802 | "md5.js": {
1803 | "version": "1.3.5",
1804 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
1805 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
1806 | "requires": {
1807 | "hash-base": "^3.0.0",
1808 | "inherits": "^2.0.1",
1809 | "safe-buffer": "^5.1.2"
1810 | }
1811 | },
1812 | "mdast-add-list-metadata": {
1813 | "version": "1.0.1",
1814 | "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz",
1815 | "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==",
1816 | "requires": {
1817 | "unist-util-visit-parents": "1.1.2"
1818 | }
1819 | },
1820 | "mdast-util-from-markdown": {
1821 | "version": "0.8.4",
1822 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz",
1823 | "integrity": "sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw==",
1824 | "requires": {
1825 | "@types/mdast": "^3.0.0",
1826 | "mdast-util-to-string": "^2.0.0",
1827 | "micromark": "~2.11.0",
1828 | "parse-entities": "^2.0.0",
1829 | "unist-util-stringify-position": "^2.0.0"
1830 | }
1831 | },
1832 | "mdast-util-to-string": {
1833 | "version": "2.0.0",
1834 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
1835 | "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w=="
1836 | },
1837 | "merge-stream": {
1838 | "version": "2.0.0",
1839 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1840 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
1841 | },
1842 | "micromark": {
1843 | "version": "2.11.2",
1844 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.2.tgz",
1845 | "integrity": "sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ==",
1846 | "requires": {
1847 | "debug": "^4.0.0",
1848 | "parse-entities": "^2.0.0"
1849 | }
1850 | },
1851 | "miller-rabin": {
1852 | "version": "4.0.1",
1853 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
1854 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
1855 | "requires": {
1856 | "bn.js": "^4.0.0",
1857 | "brorand": "^1.0.1"
1858 | },
1859 | "dependencies": {
1860 | "bn.js": {
1861 | "version": "4.12.0",
1862 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1863 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
1864 | }
1865 | }
1866 | },
1867 | "minimalistic-assert": {
1868 | "version": "1.0.1",
1869 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
1870 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
1871 | },
1872 | "minimalistic-crypto-utils": {
1873 | "version": "1.0.1",
1874 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
1875 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
1876 | },
1877 | "minimist": {
1878 | "version": "1.2.5",
1879 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1880 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1881 | },
1882 | "ms": {
1883 | "version": "2.1.2",
1884 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1885 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1886 | },
1887 | "nanoid": {
1888 | "version": "3.1.30",
1889 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
1890 | "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ=="
1891 | },
1892 | "neo-async": {
1893 | "version": "2.6.2",
1894 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
1895 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
1896 | },
1897 | "next": {
1898 | "version": "12.0.1",
1899 | "resolved": "https://registry.npmjs.org/next/-/next-12.0.1.tgz",
1900 | "integrity": "sha512-4MNXAbD9+Tmtejg0TOKbaP52Cgu4mIn2ejKMLHWV0acxWGkkcE7QvdZwvg5pkg3fQBMrgucOxxtmw4D7yWaZvg==",
1901 | "requires": {
1902 | "@babel/runtime": "7.15.4",
1903 | "@hapi/accept": "5.0.2",
1904 | "@next/env": "12.0.1",
1905 | "@next/polyfill-module": "12.0.1",
1906 | "@next/react-dev-overlay": "12.0.1",
1907 | "@next/react-refresh-utils": "12.0.1",
1908 | "@next/swc-android-arm64": "12.0.1",
1909 | "@next/swc-darwin-arm64": "12.0.1",
1910 | "@next/swc-darwin-x64": "12.0.1",
1911 | "@next/swc-linux-arm-gnueabihf": "12.0.1",
1912 | "@next/swc-linux-arm64-gnu": "12.0.1",
1913 | "@next/swc-linux-arm64-musl": "12.0.1",
1914 | "@next/swc-linux-x64-gnu": "12.0.1",
1915 | "@next/swc-linux-x64-musl": "12.0.1",
1916 | "@next/swc-win32-arm64-msvc": "12.0.1",
1917 | "@next/swc-win32-ia32-msvc": "12.0.1",
1918 | "@next/swc-win32-x64-msvc": "12.0.1",
1919 | "@node-rs/helper": "1.2.1",
1920 | "acorn": "8.5.0",
1921 | "assert": "2.0.0",
1922 | "browserify-zlib": "0.2.0",
1923 | "browserslist": "4.16.6",
1924 | "buffer": "5.6.0",
1925 | "caniuse-lite": "^1.0.30001228",
1926 | "chalk": "2.4.2",
1927 | "chokidar": "3.5.1",
1928 | "constants-browserify": "1.0.0",
1929 | "crypto-browserify": "3.12.0",
1930 | "cssnano-simple": "3.0.0",
1931 | "domain-browser": "4.19.0",
1932 | "encoding": "0.1.13",
1933 | "etag": "1.8.1",
1934 | "events": "3.3.0",
1935 | "find-cache-dir": "3.3.1",
1936 | "get-orientation": "1.1.2",
1937 | "https-browserify": "1.0.0",
1938 | "image-size": "1.0.0",
1939 | "jest-worker": "27.0.0-next.5",
1940 | "node-fetch": "2.6.1",
1941 | "node-html-parser": "1.4.9",
1942 | "os-browserify": "0.3.0",
1943 | "p-limit": "3.1.0",
1944 | "path-browserify": "1.0.1",
1945 | "postcss": "8.2.15",
1946 | "process": "0.11.10",
1947 | "querystring-es3": "0.2.1",
1948 | "raw-body": "2.4.1",
1949 | "react-is": "17.0.2",
1950 | "react-refresh": "0.8.3",
1951 | "react-server-dom-webpack": "0.0.0-experimental-3c4c1c470-20211021",
1952 | "regenerator-runtime": "0.13.4",
1953 | "stream-browserify": "3.0.0",
1954 | "stream-http": "3.1.1",
1955 | "string_decoder": "1.3.0",
1956 | "styled-jsx": "5.0.0-beta.3",
1957 | "timers-browserify": "2.0.12",
1958 | "tty-browserify": "0.0.1",
1959 | "use-subscription": "1.5.1",
1960 | "util": "0.12.4",
1961 | "vm-browserify": "1.1.2",
1962 | "watchpack": "2.1.1",
1963 | "web-streams-polyfill": "3.0.3"
1964 | },
1965 | "dependencies": {
1966 | "react-is": {
1967 | "version": "17.0.2",
1968 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
1969 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
1970 | }
1971 | }
1972 | },
1973 | "node-fetch": {
1974 | "version": "2.6.1",
1975 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1976 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
1977 | },
1978 | "node-html-parser": {
1979 | "version": "1.4.9",
1980 | "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz",
1981 | "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==",
1982 | "requires": {
1983 | "he": "1.2.0"
1984 | }
1985 | },
1986 | "node-releases": {
1987 | "version": "1.1.77",
1988 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
1989 | "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ=="
1990 | },
1991 | "normalize-path": {
1992 | "version": "3.0.0",
1993 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1994 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
1995 | },
1996 | "object-assign": {
1997 | "version": "4.1.1",
1998 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1999 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
2000 | },
2001 | "object-inspect": {
2002 | "version": "1.11.0",
2003 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
2004 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
2005 | },
2006 | "object-is": {
2007 | "version": "1.1.5",
2008 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
2009 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
2010 | "requires": {
2011 | "call-bind": "^1.0.2",
2012 | "define-properties": "^1.1.3"
2013 | }
2014 | },
2015 | "object-keys": {
2016 | "version": "1.1.1",
2017 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
2018 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
2019 | },
2020 | "object.assign": {
2021 | "version": "4.1.2",
2022 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
2023 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
2024 | "requires": {
2025 | "call-bind": "^1.0.0",
2026 | "define-properties": "^1.1.3",
2027 | "has-symbols": "^1.0.1",
2028 | "object-keys": "^1.1.1"
2029 | }
2030 | },
2031 | "os-browserify": {
2032 | "version": "0.3.0",
2033 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
2034 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
2035 | },
2036 | "p-limit": {
2037 | "version": "3.1.0",
2038 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2039 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2040 | "requires": {
2041 | "yocto-queue": "^0.1.0"
2042 | }
2043 | },
2044 | "p-locate": {
2045 | "version": "4.1.0",
2046 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
2047 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
2048 | "requires": {
2049 | "p-limit": "^2.2.0"
2050 | },
2051 | "dependencies": {
2052 | "p-limit": {
2053 | "version": "2.3.0",
2054 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2055 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2056 | "requires": {
2057 | "p-try": "^2.0.0"
2058 | }
2059 | }
2060 | }
2061 | },
2062 | "p-try": {
2063 | "version": "2.2.0",
2064 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
2065 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
2066 | },
2067 | "pako": {
2068 | "version": "1.0.11",
2069 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
2070 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
2071 | },
2072 | "parse-asn1": {
2073 | "version": "5.1.6",
2074 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
2075 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
2076 | "requires": {
2077 | "asn1.js": "^5.2.0",
2078 | "browserify-aes": "^1.0.0",
2079 | "evp_bytestokey": "^1.0.0",
2080 | "pbkdf2": "^3.0.3",
2081 | "safe-buffer": "^5.1.1"
2082 | }
2083 | },
2084 | "parse-entities": {
2085 | "version": "2.0.0",
2086 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
2087 | "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
2088 | "requires": {
2089 | "character-entities": "^1.0.0",
2090 | "character-entities-legacy": "^1.0.0",
2091 | "character-reference-invalid": "^1.0.0",
2092 | "is-alphanumerical": "^1.0.0",
2093 | "is-decimal": "^1.0.0",
2094 | "is-hexadecimal": "^1.0.0"
2095 | }
2096 | },
2097 | "path-browserify": {
2098 | "version": "1.0.1",
2099 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
2100 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
2101 | },
2102 | "path-exists": {
2103 | "version": "4.0.0",
2104 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2105 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
2106 | },
2107 | "pbkdf2": {
2108 | "version": "3.1.2",
2109 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
2110 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
2111 | "requires": {
2112 | "create-hash": "^1.1.2",
2113 | "create-hmac": "^1.1.4",
2114 | "ripemd160": "^2.0.1",
2115 | "safe-buffer": "^5.0.1",
2116 | "sha.js": "^2.4.8"
2117 | }
2118 | },
2119 | "picomatch": {
2120 | "version": "2.3.0",
2121 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
2122 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
2123 | },
2124 | "pkg-dir": {
2125 | "version": "4.2.0",
2126 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
2127 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
2128 | "requires": {
2129 | "find-up": "^4.0.0"
2130 | }
2131 | },
2132 | "platform": {
2133 | "version": "1.3.6",
2134 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
2135 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
2136 | },
2137 | "postcss": {
2138 | "version": "8.2.15",
2139 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz",
2140 | "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==",
2141 | "requires": {
2142 | "colorette": "^1.2.2",
2143 | "nanoid": "^3.1.23",
2144 | "source-map": "^0.6.1"
2145 | },
2146 | "dependencies": {
2147 | "source-map": {
2148 | "version": "0.6.1",
2149 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2150 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
2151 | }
2152 | }
2153 | },
2154 | "process": {
2155 | "version": "0.11.10",
2156 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2157 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
2158 | },
2159 | "promise-polyfill": {
2160 | "version": "8.1.3",
2161 | "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz",
2162 | "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g=="
2163 | },
2164 | "prop-types": {
2165 | "version": "15.7.2",
2166 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
2167 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
2168 | "requires": {
2169 | "loose-envify": "^1.4.0",
2170 | "object-assign": "^4.1.1",
2171 | "react-is": "^16.8.1"
2172 | }
2173 | },
2174 | "protobufjs": {
2175 | "version": "6.11.2",
2176 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz",
2177 | "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==",
2178 | "requires": {
2179 | "@protobufjs/aspromise": "^1.1.2",
2180 | "@protobufjs/base64": "^1.1.2",
2181 | "@protobufjs/codegen": "^2.0.4",
2182 | "@protobufjs/eventemitter": "^1.1.0",
2183 | "@protobufjs/fetch": "^1.1.0",
2184 | "@protobufjs/float": "^1.0.2",
2185 | "@protobufjs/inquire": "^1.1.0",
2186 | "@protobufjs/path": "^1.1.2",
2187 | "@protobufjs/pool": "^1.1.0",
2188 | "@protobufjs/utf8": "^1.1.0",
2189 | "@types/long": "^4.0.1",
2190 | "@types/node": ">=13.7.0",
2191 | "long": "^4.0.0"
2192 | }
2193 | },
2194 | "public-encrypt": {
2195 | "version": "4.0.3",
2196 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
2197 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
2198 | "requires": {
2199 | "bn.js": "^4.1.0",
2200 | "browserify-rsa": "^4.0.0",
2201 | "create-hash": "^1.1.0",
2202 | "parse-asn1": "^5.0.0",
2203 | "randombytes": "^2.0.1",
2204 | "safe-buffer": "^5.1.2"
2205 | },
2206 | "dependencies": {
2207 | "bn.js": {
2208 | "version": "4.12.0",
2209 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
2210 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
2211 | }
2212 | }
2213 | },
2214 | "punycode": {
2215 | "version": "2.1.1",
2216 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2217 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
2218 | },
2219 | "querystring-es3": {
2220 | "version": "0.2.1",
2221 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
2222 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
2223 | },
2224 | "queue": {
2225 | "version": "6.0.2",
2226 | "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
2227 | "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
2228 | "requires": {
2229 | "inherits": "~2.0.3"
2230 | }
2231 | },
2232 | "ramda": {
2233 | "version": "0.27.1",
2234 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
2235 | "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="
2236 | },
2237 | "randombytes": {
2238 | "version": "2.1.0",
2239 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2240 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2241 | "requires": {
2242 | "safe-buffer": "^5.1.0"
2243 | }
2244 | },
2245 | "randomfill": {
2246 | "version": "1.0.4",
2247 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
2248 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
2249 | "requires": {
2250 | "randombytes": "^2.0.5",
2251 | "safe-buffer": "^5.1.0"
2252 | }
2253 | },
2254 | "raw-body": {
2255 | "version": "2.4.1",
2256 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
2257 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
2258 | "requires": {
2259 | "bytes": "3.1.0",
2260 | "http-errors": "1.7.3",
2261 | "iconv-lite": "0.4.24",
2262 | "unpipe": "1.0.0"
2263 | },
2264 | "dependencies": {
2265 | "iconv-lite": {
2266 | "version": "0.4.24",
2267 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
2268 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
2269 | "requires": {
2270 | "safer-buffer": ">= 2.1.2 < 3"
2271 | }
2272 | }
2273 | }
2274 | },
2275 | "react": {
2276 | "version": "17.0.1",
2277 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz",
2278 | "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==",
2279 | "requires": {
2280 | "loose-envify": "^1.1.0",
2281 | "object-assign": "^4.1.1"
2282 | }
2283 | },
2284 | "react-dom": {
2285 | "version": "17.0.1",
2286 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz",
2287 | "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==",
2288 | "requires": {
2289 | "loose-envify": "^1.1.0",
2290 | "object-assign": "^4.1.1",
2291 | "scheduler": "^0.20.1"
2292 | }
2293 | },
2294 | "react-firebase-hooks": {
2295 | "version": "2.2.0",
2296 | "resolved": "https://registry.npmjs.org/react-firebase-hooks/-/react-firebase-hooks-2.2.0.tgz",
2297 | "integrity": "sha512-bwBaCYa8M+bpTqD0masAPGDTzxiTkGbyxv363hyR+NeNH1HbezPll6G7aMIGl+7OOYRPzfdmpkk72zc3VgXfEw=="
2298 | },
2299 | "react-hook-form": {
2300 | "version": "6.14.2",
2301 | "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-6.14.2.tgz",
2302 | "integrity": "sha512-GgDUuT3Yfhl1BOcMl862uAFbCixSomtm3CVlQQ1qVu9Tq5BN2uUIRUIXP8l2Gy99eLUrBqU9x4E7N+si9cnvaw=="
2303 | },
2304 | "react-hot-toast": {
2305 | "version": "1.0.2",
2306 | "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-1.0.2.tgz",
2307 | "integrity": "sha512-wp89H0WA6EtiexAg5l3ys+WaZ3u0xM/FJWxl6YxR3hlquWhKvO9snBgTe4ATPEcgbS6pbc43RbuBINOkYOzA5A==",
2308 | "requires": {
2309 | "goober": "^2.0.15"
2310 | }
2311 | },
2312 | "react-is": {
2313 | "version": "16.13.1",
2314 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2315 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
2316 | },
2317 | "react-markdown": {
2318 | "version": "5.0.3",
2319 | "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz",
2320 | "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==",
2321 | "requires": {
2322 | "@types/mdast": "^3.0.3",
2323 | "@types/unist": "^2.0.3",
2324 | "html-to-react": "^1.3.4",
2325 | "mdast-add-list-metadata": "1.0.1",
2326 | "prop-types": "^15.7.2",
2327 | "react-is": "^16.8.6",
2328 | "remark-parse": "^9.0.0",
2329 | "unified": "^9.0.0",
2330 | "unist-util-visit": "^2.0.0",
2331 | "xtend": "^4.0.1"
2332 | }
2333 | },
2334 | "react-refresh": {
2335 | "version": "0.8.3",
2336 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
2337 | "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
2338 | },
2339 | "react-server-dom-webpack": {
2340 | "version": "0.0.0-experimental-3c4c1c470-20211021",
2341 | "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-0.0.0-experimental-3c4c1c470-20211021.tgz",
2342 | "integrity": "sha512-YyRlED5kR0C2aQ3IJ/8BR2TELt51RcDZhnUDKz+m/HU+Gb/qak0CZkG0A8Zxffom9VI6HFkUj1dRFZqm0Lh9Pg==",
2343 | "requires": {
2344 | "acorn": "^6.2.1",
2345 | "loose-envify": "^1.1.0",
2346 | "neo-async": "^2.6.1",
2347 | "object-assign": "^4.1.1"
2348 | },
2349 | "dependencies": {
2350 | "acorn": {
2351 | "version": "6.4.2",
2352 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
2353 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="
2354 | }
2355 | }
2356 | },
2357 | "readable-stream": {
2358 | "version": "3.6.0",
2359 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
2360 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
2361 | "requires": {
2362 | "inherits": "^2.0.3",
2363 | "string_decoder": "^1.1.1",
2364 | "util-deprecate": "^1.0.1"
2365 | }
2366 | },
2367 | "readdirp": {
2368 | "version": "3.5.0",
2369 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
2370 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
2371 | "requires": {
2372 | "picomatch": "^2.2.1"
2373 | }
2374 | },
2375 | "regenerator-runtime": {
2376 | "version": "0.13.4",
2377 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz",
2378 | "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g=="
2379 | },
2380 | "remark-parse": {
2381 | "version": "9.0.0",
2382 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
2383 | "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
2384 | "requires": {
2385 | "mdast-util-from-markdown": "^0.8.0"
2386 | }
2387 | },
2388 | "require-directory": {
2389 | "version": "2.1.1",
2390 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2391 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
2392 | },
2393 | "ripemd160": {
2394 | "version": "2.0.2",
2395 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
2396 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
2397 | "requires": {
2398 | "hash-base": "^3.0.0",
2399 | "inherits": "^2.0.1"
2400 | }
2401 | },
2402 | "safe-buffer": {
2403 | "version": "5.2.1",
2404 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2405 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
2406 | },
2407 | "safer-buffer": {
2408 | "version": "2.1.2",
2409 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2410 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
2411 | },
2412 | "scheduler": {
2413 | "version": "0.20.1",
2414 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz",
2415 | "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==",
2416 | "requires": {
2417 | "loose-envify": "^1.1.0",
2418 | "object-assign": "^4.1.1"
2419 | }
2420 | },
2421 | "semver": {
2422 | "version": "6.3.0",
2423 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2424 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
2425 | },
2426 | "setimmediate": {
2427 | "version": "1.0.5",
2428 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
2429 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
2430 | },
2431 | "setprototypeof": {
2432 | "version": "1.1.1",
2433 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
2434 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
2435 | },
2436 | "sha.js": {
2437 | "version": "2.4.11",
2438 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
2439 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
2440 | "requires": {
2441 | "inherits": "^2.0.1",
2442 | "safe-buffer": "^5.0.1"
2443 | }
2444 | },
2445 | "shell-quote": {
2446 | "version": "1.7.2",
2447 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
2448 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
2449 | },
2450 | "side-channel": {
2451 | "version": "1.0.4",
2452 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
2453 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
2454 | "requires": {
2455 | "call-bind": "^1.0.0",
2456 | "get-intrinsic": "^1.0.2",
2457 | "object-inspect": "^1.9.0"
2458 | }
2459 | },
2460 | "source-map": {
2461 | "version": "0.8.0-beta.0",
2462 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
2463 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
2464 | "requires": {
2465 | "whatwg-url": "^7.0.0"
2466 | }
2467 | },
2468 | "stacktrace-parser": {
2469 | "version": "0.1.10",
2470 | "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
2471 | "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
2472 | "requires": {
2473 | "type-fest": "^0.7.1"
2474 | }
2475 | },
2476 | "statuses": {
2477 | "version": "1.5.0",
2478 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
2479 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
2480 | },
2481 | "stream-browserify": {
2482 | "version": "3.0.0",
2483 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
2484 | "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
2485 | "requires": {
2486 | "inherits": "~2.0.4",
2487 | "readable-stream": "^3.5.0"
2488 | }
2489 | },
2490 | "stream-http": {
2491 | "version": "3.1.1",
2492 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz",
2493 | "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==",
2494 | "requires": {
2495 | "builtin-status-codes": "^3.0.0",
2496 | "inherits": "^2.0.4",
2497 | "readable-stream": "^3.6.0",
2498 | "xtend": "^4.0.2"
2499 | }
2500 | },
2501 | "stream-parser": {
2502 | "version": "0.3.1",
2503 | "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
2504 | "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
2505 | "requires": {
2506 | "debug": "2"
2507 | },
2508 | "dependencies": {
2509 | "debug": {
2510 | "version": "2.6.9",
2511 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2512 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2513 | "requires": {
2514 | "ms": "2.0.0"
2515 | }
2516 | },
2517 | "ms": {
2518 | "version": "2.0.0",
2519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2520 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
2521 | }
2522 | }
2523 | },
2524 | "string-hash": {
2525 | "version": "1.1.3",
2526 | "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
2527 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs="
2528 | },
2529 | "string-width": {
2530 | "version": "4.2.2",
2531 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
2532 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
2533 | "requires": {
2534 | "emoji-regex": "^8.0.0",
2535 | "is-fullwidth-code-point": "^3.0.0",
2536 | "strip-ansi": "^6.0.0"
2537 | }
2538 | },
2539 | "string.prototype.trimend": {
2540 | "version": "1.0.4",
2541 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
2542 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
2543 | "requires": {
2544 | "call-bind": "^1.0.2",
2545 | "define-properties": "^1.1.3"
2546 | }
2547 | },
2548 | "string.prototype.trimstart": {
2549 | "version": "1.0.4",
2550 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
2551 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
2552 | "requires": {
2553 | "call-bind": "^1.0.2",
2554 | "define-properties": "^1.1.3"
2555 | }
2556 | },
2557 | "string_decoder": {
2558 | "version": "1.3.0",
2559 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2560 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2561 | "requires": {
2562 | "safe-buffer": "~5.2.0"
2563 | }
2564 | },
2565 | "strip-ansi": {
2566 | "version": "6.0.0",
2567 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2568 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2569 | "requires": {
2570 | "ansi-regex": "^5.0.0"
2571 | }
2572 | },
2573 | "styled-jsx": {
2574 | "version": "5.0.0-beta.3",
2575 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz",
2576 | "integrity": "sha512-HtDDGSFPvmjHIqWf9n8Oo54tAoY/DTplvlyOH2+YOtD80Sp31Ap8ffSmxhgk5EkUoJ7xepdXMGT650mSffWuRA==",
2577 | "requires": {
2578 | "@babel/plugin-syntax-jsx": "7.14.5",
2579 | "@babel/types": "7.15.0",
2580 | "convert-source-map": "1.7.0",
2581 | "loader-utils": "1.2.3",
2582 | "source-map": "0.7.3",
2583 | "string-hash": "1.1.3",
2584 | "stylis": "3.5.4",
2585 | "stylis-rule-sheet": "0.0.10"
2586 | },
2587 | "dependencies": {
2588 | "source-map": {
2589 | "version": "0.7.3",
2590 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
2591 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
2592 | }
2593 | }
2594 | },
2595 | "stylis": {
2596 | "version": "3.5.4",
2597 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
2598 | "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
2599 | },
2600 | "stylis-rule-sheet": {
2601 | "version": "0.0.10",
2602 | "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
2603 | "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw=="
2604 | },
2605 | "supports-color": {
2606 | "version": "5.5.0",
2607 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2608 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2609 | "requires": {
2610 | "has-flag": "^3.0.0"
2611 | }
2612 | },
2613 | "timers-browserify": {
2614 | "version": "2.0.12",
2615 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
2616 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
2617 | "requires": {
2618 | "setimmediate": "^1.0.4"
2619 | }
2620 | },
2621 | "to-fast-properties": {
2622 | "version": "2.0.0",
2623 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
2624 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
2625 | },
2626 | "to-regex-range": {
2627 | "version": "5.0.1",
2628 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2629 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2630 | "requires": {
2631 | "is-number": "^7.0.0"
2632 | }
2633 | },
2634 | "toidentifier": {
2635 | "version": "1.0.0",
2636 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
2637 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
2638 | },
2639 | "tr46": {
2640 | "version": "1.0.1",
2641 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
2642 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
2643 | "requires": {
2644 | "punycode": "^2.1.0"
2645 | }
2646 | },
2647 | "trough": {
2648 | "version": "1.0.5",
2649 | "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
2650 | "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
2651 | },
2652 | "tslib": {
2653 | "version": "2.3.1",
2654 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
2655 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
2656 | },
2657 | "tty-browserify": {
2658 | "version": "0.0.1",
2659 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
2660 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
2661 | },
2662 | "type-fest": {
2663 | "version": "0.7.1",
2664 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
2665 | "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="
2666 | },
2667 | "unbox-primitive": {
2668 | "version": "1.0.1",
2669 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
2670 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
2671 | "requires": {
2672 | "function-bind": "^1.1.1",
2673 | "has-bigints": "^1.0.1",
2674 | "has-symbols": "^1.0.2",
2675 | "which-boxed-primitive": "^1.0.2"
2676 | }
2677 | },
2678 | "unified": {
2679 | "version": "9.2.0",
2680 | "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
2681 | "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
2682 | "requires": {
2683 | "bail": "^1.0.0",
2684 | "extend": "^3.0.0",
2685 | "is-buffer": "^2.0.0",
2686 | "is-plain-obj": "^2.0.0",
2687 | "trough": "^1.0.0",
2688 | "vfile": "^4.0.0"
2689 | },
2690 | "dependencies": {
2691 | "is-buffer": {
2692 | "version": "2.0.5",
2693 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
2694 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
2695 | }
2696 | }
2697 | },
2698 | "unist-util-is": {
2699 | "version": "4.0.4",
2700 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz",
2701 | "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA=="
2702 | },
2703 | "unist-util-stringify-position": {
2704 | "version": "2.0.3",
2705 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
2706 | "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
2707 | "requires": {
2708 | "@types/unist": "^2.0.2"
2709 | }
2710 | },
2711 | "unist-util-visit": {
2712 | "version": "2.0.3",
2713 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
2714 | "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
2715 | "requires": {
2716 | "@types/unist": "^2.0.0",
2717 | "unist-util-is": "^4.0.0",
2718 | "unist-util-visit-parents": "^3.0.0"
2719 | },
2720 | "dependencies": {
2721 | "unist-util-visit-parents": {
2722 | "version": "3.1.1",
2723 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
2724 | "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
2725 | "requires": {
2726 | "@types/unist": "^2.0.0",
2727 | "unist-util-is": "^4.0.0"
2728 | }
2729 | }
2730 | }
2731 | },
2732 | "unist-util-visit-parents": {
2733 | "version": "1.1.2",
2734 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
2735 | "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
2736 | },
2737 | "unpipe": {
2738 | "version": "1.0.0",
2739 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2740 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
2741 | },
2742 | "use-subscription": {
2743 | "version": "1.5.1",
2744 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
2745 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
2746 | "requires": {
2747 | "object-assign": "^4.1.1"
2748 | }
2749 | },
2750 | "util": {
2751 | "version": "0.12.4",
2752 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
2753 | "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
2754 | "requires": {
2755 | "inherits": "^2.0.3",
2756 | "is-arguments": "^1.0.4",
2757 | "is-generator-function": "^1.0.7",
2758 | "is-typed-array": "^1.1.3",
2759 | "safe-buffer": "^5.1.2",
2760 | "which-typed-array": "^1.1.2"
2761 | }
2762 | },
2763 | "util-deprecate": {
2764 | "version": "1.0.2",
2765 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2766 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2767 | },
2768 | "vfile": {
2769 | "version": "4.2.1",
2770 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
2771 | "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
2772 | "requires": {
2773 | "@types/unist": "^2.0.0",
2774 | "is-buffer": "^2.0.0",
2775 | "unist-util-stringify-position": "^2.0.0",
2776 | "vfile-message": "^2.0.0"
2777 | },
2778 | "dependencies": {
2779 | "is-buffer": {
2780 | "version": "2.0.5",
2781 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
2782 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
2783 | }
2784 | }
2785 | },
2786 | "vfile-message": {
2787 | "version": "2.0.4",
2788 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
2789 | "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
2790 | "requires": {
2791 | "@types/unist": "^2.0.0",
2792 | "unist-util-stringify-position": "^2.0.0"
2793 | }
2794 | },
2795 | "vm-browserify": {
2796 | "version": "1.1.2",
2797 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
2798 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
2799 | },
2800 | "watchpack": {
2801 | "version": "2.1.1",
2802 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
2803 | "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==",
2804 | "requires": {
2805 | "glob-to-regexp": "^0.4.1",
2806 | "graceful-fs": "^4.1.2"
2807 | }
2808 | },
2809 | "web-streams-polyfill": {
2810 | "version": "3.0.3",
2811 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.0.3.tgz",
2812 | "integrity": "sha512-d2H/t0eqRNM4w2WvmTdoeIvzAUSpK7JmATB8Nr2lb7nQ9BTIJVjbQ/TRFVEh2gUH1HwclPdoPtfMoFfetXaZnA=="
2813 | },
2814 | "webidl-conversions": {
2815 | "version": "4.0.2",
2816 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
2817 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
2818 | },
2819 | "websocket-driver": {
2820 | "version": "0.7.4",
2821 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
2822 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
2823 | "requires": {
2824 | "http-parser-js": ">=0.5.1",
2825 | "safe-buffer": ">=5.1.0",
2826 | "websocket-extensions": ">=0.1.1"
2827 | }
2828 | },
2829 | "websocket-extensions": {
2830 | "version": "0.1.4",
2831 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
2832 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
2833 | },
2834 | "whatwg-fetch": {
2835 | "version": "2.0.4",
2836 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
2837 | "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
2838 | },
2839 | "whatwg-url": {
2840 | "version": "7.1.0",
2841 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
2842 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
2843 | "requires": {
2844 | "lodash.sortby": "^4.7.0",
2845 | "tr46": "^1.0.1",
2846 | "webidl-conversions": "^4.0.2"
2847 | }
2848 | },
2849 | "which-boxed-primitive": {
2850 | "version": "1.0.2",
2851 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
2852 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
2853 | "requires": {
2854 | "is-bigint": "^1.0.1",
2855 | "is-boolean-object": "^1.1.0",
2856 | "is-number-object": "^1.0.4",
2857 | "is-string": "^1.0.5",
2858 | "is-symbol": "^1.0.3"
2859 | }
2860 | },
2861 | "which-typed-array": {
2862 | "version": "1.1.7",
2863 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
2864 | "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
2865 | "requires": {
2866 | "available-typed-arrays": "^1.0.5",
2867 | "call-bind": "^1.0.2",
2868 | "es-abstract": "^1.18.5",
2869 | "foreach": "^2.0.5",
2870 | "has-tostringtag": "^1.0.0",
2871 | "is-typed-array": "^1.1.7"
2872 | }
2873 | },
2874 | "wrap-ansi": {
2875 | "version": "7.0.0",
2876 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2877 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2878 | "requires": {
2879 | "ansi-styles": "^4.0.0",
2880 | "string-width": "^4.1.0",
2881 | "strip-ansi": "^6.0.0"
2882 | }
2883 | },
2884 | "xmlhttprequest": {
2885 | "version": "1.8.0",
2886 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
2887 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
2888 | },
2889 | "xtend": {
2890 | "version": "4.0.2",
2891 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2892 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
2893 | },
2894 | "y18n": {
2895 | "version": "5.0.8",
2896 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
2897 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
2898 | },
2899 | "yargs": {
2900 | "version": "16.2.0",
2901 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
2902 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
2903 | "requires": {
2904 | "cliui": "^7.0.2",
2905 | "escalade": "^3.1.1",
2906 | "get-caller-file": "^2.0.5",
2907 | "require-directory": "^2.1.1",
2908 | "string-width": "^4.2.0",
2909 | "y18n": "^5.0.5",
2910 | "yargs-parser": "^20.2.2"
2911 | }
2912 | },
2913 | "yargs-parser": {
2914 | "version": "20.2.9",
2915 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
2916 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
2917 | },
2918 | "yocto-queue": {
2919 | "version": "0.1.0",
2920 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2921 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
2922 | }
2923 | }
2924 | }
2925 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nextfire",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "export": "next export"
10 | },
11 | "dependencies": {
12 | "firebase": "^8.2.1",
13 | "lodash.debounce": "^4.0.8",
14 | "lodash.kebabcase": "^4.1.1",
15 | "next": "12.0.1",
16 | "react": "17.0.1",
17 | "react-dom": "17.0.1",
18 | "react-firebase-hooks": "^2.2.0",
19 | "react-hook-form": "^6.14.2",
20 | "react-hot-toast": "^1.0.2",
21 | "react-markdown": "^5.0.3"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/pages/404.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 |
3 | export default function Custom404() {
4 | return (
5 |
6 | 404 - That page does not seem to exist...
7 |
14 |
15 | Go home
16 |
17 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/pages/[username]/[slug].js:
--------------------------------------------------------------------------------
1 | import styles from '@styles/Post.module.css';
2 | import PostContent from '@components/PostContent';
3 | import HeartButton from '@components/HeartButton';
4 | import AuthCheck from '@components/AuthCheck';
5 | import Metatags from '@components/Metatags';
6 | import { UserContext } from '@lib/context';
7 | import { firestore, getUserWithUsername, postToJSON } from '../../lib/firebase';
8 |
9 | import Link from 'next/link';
10 | import { useDocumentData } from 'react-firebase-hooks/firestore';
11 | import { useContext } from 'react';
12 |
13 | export async function getStaticProps({ params }) {
14 | const { username, slug } = params;
15 | const userDoc = await getUserWithUsername(username);
16 |
17 | let post;
18 | let path;
19 |
20 | if (userDoc) {
21 | const postRef = userDoc.ref.collection('posts').doc(slug);
22 | post = postToJSON(await postRef.get());
23 |
24 | path = postRef.path;
25 | }
26 |
27 | return {
28 | props: { post, path },
29 | revalidate: 100,
30 | };
31 | }
32 |
33 | export async function getStaticPaths() {
34 | // Improve my using Admin SDK to select empty docs
35 | const snapshot = await firestore.collectionGroup('posts').get();
36 |
37 | const paths = snapshot.docs.map((doc) => {
38 | const { slug, username } = doc.data();
39 | return {
40 | params: { username, slug },
41 | };
42 | });
43 |
44 | return {
45 | // must be in this format:
46 | // paths: [
47 | // { params: { username, slug }}
48 | // ],
49 | paths,
50 | fallback: 'blocking',
51 | };
52 | }
53 |
54 | export default function Post(props) {
55 | const postRef = firestore.doc(props.path);
56 | const [realtimePost] = useDocumentData(postRef);
57 |
58 | const post = realtimePost || props.post;
59 |
60 | const { user: currentUser } = useContext(UserContext);
61 |
62 | return (
63 |
64 |
65 |
66 |
69 |
70 |
91 |
92 | );
93 | }
94 |
--------------------------------------------------------------------------------
/pages/[username]/index.js:
--------------------------------------------------------------------------------
1 | import { getUserWithUsername, postToJSON } from '@lib/firebase';
2 | import UserProfile from '@components/UserProfile';
3 | import Metatags from '@components/Metatags';
4 | import PostFeed from '@components/PostFeed';
5 |
6 |
7 | export async function getServerSideProps({ query }) {
8 | const { username } = query;
9 |
10 | const userDoc = await getUserWithUsername(username);
11 |
12 | // If no user, short circuit to 404 page
13 | if (!userDoc) {
14 | return {
15 | notFound: true,
16 | };
17 | }
18 |
19 | // JSON serializable data
20 | let user = null;
21 | let posts = null;
22 |
23 | if (userDoc) {
24 | user = userDoc.data();
25 | const postsQuery = userDoc.ref
26 | .collection('posts')
27 | .where('published', '==', true)
28 | .orderBy('createdAt', 'desc')
29 | .limit(5);
30 | posts = (await postsQuery.get()).docs.map(postToJSON);
31 | }
32 |
33 | return {
34 | props: { user, posts }, // will be passed to the page component as props
35 | };
36 | }
37 |
38 | export default function UserProfilePage({ user, posts }) {
39 | return (
40 |
41 |
42 |
43 |
44 |
45 | );
46 | }
47 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import '@styles/globals.css';
2 | import Navbar from '@components/Navbar';
3 | import { UserContext } from '@lib/context';
4 | import { useUserData } from '@lib/hooks';
5 | import { Toaster } from 'react-hot-toast';
6 |
7 | function MyApp({ Component, pageProps }) {
8 | const userData = useUserData();
9 |
10 | return (
11 |
12 |
13 |
14 |
15 |
16 | );
17 | }
18 |
19 | export default MyApp;
20 |
--------------------------------------------------------------------------------
/pages/admin/[slug].js:
--------------------------------------------------------------------------------
1 | import styles from '@styles/Admin.module.css';
2 | import AuthCheck from '@components/AuthCheck';
3 | import { firestore, auth, serverTimestamp } from '@lib/firebase';
4 | import ImageUploader from '@components/ImageUploader';
5 |
6 | import { useState } from 'react';
7 | import { useRouter } from 'next/router';
8 |
9 | import { useDocumentDataOnce } from 'react-firebase-hooks/firestore';
10 | import { useForm } from 'react-hook-form';
11 | import ReactMarkdown from 'react-markdown';
12 | import Link from 'next/link';
13 | import toast from 'react-hot-toast';
14 |
15 | export default function AdminPostEdit(props) {
16 | return (
17 |
18 |
19 |
20 | );
21 | }
22 |
23 | function PostManager() {
24 | const [preview, setPreview] = useState(false);
25 |
26 | const router = useRouter();
27 | const { slug } = router.query;
28 |
29 | const postRef = firestore.collection('users').doc(auth.currentUser.uid).collection('posts').doc(slug);
30 | const [post] = useDocumentDataOnce(postRef);
31 |
32 | return (
33 |
34 | {post && (
35 | <>
36 |
37 | {post.title}
38 | ID: {post.slug}
39 |
40 |
41 |
42 |
43 |
44 | Tools
45 | setPreview(!preview)}>{preview ? 'Edit' : 'Preview'}
46 |
47 | Live view
48 |
49 |
50 |
51 | >
52 | )}
53 |
54 | );
55 | }
56 |
57 | function PostForm({ defaultValues, postRef, preview }) {
58 | const { register, errors, handleSubmit, formState, reset, watch } = useForm({ defaultValues, mode: 'onChange' });
59 |
60 | const { isValid, isDirty } = formState;
61 |
62 | const updatePost = async ({ content, published }) => {
63 | await postRef.update({
64 | content,
65 | published,
66 | updatedAt: serverTimestamp(),
67 | });
68 |
69 | reset({ content, published });
70 |
71 | toast.success('Post updated successfully!');
72 | };
73 |
74 | return (
75 |
106 | );
107 | }
108 |
109 | function DeletePostButton({ postRef }) {
110 | const router = useRouter();
111 |
112 | const deletePost = async () => {
113 | const doIt = confirm('are you sure!');
114 | if (doIt) {
115 | await postRef.delete();
116 | router.push('/admin');
117 | toast('post annihilated ', { icon: '🗑️' });
118 | }
119 | };
120 |
121 | return (
122 |
123 | Delete
124 |
125 | );
126 | }
127 |
--------------------------------------------------------------------------------
/pages/admin/index.js:
--------------------------------------------------------------------------------
1 | import styles from '@styles/Admin.module.css';
2 | import AuthCheck from '@components/AuthCheck';
3 | import PostFeed from '@components/PostFeed';
4 | import { UserContext } from '@lib/context';
5 | import { firestore, auth, serverTimestamp } from '@lib/firebase';
6 |
7 | import { useContext, useState } from 'react';
8 | import { useRouter } from 'next/router';
9 |
10 | import { useCollection } from 'react-firebase-hooks/firestore';
11 | import kebabCase from 'lodash.kebabcase';
12 | import toast from 'react-hot-toast';
13 |
14 | export default function AdminPostsPage(props) {
15 | return (
16 |
17 |
18 |
19 |
20 |
21 |
22 | );
23 | }
24 |
25 | function PostList() {
26 | const ref = firestore.collection('users').doc(auth.currentUser.uid).collection('posts');
27 | const query = ref.orderBy('createdAt');
28 | const [querySnapshot] = useCollection(query);
29 |
30 | const posts = querySnapshot?.docs.map((doc) => doc.data());
31 |
32 | return (
33 | <>
34 | Manage your Posts
35 |
36 | >
37 | );
38 | }
39 |
40 | function CreateNewPost() {
41 | const router = useRouter();
42 | const { username } = useContext(UserContext);
43 | const [title, setTitle] = useState('');
44 |
45 | // Ensure slug is URL safe
46 | const slug = encodeURI(kebabCase(title));
47 |
48 | // Validate length
49 | const isValid = title.length > 3 && title.length < 100;
50 |
51 | // Create a new post in firestore
52 | const createPost = async (e) => {
53 | e.preventDefault();
54 | const uid = auth.currentUser.uid;
55 | const ref = firestore.collection('users').doc(uid).collection('posts').doc(slug);
56 |
57 | // Tip: give all fields a default value here
58 | const data = {
59 | title,
60 | slug,
61 | uid,
62 | username,
63 | published: false,
64 | content: '# hello world!',
65 | createdAt: serverTimestamp(),
66 | updatedAt: serverTimestamp(),
67 | heartCount: 0,
68 | };
69 |
70 | await ref.set(data);
71 |
72 | toast.success('Post created!');
73 |
74 | // Imperative navigation after doc is set
75 | router.push(`/admin/${slug}`);
76 | };
77 |
78 | return (
79 |
80 | setTitle(e.target.value)}
83 | placeholder="My Awesome Article!"
84 | className={styles.input}
85 | />
86 |
87 | Slug: {slug}
88 |
89 |
90 | Create New Post
91 |
92 |
93 | );
94 | }
95 |
--------------------------------------------------------------------------------
/pages/api/[username].js:
--------------------------------------------------------------------------------
1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2 | export default async (req, res) => {
3 |
4 | res.statusCode = 200
5 | res.json({ })
6 | }
7 |
--------------------------------------------------------------------------------
/pages/enter.js:
--------------------------------------------------------------------------------
1 | import { auth, firestore, googleAuthProvider } from '@lib/firebase';
2 | import { UserContext } from '@lib/context';
3 | import Metatags from '@components/Metatags';
4 |
5 | import { useEffect, useState, useCallback, useContext } from 'react';
6 | import debounce from 'lodash.debounce';
7 |
8 | export default function Enter(props) {
9 | const { user, username } = useContext(UserContext);
10 |
11 | // 1. user signed out
12 | // 2. user signed in, but missing username
13 | // 3. user signed in, has username
14 | return (
15 |
16 |
17 | {user ? !username ? : : }
18 |
19 | );
20 | }
21 |
22 | // Sign in with Google button
23 | function SignInButton() {
24 | const signInWithGoogle = async () => {
25 | await auth.signInWithPopup(googleAuthProvider);
26 | };
27 |
28 | return (
29 | <>
30 |
31 | Sign in with Google
32 |
33 | auth.signInAnonymously()}>
34 | Sign in Anonymously
35 |
36 | >
37 | );
38 | }
39 |
40 | // Sign out button
41 | function SignOutButton() {
42 | return auth.signOut()}>Sign Out ;
43 | }
44 |
45 | // Username form
46 | function UsernameForm() {
47 | const [formValue, setFormValue] = useState('');
48 | const [isValid, setIsValid] = useState(false);
49 | const [loading, setLoading] = useState(false);
50 |
51 | const { user, username } = useContext(UserContext);
52 |
53 | const onSubmit = async (e) => {
54 | e.preventDefault();
55 |
56 | // Create refs for both documents
57 | const userDoc = firestore.doc(`users/${user.uid}`);
58 | const usernameDoc = firestore.doc(`usernames/${formValue}`);
59 |
60 | // Commit both docs together as a batch write.
61 | const batch = firestore.batch();
62 | batch.set(userDoc, { username: formValue, photoURL: user.photoURL, displayName: user.displayName });
63 | batch.set(usernameDoc, { uid: user.uid });
64 |
65 | await batch.commit();
66 | };
67 |
68 | const onChange = (e) => {
69 | // Force form value typed in form to match correct format
70 | const val = e.target.value.toLowerCase();
71 | const re = /^(?=[a-zA-Z0-9._]{3,15}$)(?!.*[_.]{2})[^_.].*[^_.]$/;
72 |
73 | // Only set form value if length is < 3 OR it passes regex
74 | if (val.length < 3) {
75 | setFormValue(val);
76 | setLoading(false);
77 | setIsValid(false);
78 | }
79 |
80 | if (re.test(val)) {
81 | setFormValue(val);
82 | setLoading(true);
83 | setIsValid(false);
84 | }
85 | };
86 |
87 | //
88 |
89 | useEffect(() => {
90 | checkUsername(formValue);
91 | }, [formValue]);
92 |
93 | // Hit the database for username match after each debounced change
94 | // useCallback is required for debounce to work
95 | const checkUsername = useCallback(
96 | debounce(async (username) => {
97 | if (username.length >= 3) {
98 | const ref = firestore.doc(`usernames/${username}`);
99 | const { exists } = await ref.get();
100 | console.log('Firestore read executed!');
101 | setIsValid(!exists);
102 | setLoading(false);
103 | }
104 | }, 500),
105 | []
106 | );
107 |
108 | return (
109 | !username && (
110 |
129 | )
130 | );
131 | }
132 |
133 | function UsernameMessage({ username, isValid, loading }) {
134 | if (loading) {
135 | return Checking...
;
136 | } else if (isValid) {
137 | return {username} is available!
;
138 | } else if (username && !isValid) {
139 | return That username is taken!
;
140 | } else {
141 | return
;
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/pages/index.js:
--------------------------------------------------------------------------------
1 | import PostFeed from '@components/PostFeed';
2 | import Metatags from '@components/Metatags';
3 | import Loader from '@components/Loader';
4 | import { firestore, fromMillis, postToJSON } from '@lib/firebase';
5 |
6 | import { useState } from 'react';
7 |
8 | // Max post to query per page
9 | const LIMIT = 10;
10 |
11 | export async function getServerSideProps(context) {
12 | const postsQuery = firestore
13 | .collectionGroup('posts')
14 | .where('published', '==', true)
15 | .orderBy('createdAt', 'desc')
16 | .limit(LIMIT);
17 |
18 | const posts = (await postsQuery.get()).docs.map(postToJSON);
19 |
20 | return {
21 | props: { posts }, // will be passed to the page component as props
22 | };
23 | }
24 |
25 | export default function Home(props) {
26 | const [posts, setPosts] = useState(props.posts);
27 | const [loading, setLoading] = useState(false);
28 |
29 | const [postsEnd, setPostsEnd] = useState(false);
30 |
31 | // Get next page in pagination query
32 | const getMorePosts = async () => {
33 | setLoading(true);
34 | const last = posts[posts.length - 1];
35 |
36 | const cursor = typeof last.createdAt === 'number' ? fromMillis(last.createdAt) : last.createdAt;
37 |
38 | const query = firestore
39 | .collectionGroup('posts')
40 | .where('published', '==', true)
41 | .orderBy('createdAt', 'desc')
42 | .startAfter(cursor)
43 | .limit(LIMIT);
44 |
45 | const newPosts = (await query.get()).docs.map((doc) => doc.data());
46 |
47 | setPosts(posts.concat(newPosts));
48 | setLoading(false);
49 |
50 | if (newPosts.length < LIMIT) {
51 | setPostsEnd(true);
52 | }
53 | };
54 |
55 | return (
56 |
57 |
58 |
59 |
60 |
💡 Next.js + Firebase - The Full Course
61 |
Welcome! This app is built with Next.js and Firebase and is loosely inspired by Dev.to.
62 |
Sign up for an 👨🎤 account, ✍️ write posts, then 💞 heart content created by other users. All public content is server-rendered and search-engine optimized.
63 |
64 |
65 |
66 |
67 | {!loading && !postsEnd && Load more }
68 |
69 |
70 |
71 | {postsEnd && 'You have reached the end!'}
72 |
73 | );
74 | }
75 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/favicon.ico
--------------------------------------------------------------------------------
/public/google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/google.png
--------------------------------------------------------------------------------
/public/hacker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/hacker.png
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
3 |
4 |
--------------------------------------------------------------------------------
/styles/Admin.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | min-height: 100vh;
3 | display: flex;
4 | }
5 |
6 | .container section {
7 | width: 60vw;
8 | margin-right: 1rem;
9 | }
10 |
11 | .container aside {
12 | display: flex;
13 | flex-direction: column;
14 | width: 20%;
15 | min-width: 250px;
16 | min-height: 200px;
17 | text-align: center;
18 | position: sticky;
19 | top: 80px;
20 | height: 0;
21 | }
22 |
23 | .hidden {
24 | display: none;
25 | }
26 |
27 | .controls {
28 | display: flex;
29 | flex-direction: column;
30 | }
31 |
32 | .controls textarea {
33 | height: 60vh;
34 | border: none;
35 | outline: none;
36 | padding: 0.5rem;
37 | font-size: 1.25rem;
38 | }
39 |
40 | .input {
41 | outline: none;
42 | border: none;
43 | font-size: 2.5rem;
44 | width: 100%;
45 | padding: 5px 10px;
46 | }
47 |
48 | .checkbox {
49 | display: inline;
50 | width: auto;
51 | }
52 |
53 | @media only screen and (max-width: 768px) {
54 | .container {
55 | flex-direction: column;
56 | }
57 |
58 | .container section {
59 | width: 100%;
60 | }
61 |
62 | .container aside {
63 | width: 100%;
64 | position: relative;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/styles/Post.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | min-height: 100vh;
3 | display: flex;
4 | }
5 |
6 | .container section {
7 | width: 80%;
8 | margin-right: 1rem;
9 | }
10 |
11 | .container aside {
12 | align-items: center;
13 | display: flex;
14 | flex-direction: column;
15 | width: 20%;
16 | min-width: 250px;
17 | text-align: center;
18 | position: sticky;
19 | top: 80px;
20 | height: 0;
21 | min-height: 300px;
22 | }
23 |
24 |
25 | @media only screen and (max-width: 768px) {
26 | .container {
27 | flex-direction: column;
28 | }
29 |
30 | .container section {
31 | width: 100%;
32 | }
33 |
34 | .container aside {
35 | width: 100%;
36 | position: relative;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/styles/globals.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,700;1,400&display=swap');
2 |
3 | :root {
4 | --color-bg: #eef0f1;
5 | --color-text: #08090a;
6 | --color-blue: #3b49df;
7 | --color-red: #df3b3b;
8 | --color-green: #3bdf72;
9 | --color-gray: #b5bdc4;
10 | }
11 | html,
12 | body {
13 | padding: 0;
14 | margin: 0;
15 | font-family: 'Noto Sans', sans-serif;
16 | background-color: var(--color-bg);
17 | color: var(--color-text);
18 | margin-top: 50px;
19 | }
20 |
21 |
22 |
23 | main {
24 | padding: 1rem 10vw;
25 | }
26 |
27 | h1 { font-size: 2rem; }
28 | h2 { font-size: 1.5rem; }
29 | h2 { font-size: 1.25rem; }
30 |
31 | a {
32 | color: inherit;
33 | text-decoration: none;
34 | cursor: pointer;
35 | }
36 |
37 | * {
38 | box-sizing: border-box;
39 | }
40 |
41 | img {max-width: 100%;}
42 |
43 | input {
44 | display: inline-block;
45 | outline: none;
46 | border: none;
47 | font-size: 1.5rem;
48 | width: 100%;
49 | padding: 5px 10px;
50 | }
51 |
52 | fieldset {
53 | border: none;
54 | padding: 1rem 0;
55 | font-size: 1.25rem;
56 | }
57 |
58 | code {
59 | overflow-x: scroll;
60 | }
61 |
62 | /* Navbar */
63 |
64 | .navbar {
65 | height: 70px;
66 | width: 100%;
67 | background: white;
68 | color: var(--colors-text);
69 | position: fixed;
70 | top: 0;
71 | padding: 0 10vw;
72 | font-weight: bold;
73 | border-bottom: 1px solid var(--color-gray);
74 | z-index: 99;
75 | }
76 |
77 | .navbar ul {
78 | list-style-type: none;
79 | margin: 0;
80 | padding: 0;
81 | display: flex;
82 | align-items: center;
83 | justify-content: space-between;
84 | height: 100%;
85 | }
86 |
87 | .navbar img {
88 | border-radius: 50%;
89 | width: 50px;
90 | height: 50px;
91 | cursor: pointer;
92 | }
93 |
94 | .navbar li {
95 | border-radius: 50%;
96 |
97 | }
98 |
99 | /* Buttons */
100 |
101 | .btn, button {
102 | background-color: var(--color-gray);
103 | border: none;
104 | color: var(--color-text);
105 | padding: 1rem 2rem;
106 | display: flex;
107 | align-items: center;
108 | text-align: center;
109 | justify-content: center;
110 | text-decoration: none;
111 | font-family: 'Noto Sans', sans-serif;
112 | font-weight: bold;
113 | border-radius: 0.25rem;
114 | cursor: pointer;
115 | margin: 0.5rem 1rem 0.5rem 0;
116 | }
117 |
118 | @media only screen and (max-width: 768px) {
119 | button {
120 | padding: 0.5rem 1rem;
121 | font-size: 0.8rem;
122 | }
123 | }
124 |
125 |
126 | button:hover {
127 | filter: brightness(90%);
128 | }
129 |
130 | button:disabled,
131 | button[disabled]{
132 | filter: brightness(80%);
133 | cursor: not-allowed;
134 | }
135 |
136 | button.btn-blue {
137 | background-color: var(--color-blue);
138 | color: white;
139 | }
140 |
141 | button.btn-red {
142 | background-color: var(--color-red);
143 | color: white;
144 | }
145 |
146 | button.btn-green {
147 | background-color: var(--color-green);
148 | color: white;
149 | }
150 |
151 | button.btn-google {
152 | background-color: white;
153 | color: var(--color-text);
154 | }
155 |
156 | .btn-google img {
157 | width: 30px;
158 | margin-right: 10px;
159 | }
160 |
161 | button.btn-logo {
162 | background-color: var(--color-text);
163 | color: white;
164 | text-transform: uppercase;
165 | font-size: 1.5rem;
166 | padding: 0.5rem 1rem;
167 | }
168 |
169 | /* Cards */
170 |
171 | .card {
172 | padding: 2rem;
173 | margin: 1rem 0;
174 | background-color: white;
175 | border: 1px solid var(--color-gray);
176 | border-radius: 8px;
177 | }
178 |
179 | .card footer {
180 | display: flex;
181 | }
182 |
183 | .card-img-center {
184 | width:20%;
185 | display:block;
186 | margin:auto;
187 | border-radius: 50%;
188 | max-width: 150px;
189 | }
190 |
191 | .card-info {
192 | color: white;
193 | background: var(--color-blue);
194 | }
195 |
196 | /* Loader */
197 |
198 | .loader {
199 | border: 10px solid var(--color-bg);
200 | border-top: 10px solid var(--color-blue);
201 | border-radius: 50%;
202 | width: 50px;
203 | height: 50px;
204 | animation: spin 2s linear infinite;
205 | }
206 |
207 | @keyframes spin {
208 | 0% { transform: rotate(0deg); }
209 | 100% { transform: rotate(360deg); }
210 | }
211 |
212 | /* File uploads */
213 |
214 | input[type="file"] {
215 | display: none;
216 | }
217 |
218 | .upload-snippet {
219 | width: 75%;
220 | margin-left: auto;
221 | background: white;
222 | padding: 5px;
223 | margin: 5px 0;
224 | }
225 | /* Utilities */
226 |
227 | .push-left {
228 | margin-left: auto;
229 | }
230 |
231 | .text-sm {
232 | font-size: 0.85rem;
233 | }
234 |
235 | .text-danger {
236 | font-weight: bold;
237 | color: var(--color-red);
238 | }
239 |
240 | .text-success {
241 | font-weight: bold;
242 | color: var(--color-green);
243 | }
244 |
245 | .text-info {
246 | font-weight: bold;
247 | color: var(--color-blue);
248 | }
249 |
250 | .box {
251 | display: flex;
252 | justify-content: space-between;
253 | }
254 |
255 | .box-center {
256 | display: flex;
257 | flex-direction: column;
258 | align-content: center;
259 | text-align: center;
260 | }
261 |
262 | .hidden { display: none; }
--------------------------------------------------------------------------------