From 52bdee8ee589633ee80ef390adfa5eeeb8596f67 Mon Sep 17 00:00:00 2001 From: James Miller Date: Fri, 12 Jun 2026 14:46:04 -0700 Subject: [PATCH] Add reactions to real-time chat example --- docs/server-api/events.mdx | 7 +- examples/real-time-chat/README.md | 12 +- examples/real-time-chat/eslint.config.js | 1 + examples/real-time-chat/src/App.jsx | 240 ++++++++++++++++-- src/components/HomepageBanner.js | 4 +- src/examples/real-time-chat.mdx | 136 +++++++++- .../real-time-chat/assets/index-BTCuFWzj.js | 49 ---- .../real-time-chat/assets/index-DzAAk6Qu.css | 1 - static/demos/real-time-chat/index.html | 27 -- static/site.webmanifest | 20 +- 10 files changed, 381 insertions(+), 116 deletions(-) delete mode 100644 static/demos/real-time-chat/assets/index-BTCuFWzj.js delete mode 100644 static/demos/real-time-chat/assets/index-DzAAk6Qu.css delete mode 100644 static/demos/real-time-chat/index.html diff --git a/docs/server-api/events.mdx b/docs/server-api/events.mdx index eefdc4e..34ec15d 100644 --- a/docs/server-api/events.mdx +++ b/docs/server-api/events.mdx @@ -499,7 +499,10 @@ SNS filter attributes are limited to `channel`, `key`, and `trigger`. "dataPrevious": "away", "expired": false, "expiresAt": "2026-04-03T12:00:00Z", - "meta": { "uid": "12345", "umd": { "firstName": "Jim", "lastName": "Halpert" } } + "meta": { + "uid": "12345", + "umd": { "firstName": "Jim", "lastName": "Halpert" } + } } ``` @@ -578,7 +581,7 @@ This is always `hotsock.messageReactionRemoved`. ### `metadata` {/* #hotsock.messageReactionRemoved--metadata */} :::note -`connectionId`, `requestId`, `sourceIp`, `trigger`, and `userAgent` reflect the original request that *added* the reaction, not the request that triggered the removal. +`connectionId`, `requestId`, `sourceIp`, `trigger`, and `userAgent` reflect the original request that _added_ the reaction, not the request that triggered the removal. ::: - `channel` (String): The name of the channel where the reaction was removed. diff --git a/examples/real-time-chat/README.md b/examples/real-time-chat/README.md index 4f2c2e5..11ddca1 100644 --- a/examples/real-time-chat/README.md +++ b/examples/real-time-chat/README.md @@ -34,7 +34,13 @@ The request body may include `{ "sessionId": "abc123" }` to rejoin an existing s "subscribe": true, "historyStart": 0, "messages": { - "chat": { "publish": true, "echo": true, "store": 86400 }, + "chat": { + "publish": true, + "echo": true, + "store": 86400, + "react": ["❤️", "👍", "👎", "😂"] + }, + "hotsock.messageReaction": { "echo": true }, "is-typing": { "publish": true } } } @@ -45,5 +51,7 @@ The request body may include `{ "sessionId": "abc123" }` to rejoin an existing s - `historyStart: 0` grants access to the full channel message history. - `store: 86400` retains chat messages for 24 hours. - `echo: true` on `chat` so the sender sees their own messages. +- `react: ["❤️", "👍", "👎", "😂"]` allows the four reactions shown in the UI on stored `chat` messages. +- `echo: true` on `hotsock.messageReaction` allows the client to receive its own reaction add/remove events. Reaction authorization comes from the `react` directive on `chat`. - `is-typing` is ephemeral (no store) — only delivered to live subscribers. -- The Hotsock `HttpApiUrl` is hardcoded in the client for `connection/listMessages` calls to load stored message history on connect. +- The Hotsock `HttpApiUrl` is hardcoded in the client for `connection/listMessages` calls to load stored message history and expanded reaction data on connect. diff --git a/examples/real-time-chat/eslint.config.js b/examples/real-time-chat/eslint.config.js index e668663..2a1d1be 100644 --- a/examples/real-time-chat/eslint.config.js +++ b/examples/real-time-chat/eslint.config.js @@ -28,6 +28,7 @@ export default [ ...react.configs.recommended.rules, ...react.configs["jsx-runtime"].rules, ...reactHooks.configs.recommended.rules, + "react/prop-types": "off", "react/jsx-no-target-blank": "off", "react-refresh/only-export-components": [ "warn", diff --git a/examples/real-time-chat/src/App.jsx b/examples/real-time-chat/src/App.jsx index 97398b4..7070b1b 100644 --- a/examples/real-time-chat/src/App.jsx +++ b/examples/real-time-chat/src/App.jsx @@ -5,6 +5,12 @@ const wssUrl = "wss://975x5pgn0h.execute-api.us-east-1.amazonaws.com/v1" const httpApiUrl = "https://f3hl5m33mxzpbu3ybcwcmcznu40njuio.lambda-url.us-east-1.on.aws" const STORAGE_KEY = "hotsock-chat-session" +const REACTIONS = [ + { value: "❤️", label: "Love" }, + { value: "👍", label: "Like" }, + { value: "👎", label: "Dislike" }, + { value: "😂", label: "Laugh" }, +] function getSessionId() { const hash = window.location.hash.slice(1) @@ -82,6 +88,64 @@ function formatTime(date) { return date.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" }) } +function normalizeReactions(reactions = {}) { + return REACTIONS.reduce((normalized, { value }) => { + const reaction = reactions[value] + if (!reaction) return normalized + + normalized[value] = { + count: reaction.count || reaction.items?.length || 0, + items: reaction.items || [], + } + + return normalized + }, {}) +} + +function userReaction(message, uid) { + return REACTIONS.find(({ value }) => + message.reactions?.[value]?.items?.some((item) => item.uid === uid), + )?.value +} + +function updateMessageReaction(messages, reactionMessage, action) { + const { messageId, reaction } = reactionMessage.data + const uid = reactionMessage.meta.uid + + return messages.map((message) => { + if (message.id !== messageId) return message + + const reactions = { ...message.reactions } + const existing = reactions[reaction] || { count: 0, items: [] } + const items = existing.items || [] + const alreadyReacted = items.some((item) => item.uid === uid) + + if (action === "add") { + if (alreadyReacted) return message + + const nextItems = [...items, { uid, umd: reactionMessage.meta.umd }] + reactions[reaction] = { + count: Math.max(existing.count + 1, nextItems.length), + items: nextItems, + } + } else { + const nextItems = items.filter((item) => item.uid !== uid) + const nextCount = Math.max(0, existing.count - (alreadyReacted ? 1 : 0)) + + if (nextCount === 0) { + delete reactions[reaction] + } else { + reactions[reaction] = { + count: nextItems.length || nextCount, + items: nextItems, + } + } + } + + return { ...message, reactions } + }) +} + function App() { const [channelName, setChannelName] = useState(null) const [sessionId, setSessionId] = useState(null) @@ -113,7 +177,7 @@ function App() { jimClient.terminate() pamClient.terminate() } - }, []) + }, [jimClient, pamClient]) const handleNewChat = () => { localStorage.removeItem(STORAGE_KEY) @@ -166,6 +230,7 @@ function ChatPanel({ hotsockClient, channelName }) { const [isTyping, setIsTyping] = useState("") const [messages, setMessages] = useState([]) const [loading, setLoading] = useState(true) + const [activeReactionMessageId, setActiveReactionMessageId] = useState(null) const isTypingTimeout = useRef(null) const wasCalled = useRef(false) const channel = useRef({}) @@ -188,7 +253,7 @@ function ChatPanel({ hotsockClient, channelName }) { const allMessages = [] let after = undefined while (true) { - const body = { channel: channelName } + const body = { channel: channelName, expandReactions: true } if (after) body.after = after const resp = await fetch( `${httpApiUrl}/connection/listMessages?${params}`, @@ -212,8 +277,10 @@ function ChatPanel({ hotsockClient, channelName }) { allMessages .filter((msg) => msg.event === "chat") .map((msg) => ({ + id: msg.id, sender: msg.meta.uid, content: msg.data, + reactions: normalizeReactions(msg.reactions), time: formatTime( new Date(msg.id ? decodUlidTime(msg.id) : Date.now()), ), @@ -252,13 +319,21 @@ function ChatPanel({ hotsockClient, channelName }) { setMessages((prev) => [ ...prev, { + id: message.id, sender: message.meta.uid, content: message.data, + reactions: {}, time: formatTime(new Date()), }, ]) setIsTyping("") }) + channel.current.bind("hotsock.messageReactionAdded", (message) => { + setMessages((prev) => updateMessageReaction(prev, message, "add")) + }) + channel.current.bind("hotsock.messageReactionRemoved", (message) => { + setMessages((prev) => updateMessageReaction(prev, message, "remove")) + }) channel.current.bind("is-typing", (message) => { setIsTyping(`${message.meta.uid} is typing...`) if (isTypingTimeout.current) clearTimeout(isTypingTimeout.current) @@ -290,6 +365,39 @@ function ChatPanel({ hotsockClient, channelName }) { } } + const handleReaction = (message, reaction) => { + if (!message.id) return + + const currentReaction = userReaction(message, name) + if (currentReaction) { + channel.current.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction: currentReaction, + action: "remove", + }, + }) + } + + if (currentReaction !== reaction) { + channel.current.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction, + action: "add", + }, + }) + } + } + + const handleMessageTap = (message) => { + if (!message.id) return + + setActiveReactionMessageId((currentId) => + currentId === message.id ? null : message.id, + ) + } + const isSelf = (sender) => sender === name const avatarColor = AVATAR_COLORS[name] || "bg-gray-500" @@ -331,31 +439,119 @@ function ChatPanel({ hotsockClient, channelName }) { Start the conversation by typing a message below... )} - {messages.map((message, index) => ( -
-
+ {messages.map((message, index) => { + const isPickerOpen = activeReactionMessageId === message.id + const visibleReactions = REACTIONS.map(({ value, label }) => ({ + value, + label, + count: message.reactions?.[value]?.count || 0, + active: userReaction(message, name) === value, + })).filter(({ count }) => count > 0) + + return ( +
handleMessageTap(message)} + >
- {message.content} +
+
+ {message.content} +
+ {message.id && ( +
+
+ {REACTIONS.map(({ value, label }) => { + const active = userReaction(message, name) === value + return ( + + ) + })} +
+
+
+ )} + {visibleReactions.length > 0 && ( +
+ {visibleReactions.map( + ({ value, label, count, active }) => ( + + ), + )} +
+ )} +
+ + {message.time} +
- - {message.time} -
-
- ))} + ) + })} {isTyping !== "" && (
diff --git a/src/components/HomepageBanner.js b/src/components/HomepageBanner.js index a0de3c2..54a2bab 100644 --- a/src/components/HomepageBanner.js +++ b/src/components/HomepageBanner.js @@ -11,8 +11,8 @@ export default function HomepageBanner() { New in v1.13: message reactions and presence pub/sub! - New in v1.13: message reactions, presence events on pub/sub, - and server-enforced heartbeats! + New in v1.13: message reactions, presence events on pub/sub, and + server-enforced heartbeats!

diff --git a/src/examples/real-time-chat.mdx b/src/examples/real-time-chat.mdx index 315ff5c..e855e3d 100644 --- a/src/examples/real-time-chat.mdx +++ b/src/examples/real-time-chat.mdx @@ -2,7 +2,7 @@ import ExampleIframe from "@site/src/components/ExampleIframe" # Real-Time Chat -The two windows below allow chatting with one another. Although they are on the same screen for the purposes of the demo, they each have their own isolated Hotsock connection over WebSockets and all messages are routed through the Hotsock installation before showing in the other window. Chat history is stored and persists across page loads. +The two windows below allow chatting with one another and reacting to individual messages. Although they are on the same screen for the purposes of the demo, they each have their own isolated Hotsock connection over WebSockets and all messages and reactions are routed through the Hotsock installation before showing in the other window. Chat history and reaction counts are stored and persist across page loads. @@ -10,7 +10,7 @@ Get the code for this example and run it yourself [from the GitHub repository](h ## How it works {/* #how-it-works */} -This example uses the [`@hotsock/hotsock-js`](https://www.npmjs.com/package/@hotsock/hotsock-js) client library to connect two users to the same channel, exchange messages in real time, and persist chat history using stored messages and the [Client HTTP API](/docs/connections/client-http-api/). Below is a walkthrough of each piece. +This example uses the [`@hotsock/hotsock-js`](https://www.npmjs.com/package/@hotsock/hotsock-js) client library to connect two users to the same channel, exchange messages and reactions in real time, and persist chat history using stored messages and the [Client HTTP API](/docs/connections/client-http-api/). Below is a walkthrough of each piece. ### Session persistence {/* #session-persistence */} @@ -51,7 +51,13 @@ For this demo, a backend endpoint issues tokens for two users (Jim and Pam) that "subscribe": true, "historyStart": 0, "messages": { - "chat": { "publish": true, "echo": true, "store": 86400 }, + "chat": { + "publish": true, + "echo": true, + "store": 86400, + "react": ["❤️", "👍", "👎", "😂"] + }, + "hotsock.messageReaction": { "echo": true }, "is-typing": { "publish": true } } } @@ -59,7 +65,7 @@ For this demo, a backend endpoint issues tokens for two users (Jim and Pam) that } ``` -The [`uid`](/docs/connections/claims/#uid) claim identifies each user and is included in the metadata of every message they send. The [`channels`](/docs/connections/claims/#channels) claim grants subscribe access and permission to publish `chat` and `is-typing` events. Setting [`echo: true`](/docs/connections/claims/#channels.messages.echo) on `chat` means the sender receives their own message back, which simplifies rendering. The [`store: 86400`](/docs/connections/claims/#channels.messages.store) claim retains chat messages for 24 hours, and [`historyStart: 0`](/docs/connections/claims/#channels.historyStart) grants access to the full message history. The `is-typing` event is intentionally ephemeral — no `store` — since typing indicators are only relevant to live subscribers. +The [`uid`](/docs/connections/claims/#uid) claim identifies each user and is included in the metadata of every message and reaction they send. The [`channels`](/docs/connections/claims/#channels) claim grants subscribe access and permission to publish `chat` and `is-typing` events. Setting [`echo: true`](/docs/connections/claims/#channels.messages.echo) on `chat` means the sender receives their own message back, which simplifies rendering. Setting `echo: true` on `hotsock.messageReaction` means the sender also receives their own `hotsock.messageReactionAdded` and `hotsock.messageReactionRemoved` events, so their reaction counts and active state update through the same real-time path as every other subscriber. The [`store: 86400`](/docs/connections/claims/#channels.messages.store) claim retains chat messages for 24 hours, and [`historyStart: 0`](/docs/connections/claims/#channels.historyStart) grants access to the full message history. The [`react`](/docs/connections/claims/#channels.messages.react) claim allows reactions on stored `chat` messages and restricts the allowed values to the four reactions shown by the UI: `❤️`, `👍`, `👎`, and `😂`. The `is-typing` event is intentionally ephemeral — no `store` — since typing indicators are only relevant to live subscribers. The client fetches tokens from the backend with a `connectTokenFn` — a function the Hotsock client calls whenever it needs a new or refreshed token: @@ -92,7 +98,7 @@ The client handles the WebSocket lifecycle automatically — connecting, reconne ### Loading message history {/* #loading-message-history */} -When the WebSocket connects, the [`hotsock.connected`](/docs/connections/client-http-api/#authentication) message provides `connectionId` and `connectionSecret` credentials. After subscribing to the channel, the client uses these credentials to call the [Client HTTP API's `connection/listMessages`](/docs/connections/client-http-api/#connection/listMessages) endpoint to load stored chat messages: +When the WebSocket connects, the [`hotsock.connected`](/docs/connections/client-http-api/#authentication) message provides `connectionId` and `connectionSecret` credentials. After subscribing to the channel, the client uses these credentials to call the [Client HTTP API's `connection/listMessages`](/docs/connections/client-http-api/#connection/listMessages) endpoint to load stored chat messages and their reactions: ```jsx hotsockClient.bind("hotsock.connected", (message) => { @@ -112,7 +118,7 @@ channel.bind("hotsock.subscribed", () => { }) ``` -The `listMessages` endpoint returns up to 100 messages per request. If a full page is returned, the client paginates forward using the `after` parameter with the last message's ID until all history is loaded: +The `listMessages` endpoint returns up to 100 messages per request. The demo passes `expandReactions: true` so each message includes reaction counts and the reacting users. If a full page is returned, the client paginates forward using the `after` parameter with the last message's ID until all history is loaded: ```jsx const loadHistory = async (connId, connSecret) => { @@ -123,7 +129,7 @@ const loadHistory = async (connId, connSecret) => { const allMessages = [] let after = undefined while (true) { - const body = { channel: channelName } + const body = { channel: channelName, expandReactions: true } if (after) body.after = after const resp = await fetch( `${httpApiUrl}/connection/listMessages?${params}`, @@ -144,15 +150,17 @@ const loadHistory = async (connId, connSecret) => { allMessages .filter((msg) => msg.event === "chat") .map((msg) => ({ + id: msg.id, sender: msg.meta.uid, content: msg.data, + reactions: msg.reactions || {}, time: formatTime(new Date(decodeUlidTime(msg.id))), })), ) } ``` -History messages get their timestamps from the message ID — Hotsock message IDs are [ULIDs](https://github.com/ulid/spec), which encode the creation time in their first 10 characters. Only `chat` events are loaded; ephemeral `is-typing` events are not stored. +History messages get their timestamps from the message ID — Hotsock message IDs are [ULIDs](https://github.com/ulid/spec), which encode the creation time in their first 10 characters. The message ID is also required when adding or removing a reaction, because a `hotsock.messageReaction` event targets one stored message by ID. Only `chat` events are loaded; ephemeral `is-typing` events are not stored. ### Subscribing and receiving messages {/* #subscribing-and-receiving-messages */} @@ -169,13 +177,23 @@ channel.bind("chat", (message) => { setMessages((prev) => [ ...prev, { + id: message.id, sender: message.meta.uid, content: message.data, + reactions: {}, time: formatTime(new Date()), }, ]) }) +channel.bind("hotsock.messageReactionAdded", (message) => { + setMessages((prev) => updateMessageReaction(prev, message, "add")) +}) + +channel.bind("hotsock.messageReactionRemoved", (message) => { + setMessages((prev) => updateMessageReaction(prev, message, "remove")) +}) + channel.bind("is-typing", (message) => { setIsTyping(`${message.meta.uid} is typing...`) clearTimeout(typingTimeout) @@ -185,6 +203,104 @@ channel.bind("is-typing", (message) => { The `channel.uid` property contains the user's identifier from their token, making it easy to distinguish your own messages from others and align them left or right in the UI. +### Adding and removing reactions {/* #adding-and-removing-reactions */} + +Reactions are sent as `hotsock.messageReaction` events. Reaction authorization comes from the `react` directive on the stored message type being reacted to, not from `publish: true` on `hotsock.messageReaction`. The connection token should set `echo: true` on `hotsock.messageReaction`; without `echo`, other subscribers will see the reaction in real time, but the sender will not receive the reaction event that updates their own local UI. The payload identifies the stored message to update, the reaction value, and whether the user is adding or removing it: + +```jsx +channel.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction: "❤️", + action: "add", + }, +}) +``` + +To remove a reaction, send the same payload with `action: "remove"`: + +```jsx +channel.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction: "❤️", + action: "remove", + }, +}) +``` + +The example keeps the UI close to Apple Messages behavior by allowing each user to have one active reaction on a message at a time. If the user clicks a different reaction, the client removes the previous reaction first and then adds the new one: + +```jsx +const REACTIONS = ["❤️", "👍", "👎", "😂"] + +const handleReaction = (message, reaction) => { + const currentReaction = userReaction(message, channel.uid) + + if (currentReaction) { + channel.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction: currentReaction, + action: "remove", + }, + }) + } + + if (currentReaction !== reaction) { + channel.sendMessage("hotsock.messageReaction", { + data: { + messageId: message.id, + reaction, + action: "add", + }, + }) + } +} +``` + +Hotsock persists the reaction and fans out either `hotsock.messageReactionAdded` or `hotsock.messageReactionRemoved` to all channel subscribers. Those real-time events include `data.messageId`, `data.reaction`, and `meta.uid`, which is enough to update the local reaction counts and active state without reloading history: + +```jsx +function updateMessageReaction(messages, reactionMessage, action) { + const { messageId, reaction } = reactionMessage.data + const uid = reactionMessage.meta.uid + + return messages.map((message) => { + if (message.id !== messageId) return message + + const reactions = { ...message.reactions } + const existing = reactions[reaction] || { count: 0, items: [] } + const items = existing.items || [] + const alreadyReacted = items.some((item) => item.uid === uid) + + if (action === "add" && !alreadyReacted) { + const nextItems = [...items, { uid, umd: reactionMessage.meta.umd }] + reactions[reaction] = { + count: Math.max(existing.count + 1, nextItems.length), + items: nextItems, + } + } + + if (action === "remove") { + const nextItems = items.filter((item) => item.uid !== uid) + const nextCount = Math.max(0, existing.count - (alreadyReacted ? 1 : 0)) + + if (nextCount === 0) { + delete reactions[reaction] + } else { + reactions[reaction] = { + count: nextItems.length || nextCount, + items: nextItems, + } + } + } + + return { ...message, reactions } + }) +} +``` + ### Sending messages {/* #sending-messages */} Publish messages to the channel using `sendMessage`. The first argument is the event name (which must match a permitted event in your token), and the second is an optional data payload: @@ -233,6 +349,6 @@ useEffect(() => { ## Putting it all together {/* #putting-it-all-together */} -The full flow is: the client resolves a session ID (from URL hash, localStorage, or a fresh one from the backend), connects both users with tokens granting publish and history access, loads existing chat messages by paginating through stored history via the Client HTTP API, then publishes and receives messages in real time. Chat messages are stored for 24 hours while typing indicators remain ephemeral. The session persists automatically — returning visitors see their previous conversation, and sharing the URL lets others join the same chat. +The full flow is: the client resolves a session ID (from URL hash, localStorage, or a fresh one from the backend), connects both users with tokens granting publish, reaction, and history access, loads existing chat messages by paginating through stored history via the Client HTTP API with `expandReactions: true`, then publishes and receives messages and reactions in real time. Chat messages are stored for 24 hours while typing indicators remain ephemeral. Reactions attach to stored chat messages, inherit the parent message lifetime, and are visible immediately to live subscribers and later to users who reload the same session. The session persists automatically — returning visitors see their previous conversation and past reactions, and sharing the URL lets others join the same chat. -For a deeper dive into each concept, see the [Client HTTP API](/docs/connections/client-http-api/) documentation, the [Message Storage (`store`)](/docs/connections/claims/#channels.messages.store) claim, the [History Access (`historyStart`)](/docs/connections/claims/#channels.historyStart) claim, and the [Client Messages](/docs/channels/client-messages/) documentation. +For a deeper dive into each concept, see the [Client HTTP API](/docs/connections/client-http-api/) documentation, the [Message Storage (`store`)](/docs/connections/claims/#channels.messages.store) claim, the [History Access (`historyStart`)](/docs/connections/claims/#channels.historyStart) claim, the [Message Reactions (`react`)](/docs/connections/claims/#channels.messages.react) claim, and the [Client Messages](/docs/channels/client-messages/) documentation. diff --git a/static/demos/real-time-chat/assets/index-BTCuFWzj.js b/static/demos/real-time-chat/assets/index-BTCuFWzj.js deleted file mode 100644 index 6fe53f7..0000000 --- a/static/demos/real-time-chat/assets/index-BTCuFWzj.js +++ /dev/null @@ -1,49 +0,0 @@ -var Hd=Object.defineProperty;var ts=l=>{throw TypeError(l)};var Bd=(l,t,u)=>t in l?Hd(l,t,{enumerable:!0,configurable:!0,writable:!0,value:u}):l[t]=u;var H=(l,t,u)=>Bd(l,typeof t!="symbol"?t+"":t,u),Si=(l,t,u)=>t.has(l)||ts("Cannot "+u);var b=(l,t,u)=>(Si(l,t,"read from private field"),u?u.call(l):t.get(l)),C=(l,t,u)=>t.has(l)?ts("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(l):t.set(l,u),x=(l,t,u,a)=>(Si(l,t,"write to private field"),a?a.call(l,u):t.set(l,u),u),Ei=(l,t,u)=>(Si(l,t,"access private method"),u);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))a(e);new MutationObserver(e=>{for(const n of e)if(n.type==="childList")for(const i of n.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&a(i)}).observe(document,{childList:!0,subtree:!0});function u(e){const n={};return e.integrity&&(n.integrity=e.integrity),e.referrerPolicy&&(n.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?n.credentials="include":e.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function a(e){if(e.ep)return;e.ep=!0;const n=u(e);fetch(e.href,n)}})();var Bo={exports:{}},Pn={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Yd=Symbol.for("react.transitional.element"),qd=Symbol.for("react.fragment");function Yo(l,t,u){var a=null;if(u!==void 0&&(a=""+u),t.key!==void 0&&(a=""+t.key),"key"in t){u={};for(var e in t)e!=="key"&&(u[e]=t[e])}else u=t;return t=u.ref,{$$typeof:Yd,type:l,key:a,ref:t!==void 0?t:null,props:u}}Pn.Fragment=qd;Pn.jsx=Yo;Pn.jsxs=Yo;Bo.exports=Pn;var gl=Bo.exports,qo={exports:{}},li={},xo={exports:{}},Go={};/** - * @license React - * scheduler.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */(function(l){function t(T,B){var N=T.length;T.push(B);l:for(;0>>1,hl=T[al];if(0>>1;ale(bi,N))iue(Le,bi)?(T[al]=Le,T[iu]=N,al=iu):(T[al]=bi,T[Ve]=N,al=Ve);else if(iue(Le,N))T[al]=Le,T[iu]=N,al=iu;else break l}}return B}function e(T,B){var N=T.sortIndex-B.sortIndex;return N!==0?N:T.id-B.id}if(l.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var n=performance;l.unstable_now=function(){return n.now()}}else{var i=Date,c=i.now();l.unstable_now=function(){return i.now()-c}}var f=[],h=[],v=1,m=null,r=3,y=!1,O=!1,z=!1,_=!1,o=typeof setTimeout=="function"?setTimeout:null,s=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;function g(T){for(var B=u(h);B!==null;){if(B.callback===null)a(h);else if(B.startTime<=T)a(h),B.sortIndex=B.expirationTime,t(f,B);else break;B=u(h)}}function E(T){if(z=!1,g(T),!O)if(u(f)!==null)O=!0,U||(U=!0,Nt());else{var B=u(h);B!==null&&gi(E,B.startTime-T)}}var U=!1,A=-1,M=5,ul=-1;function G(){return _?!0:!(l.unstable_now()-ulT&&G());){var al=m.callback;if(typeof al=="function"){m.callback=null,r=m.priorityLevel;var hl=al(m.expirationTime<=T);if(T=l.unstable_now(),typeof hl=="function"){m.callback=hl,g(T),B=!0;break t}m===u(f)&&a(f),g(T)}else a(f);m=u(f)}if(m!==null)B=!0;else{var Ze=u(h);Ze!==null&&gi(E,Ze.startTime-T),B=!1}}break l}finally{m=null,r=N,y=!1}B=void 0}}finally{B?Nt():U=!1}}}var Nt;if(typeof d=="function")Nt=function(){d(Zl)};else if(typeof MessageChannel<"u"){var ls=new MessageChannel,Nd=ls.port2;ls.port1.onmessage=Zl,Nt=function(){Nd.postMessage(null)}}else Nt=function(){o(Zl,0)};function gi(T,B){A=o(function(){T(l.unstable_now())},B)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(T){T.callback=null},l.unstable_forceFrameRate=function(T){0>T||125al?(T.sortIndex=N,t(h,T),u(f)===null&&T===u(h)&&(z?(s(A),A=-1):z=!0,gi(E,N-al))):(T.sortIndex=hl,t(f,T),O||y||(O=!0,U||(U=!0,Nt()))),T},l.unstable_shouldYield=G,l.unstable_wrapCallback=function(T){var B=r;return function(){var N=r;r=B;try{return T.apply(this,arguments)}finally{r=N}}}})(Go);xo.exports=Go;var xd=xo.exports,Xo={exports:{}},p={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Pc=Symbol.for("react.transitional.element"),Gd=Symbol.for("react.portal"),Xd=Symbol.for("react.fragment"),Cd=Symbol.for("react.strict_mode"),Qd=Symbol.for("react.profiler"),jd=Symbol.for("react.consumer"),Zd=Symbol.for("react.context"),Vd=Symbol.for("react.forward_ref"),Ld=Symbol.for("react.suspense"),Kd=Symbol.for("react.memo"),Co=Symbol.for("react.lazy"),us=Symbol.iterator;function Jd(l){return l===null||typeof l!="object"?null:(l=us&&l[us]||l["@@iterator"],typeof l=="function"?l:null)}var Qo={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},jo=Object.assign,Zo={};function Sa(l,t,u){this.props=l,this.context=t,this.refs=Zo,this.updater=u||Qo}Sa.prototype.isReactComponent={};Sa.prototype.setState=function(l,t){if(typeof l!="object"&&typeof l!="function"&&l!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,l,t,"setState")};Sa.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function Vo(){}Vo.prototype=Sa.prototype;function lf(l,t,u){this.props=l,this.context=t,this.refs=Zo,this.updater=u||Qo}var tf=lf.prototype=new Vo;tf.constructor=lf;jo(tf,Sa.prototype);tf.isPureReactComponent=!0;var as=Array.isArray,F={H:null,A:null,T:null,S:null,V:null},Lo=Object.prototype.hasOwnProperty;function uf(l,t,u,a,e,n){return u=n.ref,{$$typeof:Pc,type:l,key:t,ref:u!==void 0?u:null,props:n}}function wd(l,t){return uf(l.type,t,void 0,void 0,void 0,l.props)}function af(l){return typeof l=="object"&&l!==null&&l.$$typeof===Pc}function kd(l){var t={"=":"=0",":":"=2"};return"$"+l.replace(/[=:]/g,function(u){return t[u]})}var es=/\/+/g;function Ti(l,t){return typeof l=="object"&&l!==null&&l.key!=null?kd(""+l.key):t.toString(36)}function ns(){}function $d(l){switch(l.status){case"fulfilled":return l.value;case"rejected":throw l.reason;default:switch(typeof l.status=="string"?l.then(ns,ns):(l.status="pending",l.then(function(t){l.status==="pending"&&(l.status="fulfilled",l.value=t)},function(t){l.status==="pending"&&(l.status="rejected",l.reason=t)})),l.status){case"fulfilled":return l.value;case"rejected":throw l.reason}}throw l}function Ru(l,t,u,a,e){var n=typeof l;(n==="undefined"||n==="boolean")&&(l=null);var i=!1;if(l===null)i=!0;else switch(n){case"bigint":case"string":case"number":i=!0;break;case"object":switch(l.$$typeof){case Pc:case Gd:i=!0;break;case Co:return i=l._init,Ru(i(l._payload),t,u,a,e)}}if(i)return e=e(l),i=a===""?"."+Ti(l,0):a,as(e)?(u="",i!=null&&(u=i.replace(es,"$&/")+"/"),Ru(e,t,u,"",function(h){return h})):e!=null&&(af(e)&&(e=wd(e,u+(e.key==null||l&&l.key===e.key?"":(""+e.key).replace(es,"$&/")+"/")+i)),t.push(e)),1;i=0;var c=a===""?".":a+":";if(as(l))for(var f=0;f"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(wo)}catch(l){console.error(l)}}wo(),Ko.exports=_l;var t0=Ko.exports;/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ol=xd,ko=Tl,u0=t0;function S(l){var t="https://react.dev/errors/"+l;if(1qu||(l.current=sc[qu],sc[qu]=null,qu--)}function I(l,t){qu++,sc[qu]=l.current,l.current=t}var ft=ht(null),le=ht(null),wt=ht(null),Tn=ht(null);function An(l,t){switch(I(wt,t),I(le,l),I(ft,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?yo(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=yo(t),l=md(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}vl(ft),I(ft,l)}function fa(){vl(ft),vl(le),vl(wt)}function oc(l){l.memoizedState!==null&&I(Tn,l);var t=ft.current,u=md(t,l.type);t!==u&&(I(le,l),I(ft,u))}function zn(l){le.current===l&&(vl(ft),vl(le)),Tn.current===l&&(vl(Tn),oe._currentValue=ru)}var hc=Object.prototype.hasOwnProperty,cf=ol.unstable_scheduleCallback,Ai=ol.unstable_cancelCallback,f0=ol.unstable_shouldYield,s0=ol.unstable_requestPaint,st=ol.unstable_now,o0=ol.unstable_getCurrentPriorityLevel,lh=ol.unstable_ImmediatePriority,th=ol.unstable_UserBlockingPriority,On=ol.unstable_NormalPriority,h0=ol.unstable_LowPriority,uh=ol.unstable_IdlePriority,r0=ol.log,d0=ol.unstable_setDisableYieldValue,De=null,Gl=null;function Vt(l){if(typeof r0=="function"&&d0(l),Gl&&typeof Gl.setStrictMode=="function")try{Gl.setStrictMode(De,l)}catch{}}var Xl=Math.clz32?Math.clz32:m0,y0=Math.log,v0=Math.LN2;function m0(l){return l>>>=0,l===0?32:31-(y0(l)/v0|0)|0}var we=256,ke=4194304;function fu(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function ui(l,t,u){var a=l.pendingLanes;if(a===0)return 0;var e=0,n=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=a&134217727;return c!==0?(a=c&~n,a!==0?e=fu(a):(i&=c,i!==0?e=fu(i):u||(u=c&~l,u!==0&&(e=fu(u))))):(c=a&~n,c!==0?e=fu(c):i!==0?e=fu(i):u||(u=a&~l,u!==0&&(e=fu(u)))),e===0?0:t!==0&&t!==e&&!(t&n)&&(n=e&-e,u=t&-t,n>=u||n===32&&(u&4194048)!==0)?t:e}function Ue(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function g0(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ah(){var l=we;return we<<=1,!(we&4194048)&&(we=256),l}function eh(){var l=ke;return ke<<=1,!(ke&62914560)&&(ke=4194304),l}function zi(l){for(var t=[],u=0;31>u;u++)t.push(l);return t}function pe(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function b0(l,t,u,a,e,n){var i=l.pendingLanes;l.pendingLanes=u,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=u,l.entangledLanes&=u,l.errorRecoveryDisabledLanes&=u,l.shellSuspendCounter=0;var c=l.entanglements,f=l.expirationTimes,h=l.hiddenUpdates;for(u=i&~u;0)":-1e||f[a]!==h[e]){var v=` -`+f[a].replace(" at new "," at ");return l.displayName&&v.includes("")&&(v=v.replace("",l.displayName)),v}while(1<=a&&0<=e);break}}}finally{Mi=!1,Error.prepareStackTrace=u}return(u=l?l.displayName||l.name:"")?Nu(u):""}function O0(l){switch(l.tag){case 26:case 27:case 5:return Nu(l.type);case 16:return Nu("Lazy");case 13:return Nu("Suspense");case 19:return Nu("SuspenseList");case 0:case 15:return _i(l.type,!1);case 11:return _i(l.type.render,!1);case 1:return _i(l.type,!0);case 31:return Nu("Activity");default:return""}}function ds(l){try{var t="";do t+=O0(l),l=l.return;while(l);return t}catch(u){return` -Error generating stack: `+u.message+` -`+u.stack}}function Ll(l){switch(typeof l){case"bigint":case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function oh(l){var t=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function M0(l){var t=oh(l)?"checked":"value",u=Object.getOwnPropertyDescriptor(l.constructor.prototype,t),a=""+l[t];if(!l.hasOwnProperty(t)&&typeof u<"u"&&typeof u.get=="function"&&typeof u.set=="function"){var e=u.get,n=u.set;return Object.defineProperty(l,t,{configurable:!0,get:function(){return e.call(this)},set:function(i){a=""+i,n.call(this,i)}}),Object.defineProperty(l,t,{enumerable:u.enumerable}),{getValue:function(){return a},setValue:function(i){a=""+i},stopTracking:function(){l._valueTracker=null,delete l[t]}}}}function Mn(l){l._valueTracker||(l._valueTracker=M0(l))}function hh(l){if(!l)return!1;var t=l._valueTracker;if(!t)return!0;var u=t.getValue(),a="";return l&&(a=oh(l)?l.checked?"true":"false":l.value),l=a,l!==u?(t.setValue(l),!0):!1}function _n(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch{return l.body}}var _0=/[\n"\\]/g;function wl(l){return l.replace(_0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function dc(l,t,u,a,e,n,i,c){l.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?l.type=i:l.removeAttribute("type"),t!=null?i==="number"?(t===0&&l.value===""||l.value!=t)&&(l.value=""+Ll(t)):l.value!==""+Ll(t)&&(l.value=""+Ll(t)):i!=="submit"&&i!=="reset"||l.removeAttribute("value"),t!=null?yc(l,i,Ll(t)):u!=null?yc(l,i,Ll(u)):a!=null&&l.removeAttribute("value"),e==null&&n!=null&&(l.defaultChecked=!!n),e!=null&&(l.checked=e&&typeof e!="function"&&typeof e!="symbol"),c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?l.name=""+Ll(c):l.removeAttribute("name")}function rh(l,t,u,a,e,n,i,c){if(n!=null&&typeof n!="function"&&typeof n!="symbol"&&typeof n!="boolean"&&(l.type=n),t!=null||u!=null){if(!(n!=="submit"&&n!=="reset"||t!=null))return;u=u!=null?""+Ll(u):"",t=t!=null?""+Ll(t):u,c||t===l.value||(l.value=t),l.defaultValue=t}a=a??e,a=typeof a!="function"&&typeof a!="symbol"&&!!a,l.checked=c?l.checked:!!a,l.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(l.name=i)}function yc(l,t,u){t==="number"&&_n(l.ownerDocument)===l||l.defaultValue===""+u||(l.defaultValue=""+u)}function wu(l,t,u,a){if(l=l.options,t){t={};for(var e=0;e"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),mc=!1;if(_t)try{var Da={};Object.defineProperty(Da,"passive",{get:function(){mc=!0}}),window.addEventListener("test",Da,Da),window.removeEventListener("test",Da,Da)}catch{mc=!1}var Lt=null,df=null,sn=null;function gh(){if(sn)return sn;var l,t=df,u=t.length,a,e="value"in Lt?Lt.value:Lt.textContent,n=e.length;for(l=0;l=Qa),Es=" ",Ts=!1;function Sh(l,t){switch(l){case"keyup":return ly.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Eh(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var Xu=!1;function uy(l,t){switch(l){case"compositionend":return Eh(t);case"keypress":return t.which!==32?null:(Ts=!0,Es);case"textInput":return l=t.data,l===Es&&Ts?null:l;default:return null}}function ay(l,t){if(Xu)return l==="compositionend"||!vf&&Sh(l,t)?(l=gh(),sn=df=Lt=null,Xu=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:u,offset:t-l};l=a}l:{for(;u;){if(u.nextSibling){u=u.nextSibling;break l}u=u.parentNode}u=void 0}u=_s(u)}}function Oh(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?Oh(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function Mh(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=_n(l.document);t instanceof l.HTMLIFrameElement;){try{var u=typeof t.contentWindow.location.href=="string"}catch{u=!1}if(u)l=t.contentWindow;else break;t=_n(l.document)}return t}function mf(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var hy=_t&&"documentMode"in document&&11>=document.documentMode,Cu=null,gc=null,Za=null,bc=!1;function Us(l,t,u){var a=u.window===u?u.document:u.nodeType===9?u:u.ownerDocument;bc||Cu==null||Cu!==_n(a)||(a=Cu,"selectionStart"in a&&mf(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Za&&ae(Za,a)||(Za=a,a=Ln(gc,"onSelect"),0>=i,e-=i,St=1<<32-Xl(t)+e|u<n?n:8;var i=D.T,c={};D.T=c,Gf(l,!1,t,u);try{var f=e(),h=D.S;if(h!==null&&h(c,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var v=Ey(f,a);ka(l,t,v,Cl(l))}else ka(l,t,a,Cl(l))}catch(m){ka(l,t,{then:function(){},status:"rejected",reason:m},Cl())}finally{Z.p=n,D.T=i}}function My(){}function Nc(l,t,u,a){if(l.tag!==5)throw Error(S(476));var e=or(l).queue;sr(l,e,t,ru,u===null?My:function(){return hr(l),u(a)})}function or(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:ru,baseState:ru,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Dt,lastRenderedState:ru},next:null};var u={};return t.next={memoizedState:u,baseState:u,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Dt,lastRenderedState:u},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function hr(l){var t=or(l).next.queue;ka(l,t,{},Cl())}function xf(){return zl(oe)}function rr(){return cl().memoizedState}function dr(){return cl().memoizedState}function _y(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var u=Cl();l=kt(u);var a=$t(t,l,u);a!==null&&(Ql(a,t,u),Ka(a,t,u)),t={cache:Af()},l.payload=t;return}t=t.return}}function Dy(l,t,u){var a=Cl();u={lane:a,revertLane:0,action:u,hasEagerState:!1,eagerState:null,next:null},hi(l)?vr(t,u):(u=bf(l,t,u,a),u!==null&&(Ql(u,l,a),mr(u,t,a)))}function yr(l,t,u){var a=Cl();ka(l,t,u,a)}function ka(l,t,u,a){var e={lane:a,revertLane:0,action:u,hasEagerState:!1,eagerState:null,next:null};if(hi(l))vr(t,e);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var i=t.lastRenderedState,c=n(i,u);if(e.hasEagerState=!0,e.eagerState=c,jl(c,i))return ci(l,t,e,0),k===null&&ii(),!1}catch{}finally{}if(u=bf(l,t,e,a),u!==null)return Ql(u,l,a),mr(u,t,a),!0}return!1}function Gf(l,t,u,a){if(a={lane:2,revertLane:Kf(),action:a,hasEagerState:!1,eagerState:null,next:null},hi(l)){if(t)throw Error(S(479))}else t=bf(l,u,a,2),t!==null&&Ql(t,l,2)}function hi(l){var t=l.alternate;return l===R||t!==null&&t===R}function vr(l,t){Wu=Hn=!0;var u=l.pending;u===null?t.next=t:(t.next=u.next,u.next=t),l.pending=t}function mr(l,t,u){if(u&4194048){var a=t.lanes;a&=l.pendingLanes,u|=a,t.lanes=u,ih(l,u)}}var Yn={readContext:zl,use:si,useCallback:el,useContext:el,useEffect:el,useImperativeHandle:el,useLayoutEffect:el,useInsertionEffect:el,useMemo:el,useReducer:el,useRef:el,useState:el,useDebugValue:el,useDeferredValue:el,useTransition:el,useSyncExternalStore:el,useId:el,useHostTransitionStatus:el,useFormState:el,useActionState:el,useOptimistic:el,useMemoCache:el,useCacheRefresh:el},gr={readContext:zl,use:si,useCallback:function(l,t){return Dl().memoizedState=[l,t===void 0?null:t],l},useContext:zl,useEffect:Ls,useImperativeHandle:function(l,t,u){u=u!=null?u.concat([l]):null,yn(4194308,4,er.bind(null,t,l),u)},useLayoutEffect:function(l,t){return yn(4194308,4,l,t)},useInsertionEffect:function(l,t){yn(4,2,l,t)},useMemo:function(l,t){var u=Dl();t=t===void 0?null:t;var a=l();if(Tu){Vt(!0);try{l()}finally{Vt(!1)}}return u.memoizedState=[a,t],a},useReducer:function(l,t,u){var a=Dl();if(u!==void 0){var e=u(t);if(Tu){Vt(!0);try{u(t)}finally{Vt(!1)}}}else e=t;return a.memoizedState=a.baseState=e,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:e},a.queue=l,l=l.dispatch=Dy.bind(null,R,l),[a.memoizedState,l]},useRef:function(l){var t=Dl();return l={current:l},t.memoizedState=l},useState:function(l){l=pc(l);var t=l.queue,u=yr.bind(null,R,t);return t.dispatch=u,[l.memoizedState,u]},useDebugValue:Yf,useDeferredValue:function(l,t){var u=Dl();return qf(u,l,t)},useTransition:function(){var l=pc(!1);return l=sr.bind(null,R,l.queue,!0,!1),Dl().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,u){var a=R,e=Dl();if(j){if(u===void 0)throw Error(S(407));u=u()}else{if(u=t(),k===null)throw Error(S(349));X&124||Lh(a,t,u)}e.memoizedState=u;var n={value:u,getSnapshot:t};return e.queue=n,Ls(Jh.bind(null,a,n,l),[l]),a.flags|=2048,da(9,oi(),Kh.bind(null,a,n,u,t),null),u},useId:function(){var l=Dl(),t=k.identifierPrefix;if(j){var u=Et,a=St;u=(a&~(1<<32-Xl(a)-1)).toString(32)+u,t="«"+t+"R"+u,u=Bn++,0M?(ul=A,A=null):ul=A.sibling;var G=r(o,A,d[M],g);if(G===null){A===null&&(A=ul);break}l&&A&&G.alternate===null&&t(o,A),s=n(G,s,M),U===null?E=G:U.sibling=G,U=G,A=ul}if(M===d.length)return u(o,A),j&&su(o,M),E;if(A===null){for(;MM?(ul=A,A=null):ul=A.sibling;var Zl=r(o,A,G.value,g);if(Zl===null){A===null&&(A=ul);break}l&&A&&Zl.alternate===null&&t(o,A),s=n(Zl,s,M),U===null?E=Zl:U.sibling=Zl,U=Zl,A=ul}if(G.done)return u(o,A),j&&su(o,M),E;if(A===null){for(;!G.done;M++,G=d.next())G=m(o,G.value,g),G!==null&&(s=n(G,s,M),U===null?E=G:U.sibling=G,U=G);return j&&su(o,M),E}for(A=a(A);!G.done;M++,G=d.next())G=y(A,o,M,G.value,g),G!==null&&(l&&G.alternate!==null&&A.delete(G.key===null?M:G.key),s=n(G,s,M),U===null?E=G:U.sibling=G,U=G);return l&&A.forEach(function(Nt){return t(o,Nt)}),j&&su(o,M),E}function _(o,s,d,g){if(typeof d=="object"&&d!==null&&d.type===Yu&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case Je:l:{for(var E=d.key;s!==null;){if(s.key===E){if(E=d.type,E===Yu){if(s.tag===7){u(o,s.sibling),g=e(s,d.props.children),g.return=o,o=g;break l}}else if(s.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===qt&&Ks(E)===s.type){u(o,s.sibling),g=e(s,d.props),Ra(g,d),g.return=o,o=g;break l}u(o,s);break}else t(o,s);s=s.sibling}d.type===Yu?(g=du(d.props.children,o.mode,g,d.key),g.return=o,o=g):(g=hn(d.type,d.key,d.props,null,o.mode,g),Ra(g,d),g.return=o,o=g)}return i(o);case Ya:l:{for(E=d.key;s!==null;){if(s.key===E)if(s.tag===4&&s.stateNode.containerInfo===d.containerInfo&&s.stateNode.implementation===d.implementation){u(o,s.sibling),g=e(s,d.children||[]),g.return=o,o=g;break l}else{u(o,s);break}else t(o,s);s=s.sibling}g=qi(d,o.mode,g),g.return=o,o=g}return i(o);case qt:return E=d._init,d=E(d._payload),_(o,s,d,g)}if(qa(d))return O(o,s,d,g);if(_a(d)){if(E=_a(d),typeof E!="function")throw Error(S(150));return d=E.call(d),z(o,s,d,g)}if(typeof d.then=="function")return _(o,s,Pe(d),g);if(d.$$typeof===bt)return _(o,s,Fe(o,d),g);ln(o,d)}return typeof d=="string"&&d!==""||typeof d=="number"||typeof d=="bigint"?(d=""+d,s!==null&&s.tag===6?(u(o,s.sibling),g=e(s,d),g.return=o,o=g):(u(o,s),g=Yi(d,o.mode,g),g.return=o,o=g),i(o)):u(o,s)}return function(o,s,d,g){try{ie=0;var E=_(o,s,d,g);return Iu=null,E}catch(A){if(A===qe||A===fi)throw A;var U=xl(29,A,null,o.mode);return U.lanes=g,U.return=o,U}finally{}}}var ya=Sr(!0),Er=Sr(!1),Wl=ht(null),ot=null;function Xt(l){var t=l.alternate;I(sl,sl.current&1),I(Wl,l),ot===null&&(t===null||ra.current!==null||t.memoizedState!==null)&&(ot=l)}function Tr(l){if(l.tag===22){if(I(sl,sl.current),I(Wl,l),ot===null){var t=l.alternate;t!==null&&t.memoizedState!==null&&(ot=l)}}else Ct()}function Ct(){I(sl,sl.current),I(Wl,Wl.current)}function At(l){vl(Wl),ot===l&&(ot=null),vl(sl)}var sl=ht(0);function qn(l){for(var t=l;t!==null;){if(t.tag===13){var u=t.memoizedState;if(u!==null&&(u=u.dehydrated,u===null||u.data==="$?"||kc(u)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===l)break;for(;t.sibling===null;){if(t.return===null||t.return===l)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function Xi(l,t,u,a){t=l.memoizedState,u=u(a,t),u=u==null?t:$({},t,u),l.memoizedState=u,l.lanes===0&&(l.updateQueue.baseState=u)}var Hc={enqueueSetState:function(l,t,u){l=l._reactInternals;var a=Cl(),e=kt(a);e.payload=t,u!=null&&(e.callback=u),t=$t(l,e,a),t!==null&&(Ql(t,l,a),Ka(t,l,a))},enqueueReplaceState:function(l,t,u){l=l._reactInternals;var a=Cl(),e=kt(a);e.tag=1,e.payload=t,u!=null&&(e.callback=u),t=$t(l,e,a),t!==null&&(Ql(t,l,a),Ka(t,l,a))},enqueueForceUpdate:function(l,t){l=l._reactInternals;var u=Cl(),a=kt(u);a.tag=2,t!=null&&(a.callback=t),t=$t(l,a,u),t!==null&&(Ql(t,l,u),Ka(t,l,u))}};function Js(l,t,u,a,e,n,i){return l=l.stateNode,typeof l.shouldComponentUpdate=="function"?l.shouldComponentUpdate(a,n,i):t.prototype&&t.prototype.isPureReactComponent?!ae(u,a)||!ae(e,n):!0}function ws(l,t,u,a){l=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(u,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(u,a),t.state!==l&&Hc.enqueueReplaceState(t,t.state,null)}function Au(l,t){var u=t;if("ref"in t){u={};for(var a in t)a!=="ref"&&(u[a]=t[a])}if(l=l.defaultProps){u===t&&(u=$({},u));for(var e in l)u[e]===void 0&&(u[e]=l[e])}return u}var xn=typeof reportError=="function"?reportError:function(l){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof l=="object"&&l!==null&&typeof l.message=="string"?String(l.message):String(l),error:l});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",l);return}console.error(l)};function Ar(l){xn(l)}function zr(l){console.error(l)}function Or(l){xn(l)}function Gn(l,t){try{var u=l.onUncaughtError;u(t.value,{componentStack:t.stack})}catch(a){setTimeout(function(){throw a})}}function ks(l,t,u){try{var a=l.onCaughtError;a(u.value,{componentStack:u.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(e){setTimeout(function(){throw e})}}function Bc(l,t,u){return u=kt(u),u.tag=3,u.payload={element:null},u.callback=function(){Gn(l,t)},u}function Mr(l){return l=kt(l),l.tag=3,l}function _r(l,t,u,a){var e=u.type.getDerivedStateFromError;if(typeof e=="function"){var n=a.value;l.payload=function(){return e(n)},l.callback=function(){ks(t,u,a)}}var i=u.stateNode;i!==null&&typeof i.componentDidCatch=="function"&&(l.callback=function(){ks(t,u,a),typeof e!="function"&&(Wt===null?Wt=new Set([this]):Wt.add(this));var c=a.stack;this.componentDidCatch(a.value,{componentStack:c!==null?c:""})})}function py(l,t,u,a,e){if(u.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(t=u.alternate,t!==null&&Be(t,u,e,!0),u=Wl.current,u!==null){switch(u.tag){case 13:return ot===null?jc():u.alternate===null&&tl===0&&(tl=3),u.flags&=-257,u.flags|=65536,u.lanes=e,a===Mc?u.flags|=16384:(t=u.updateQueue,t===null?u.updateQueue=new Set([a]):t.add(a),$i(l,a,e)),!1;case 22:return u.flags|=65536,a===Mc?u.flags|=16384:(t=u.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([a])},u.updateQueue=t):(u=t.retryQueue,u===null?t.retryQueue=new Set([a]):u.add(a)),$i(l,a,e)),!1}throw Error(S(435,u.tag))}return $i(l,a,e),jc(),!1}if(j)return t=Wl.current,t!==null?(!(t.flags&65536)&&(t.flags|=256),t.flags|=65536,t.lanes=e,a!==Ec&&(l=Error(S(422),{cause:a}),ee(kl(l,u)))):(a!==Ec&&(t=Error(S(423),{cause:a}),ee(kl(t,u))),l=l.current.alternate,l.flags|=65536,e&=-e,l.lanes|=e,a=kl(a,u),e=Bc(l.stateNode,a,e),xi(l,e),tl!==4&&(tl=2)),!1;var n=Error(S(520),{cause:a});if(n=kl(n,u),Fa===null?Fa=[n]:Fa.push(n),tl!==4&&(tl=2),t===null)return!0;a=kl(a,u),u=t;do{switch(u.tag){case 3:return u.flags|=65536,l=e&-e,u.lanes|=l,l=Bc(u.stateNode,a,l),xi(u,l),!1;case 1:if(t=u.type,n=u.stateNode,(u.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||n!==null&&typeof n.componentDidCatch=="function"&&(Wt===null||!Wt.has(n))))return u.flags|=65536,e&=-e,u.lanes|=e,e=Mr(e),_r(e,l,u,a),xi(u,e),!1}u=u.return}while(u!==null);return!1}var Dr=Error(S(461)),yl=!1;function bl(l,t,u,a){t.child=l===null?Er(t,null,u,a):ya(t,l.child,u,a)}function $s(l,t,u,a,e){u=u.render;var n=t.ref;if("ref"in a){var i={};for(var c in a)c!=="ref"&&(i[c]=a[c])}else i=a;return Eu(t),a=Df(l,t,u,i,n,e),c=Uf(),l!==null&&!yl?(pf(l,t,e),Ut(l,t,e)):(j&&c&&Ef(t),t.flags|=1,bl(l,t,a,e),t.child)}function Ws(l,t,u,a,e){if(l===null){var n=u.type;return typeof n=="function"&&!Sf(n)&&n.defaultProps===void 0&&u.compare===null?(t.tag=15,t.type=n,Ur(l,t,n,a,e)):(l=hn(u.type,null,a,t,t.mode,e),l.ref=t.ref,l.return=t,t.child=l)}if(n=l.child,!Xf(l,e)){var i=n.memoizedProps;if(u=u.compare,u=u!==null?u:ae,u(i,a)&&l.ref===t.ref)return Ut(l,t,e)}return t.flags|=1,l=Ot(n,a),l.ref=t.ref,l.return=t,t.child=l}function Ur(l,t,u,a,e){if(l!==null){var n=l.memoizedProps;if(ae(n,a)&&l.ref===t.ref)if(yl=!1,t.pendingProps=a=n,Xf(l,e))l.flags&131072&&(yl=!0);else return t.lanes=l.lanes,Ut(l,t,e)}return Yc(l,t,u,a,e)}function pr(l,t,u){var a=t.pendingProps,e=a.children,n=l!==null?l.memoizedState:null;if(a.mode==="hidden"){if(t.flags&128){if(a=n!==null?n.baseLanes|u:u,l!==null){for(e=t.child=l.child,n=0;e!==null;)n=n|e.lanes|e.childLanes,e=e.sibling;t.childLanes=n&~a}else t.childLanes=0,t.child=null;return Fs(l,t,a,u)}if(u&536870912)t.memoizedState={baseLanes:0,cachePool:null},l!==null&&rn(t,n!==null?n.cachePool:null),n!==null?Xs(t,n):Uc(),Tr(t);else return t.lanes=t.childLanes=536870912,Fs(l,t,n!==null?n.baseLanes|u:u,u)}else n!==null?(rn(t,n.cachePool),Xs(t,n),Ct(),t.memoizedState=null):(l!==null&&rn(t,null),Uc(),Ct());return bl(l,t,e,u),t.child}function Fs(l,t,u,a){var e=zf();return e=e===null?null:{parent:fl._currentValue,pool:e},t.memoizedState={baseLanes:u,cachePool:e},l!==null&&rn(t,null),Uc(),Tr(t),l!==null&&Be(l,t,a,!0),null}function vn(l,t){var u=t.ref;if(u===null)l!==null&&l.ref!==null&&(t.flags|=4194816);else{if(typeof u!="function"&&typeof u!="object")throw Error(S(284));(l===null||l.ref!==u)&&(t.flags|=4194816)}}function Yc(l,t,u,a,e){return Eu(t),u=Df(l,t,u,a,void 0,e),a=Uf(),l!==null&&!yl?(pf(l,t,e),Ut(l,t,e)):(j&&a&&Ef(t),t.flags|=1,bl(l,t,u,e),t.child)}function Is(l,t,u,a,e,n){return Eu(t),t.updateQueue=null,u=Zh(t,a,u,e),jh(l),a=Uf(),l!==null&&!yl?(pf(l,t,n),Ut(l,t,n)):(j&&a&&Ef(t),t.flags|=1,bl(l,t,u,n),t.child)}function Ps(l,t,u,a,e){if(Eu(t),t.stateNode===null){var n=Zu,i=u.contextType;typeof i=="object"&&i!==null&&(n=zl(i)),n=new u(a,n),t.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,n.updater=Hc,t.stateNode=n,n._reactInternals=t,n=t.stateNode,n.props=a,n.state=t.memoizedState,n.refs={},Of(t),i=u.contextType,n.context=typeof i=="object"&&i!==null?zl(i):Zu,n.state=t.memoizedState,i=u.getDerivedStateFromProps,typeof i=="function"&&(Xi(t,u,i,a),n.state=t.memoizedState),typeof u.getDerivedStateFromProps=="function"||typeof n.getSnapshotBeforeUpdate=="function"||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(i=n.state,typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount(),i!==n.state&&Hc.enqueueReplaceState(n,n.state,null),wa(t,a,n,e),Ja(),n.state=t.memoizedState),typeof n.componentDidMount=="function"&&(t.flags|=4194308),a=!0}else if(l===null){n=t.stateNode;var c=t.memoizedProps,f=Au(u,c);n.props=f;var h=n.context,v=u.contextType;i=Zu,typeof v=="object"&&v!==null&&(i=zl(v));var m=u.getDerivedStateFromProps;v=typeof m=="function"||typeof n.getSnapshotBeforeUpdate=="function",c=t.pendingProps!==c,v||typeof n.UNSAFE_componentWillReceiveProps!="function"&&typeof n.componentWillReceiveProps!="function"||(c||h!==i)&&ws(t,n,a,i),xt=!1;var r=t.memoizedState;n.state=r,wa(t,a,n,e),Ja(),h=t.memoizedState,c||r!==h||xt?(typeof m=="function"&&(Xi(t,u,m,a),h=t.memoizedState),(f=xt||Js(t,u,f,a,r,h,i))?(v||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount()),typeof n.componentDidMount=="function"&&(t.flags|=4194308)):(typeof n.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=h),n.props=a,n.state=h,n.context=i,a=f):(typeof n.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{n=t.stateNode,_c(l,t),i=t.memoizedProps,v=Au(u,i),n.props=v,m=t.pendingProps,r=n.context,h=u.contextType,f=Zu,typeof h=="object"&&h!==null&&(f=zl(h)),c=u.getDerivedStateFromProps,(h=typeof c=="function"||typeof n.getSnapshotBeforeUpdate=="function")||typeof n.UNSAFE_componentWillReceiveProps!="function"&&typeof n.componentWillReceiveProps!="function"||(i!==m||r!==f)&&ws(t,n,a,f),xt=!1,r=t.memoizedState,n.state=r,wa(t,a,n,e),Ja();var y=t.memoizedState;i!==m||r!==y||xt||l!==null&&l.dependencies!==null&&Rn(l.dependencies)?(typeof c=="function"&&(Xi(t,u,c,a),y=t.memoizedState),(v=xt||Js(t,u,v,a,r,y,f)||l!==null&&l.dependencies!==null&&Rn(l.dependencies))?(h||typeof n.UNSAFE_componentWillUpdate!="function"&&typeof n.componentWillUpdate!="function"||(typeof n.componentWillUpdate=="function"&&n.componentWillUpdate(a,y,f),typeof n.UNSAFE_componentWillUpdate=="function"&&n.UNSAFE_componentWillUpdate(a,y,f)),typeof n.componentDidUpdate=="function"&&(t.flags|=4),typeof n.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof n.componentDidUpdate!="function"||i===l.memoizedProps&&r===l.memoizedState||(t.flags|=4),typeof n.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&r===l.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=y),n.props=a,n.state=y,n.context=f,a=v):(typeof n.componentDidUpdate!="function"||i===l.memoizedProps&&r===l.memoizedState||(t.flags|=4),typeof n.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&r===l.memoizedState||(t.flags|=1024),a=!1)}return n=a,vn(l,t),a=(t.flags&128)!==0,n||a?(n=t.stateNode,u=a&&typeof u.getDerivedStateFromError!="function"?null:n.render(),t.flags|=1,l!==null&&a?(t.child=ya(t,l.child,null,e),t.child=ya(t,null,u,e)):bl(l,t,u,e),t.memoizedState=n.state,l=t.child):l=Ut(l,t,e),l}function lo(l,t,u,a){return He(),t.flags|=256,bl(l,t,u,a),t.child}var Ci={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Qi(l){return{baseLanes:l,cachePool:xh()}}function ji(l,t,u){return l=l!==null?l.childLanes&~u:0,t&&(l|=$l),l}function Rr(l,t,u){var a=t.pendingProps,e=!1,n=(t.flags&128)!==0,i;if((i=n)||(i=l!==null&&l.memoizedState===null?!1:(sl.current&2)!==0),i&&(e=!0,t.flags&=-129),i=(t.flags&32)!==0,t.flags&=-33,l===null){if(j){if(e?Xt(t):Ct(),j){var c=ll,f;if(f=c){l:{for(f=c,c=it;f.nodeType!==8;){if(!c){c=null;break l}if(f=lt(f.nextSibling),f===null){c=null;break l}}c=f}c!==null?(t.memoizedState={dehydrated:c,treeContext:yu!==null?{id:St,overflow:Et}:null,retryLane:536870912,hydrationErrors:null},f=xl(18,null,null,0),f.stateNode=c,f.return=t,t.child=f,Ol=t,ll=null,f=!0):f=!1}f||Su(t)}if(c=t.memoizedState,c!==null&&(c=c.dehydrated,c!==null))return kc(c)?t.lanes=32:t.lanes=536870912,null;At(t)}return c=a.children,a=a.fallback,e?(Ct(),e=t.mode,c=Xn({mode:"hidden",children:c},e),a=du(a,e,u,null),c.return=t,a.return=t,c.sibling=a,t.child=c,e=t.child,e.memoizedState=Qi(u),e.childLanes=ji(l,i,u),t.memoizedState=Ci,a):(Xt(t),qc(t,c))}if(f=l.memoizedState,f!==null&&(c=f.dehydrated,c!==null)){if(n)t.flags&256?(Xt(t),t.flags&=-257,t=Zi(l,t,u)):t.memoizedState!==null?(Ct(),t.child=l.child,t.flags|=128,t=null):(Ct(),e=a.fallback,c=t.mode,a=Xn({mode:"visible",children:a.children},c),e=du(e,c,u,null),e.flags|=2,a.return=t,e.return=t,a.sibling=e,t.child=a,ya(t,l.child,null,u),a=t.child,a.memoizedState=Qi(u),a.childLanes=ji(l,i,u),t.memoizedState=Ci,t=e);else if(Xt(t),kc(c)){if(i=c.nextSibling&&c.nextSibling.dataset,i)var h=i.dgst;i=h,a=Error(S(419)),a.stack="",a.digest=i,ee({value:a,source:null,stack:null}),t=Zi(l,t,u)}else if(yl||Be(l,t,u,!1),i=(u&l.childLanes)!==0,yl||i){if(i=k,i!==null&&(a=u&-u,a=a&42?1:ff(a),a=a&(i.suspendedLanes|u)?0:a,a!==0&&a!==f.retryLane))throw f.retryLane=a,Aa(l,a),Ql(i,l,a),Dr;c.data==="$?"||jc(),t=Zi(l,t,u)}else c.data==="$?"?(t.flags|=192,t.child=l.child,t=null):(l=f.treeContext,ll=lt(c.nextSibling),Ol=t,j=!0,vu=null,it=!1,l!==null&&(Kl[Jl++]=St,Kl[Jl++]=Et,Kl[Jl++]=yu,St=l.id,Et=l.overflow,yu=t),t=qc(t,a.children),t.flags|=4096);return t}return e?(Ct(),e=a.fallback,c=t.mode,f=l.child,h=f.sibling,a=Ot(f,{mode:"hidden",children:a.children}),a.subtreeFlags=f.subtreeFlags&65011712,h!==null?e=Ot(h,e):(e=du(e,c,u,null),e.flags|=2),e.return=t,a.return=t,a.sibling=e,t.child=a,a=e,e=t.child,c=l.child.memoizedState,c===null?c=Qi(u):(f=c.cachePool,f!==null?(h=fl._currentValue,f=f.parent!==h?{parent:h,pool:h}:f):f=xh(),c={baseLanes:c.baseLanes|u,cachePool:f}),e.memoizedState=c,e.childLanes=ji(l,i,u),t.memoizedState=Ci,a):(Xt(t),u=l.child,l=u.sibling,u=Ot(u,{mode:"visible",children:a.children}),u.return=t,u.sibling=null,l!==null&&(i=t.deletions,i===null?(t.deletions=[l],t.flags|=16):i.push(l)),t.child=u,t.memoizedState=null,u)}function qc(l,t){return t=Xn({mode:"visible",children:t},l.mode),t.return=l,l.child=t}function Xn(l,t){return l=xl(22,l,null,t),l.lanes=0,l.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},l}function Zi(l,t,u){return ya(t,l.child,null,u),l=qc(t,t.pendingProps.children),l.flags|=2,t.memoizedState=null,l}function to(l,t,u){l.lanes|=t;var a=l.alternate;a!==null&&(a.lanes|=t),Ac(l.return,t,u)}function Vi(l,t,u,a,e){var n=l.memoizedState;n===null?l.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:u,tailMode:e}:(n.isBackwards=t,n.rendering=null,n.renderingStartTime=0,n.last=a,n.tail=u,n.tailMode=e)}function Nr(l,t,u){var a=t.pendingProps,e=a.revealOrder,n=a.tail;if(bl(l,t,a.children,u),a=sl.current,a&2)a=a&1|2,t.flags|=128;else{if(l!==null&&l.flags&128)l:for(l=t.child;l!==null;){if(l.tag===13)l.memoizedState!==null&&to(l,u,t);else if(l.tag===19)to(l,u,t);else if(l.child!==null){l.child.return=l,l=l.child;continue}if(l===t)break l;for(;l.sibling===null;){if(l.return===null||l.return===t)break l;l=l.return}l.sibling.return=l.return,l=l.sibling}a&=1}switch(I(sl,a),e){case"forwards":for(u=t.child,e=null;u!==null;)l=u.alternate,l!==null&&qn(l)===null&&(e=u),u=u.sibling;u=e,u===null?(e=t.child,t.child=null):(e=u.sibling,u.sibling=null),Vi(t,!1,e,u,n);break;case"backwards":for(u=null,e=t.child,t.child=null;e!==null;){if(l=e.alternate,l!==null&&qn(l)===null){t.child=e;break}l=e.sibling,e.sibling=u,u=e,e=l}Vi(t,!0,u,null,n);break;case"together":Vi(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Ut(l,t,u){if(l!==null&&(t.dependencies=l.dependencies),au|=t.lanes,!(u&t.childLanes))if(l!==null){if(Be(l,t,u,!1),(u&t.childLanes)===0)return null}else return null;if(l!==null&&t.child!==l.child)throw Error(S(153));if(t.child!==null){for(l=t.child,u=Ot(l,l.pendingProps),t.child=u,u.return=t;l.sibling!==null;)l=l.sibling,u=u.sibling=Ot(l,l.pendingProps),u.return=t;u.sibling=null}return t.child}function Xf(l,t){return l.lanes&t?!0:(l=l.dependencies,!!(l!==null&&Rn(l)))}function Ry(l,t,u){switch(t.tag){case 3:An(t,t.stateNode.containerInfo),Gt(t,fl,l.memoizedState.cache),He();break;case 27:case 5:oc(t);break;case 4:An(t,t.stateNode.containerInfo);break;case 10:Gt(t,t.type,t.memoizedProps.value);break;case 13:var a=t.memoizedState;if(a!==null)return a.dehydrated!==null?(Xt(t),t.flags|=128,null):u&t.child.childLanes?Rr(l,t,u):(Xt(t),l=Ut(l,t,u),l!==null?l.sibling:null);Xt(t);break;case 19:var e=(l.flags&128)!==0;if(a=(u&t.childLanes)!==0,a||(Be(l,t,u,!1),a=(u&t.childLanes)!==0),e){if(a)return Nr(l,t,u);t.flags|=128}if(e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null,e.lastEffect=null),I(sl,sl.current),a)break;return null;case 22:case 23:return t.lanes=0,pr(l,t,u);case 24:Gt(t,fl,l.memoizedState.cache)}return Ut(l,t,u)}function Hr(l,t,u){if(l!==null)if(l.memoizedProps!==t.pendingProps)yl=!0;else{if(!Xf(l,u)&&!(t.flags&128))return yl=!1,Ry(l,t,u);yl=!!(l.flags&131072)}else yl=!1,j&&t.flags&1048576&&Yh(t,pn,t.index);switch(t.lanes=0,t.tag){case 16:l:{l=t.pendingProps;var a=t.elementType,e=a._init;if(a=e(a._payload),t.type=a,typeof a=="function")Sf(a)?(l=Au(a,l),t.tag=1,t=Ps(null,t,a,l,u)):(t.tag=0,t=Yc(null,t,a,l,u));else{if(a!=null){if(e=a.$$typeof,e===ef){t.tag=11,t=$s(null,t,a,l,u);break l}else if(e===nf){t.tag=14,t=Ws(null,t,a,l,u);break l}}throw t=fc(a)||a,Error(S(306,t,""))}}return t;case 0:return Yc(l,t,t.type,t.pendingProps,u);case 1:return a=t.type,e=Au(a,t.pendingProps),Ps(l,t,a,e,u);case 3:l:{if(An(t,t.stateNode.containerInfo),l===null)throw Error(S(387));a=t.pendingProps;var n=t.memoizedState;e=n.element,_c(l,t),wa(t,a,null,u);var i=t.memoizedState;if(a=i.cache,Gt(t,fl,a),a!==n.cache&&zc(t,[fl],u,!0),Ja(),a=i.element,n.isDehydrated)if(n={element:a,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=n,t.memoizedState=n,t.flags&256){t=lo(l,t,a,u);break l}else if(a!==e){e=kl(Error(S(424)),t),ee(e),t=lo(l,t,a,u);break l}else{switch(l=t.stateNode.containerInfo,l.nodeType){case 9:l=l.body;break;default:l=l.nodeName==="HTML"?l.ownerDocument.body:l}for(ll=lt(l.firstChild),Ol=t,j=!0,vu=null,it=!0,u=Er(t,null,a,u),t.child=u;u;)u.flags=u.flags&-3|4096,u=u.sibling}else{if(He(),a===e){t=Ut(l,t,u);break l}bl(l,t,a,u)}t=t.child}return t;case 26:return vn(l,t),l===null?(u=So(t.type,null,t.pendingProps,null))?t.memoizedState=u:j||(u=t.type,l=t.pendingProps,a=Kn(wt.current).createElement(u),a[Al]=t,a[Rl]=l,El(a,u,l),dl(a),t.stateNode=a):t.memoizedState=So(t.type,l.memoizedProps,t.pendingProps,l.memoizedState),null;case 27:return oc(t),l===null&&j&&(a=t.stateNode=bd(t.type,t.pendingProps,wt.current),Ol=t,it=!0,e=ll,nu(t.type)?($c=e,ll=lt(a.firstChild)):ll=e),bl(l,t,t.pendingProps.children,u),vn(l,t),l===null&&(t.flags|=4194304),t.child;case 5:return l===null&&j&&((e=a=ll)&&(a=ev(a,t.type,t.pendingProps,it),a!==null?(t.stateNode=a,Ol=t,ll=lt(a.firstChild),it=!1,e=!0):e=!1),e||Su(t)),oc(t),e=t.type,n=t.pendingProps,i=l!==null?l.memoizedProps:null,a=n.children,Jc(e,n)?a=null:i!==null&&Jc(e,i)&&(t.flags|=32),t.memoizedState!==null&&(e=Df(l,t,Ay,null,null,u),oe._currentValue=e),vn(l,t),bl(l,t,a,u),t.child;case 6:return l===null&&j&&((l=u=ll)&&(u=nv(u,t.pendingProps,it),u!==null?(t.stateNode=u,Ol=t,ll=null,l=!0):l=!1),l||Su(t)),null;case 13:return Rr(l,t,u);case 4:return An(t,t.stateNode.containerInfo),a=t.pendingProps,l===null?t.child=ya(t,null,a,u):bl(l,t,a,u),t.child;case 11:return $s(l,t,t.type,t.pendingProps,u);case 7:return bl(l,t,t.pendingProps,u),t.child;case 8:return bl(l,t,t.pendingProps.children,u),t.child;case 12:return bl(l,t,t.pendingProps.children,u),t.child;case 10:return a=t.pendingProps,Gt(t,t.type,a.value),bl(l,t,a.children,u),t.child;case 9:return e=t.type._context,a=t.pendingProps.children,Eu(t),e=zl(e),a=a(e),t.flags|=1,bl(l,t,a,u),t.child;case 14:return Ws(l,t,t.type,t.pendingProps,u);case 15:return Ur(l,t,t.type,t.pendingProps,u);case 19:return Nr(l,t,u);case 31:return a=t.pendingProps,u=t.mode,a={mode:a.mode,children:a.children},l===null?(u=Xn(a,u),u.ref=t.ref,t.child=u,u.return=t,t=u):(u=Ot(l.child,a),u.ref=t.ref,t.child=u,u.return=t,t=u),t;case 22:return pr(l,t,u);case 24:return Eu(t),a=zl(fl),l===null?(e=zf(),e===null&&(e=k,n=Af(),e.pooledCache=n,n.refCount++,n!==null&&(e.pooledCacheLanes|=u),e=n),t.memoizedState={parent:a,cache:e},Of(t),Gt(t,fl,e)):(l.lanes&u&&(_c(l,t),wa(t,null,null,u),Ja()),e=l.memoizedState,n=t.memoizedState,e.parent!==a?(e={parent:a,cache:a},t.memoizedState=e,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=e),Gt(t,fl,a)):(a=n.cache,Gt(t,fl,a),a!==e.cache&&zc(t,[fl],u,!0))),bl(l,t,t.pendingProps.children,u),t.child;case 29:throw t.pendingProps}throw Error(S(156,t.tag))}function yt(l){l.flags|=4}function uo(l,t){if(t.type!=="stylesheet"||t.state.loading&4)l.flags&=-16777217;else if(l.flags|=16777216,!Td(t)){if(t=Wl.current,t!==null&&((X&4194048)===X?ot!==null:(X&62914560)!==X&&!(X&536870912)||t!==ot))throw La=Mc,Gh;l.flags|=8192}}function tn(l,t){t!==null&&(l.flags|=4),l.flags&16384&&(t=l.tag!==22?eh():536870912,l.lanes|=t,va|=t)}function Na(l,t){if(!j)switch(l.tailMode){case"hidden":t=l.tail;for(var u=null;t!==null;)t.alternate!==null&&(u=t),t=t.sibling;u===null?l.tail=null:u.sibling=null;break;case"collapsed":u=l.tail;for(var a=null;u!==null;)u.alternate!==null&&(a=u),u=u.sibling;a===null?t||l.tail===null?l.tail=null:l.tail.sibling=null:a.sibling=null}}function P(l){var t=l.alternate!==null&&l.alternate.child===l.child,u=0,a=0;if(t)for(var e=l.child;e!==null;)u|=e.lanes|e.childLanes,a|=e.subtreeFlags&65011712,a|=e.flags&65011712,e.return=l,e=e.sibling;else for(e=l.child;e!==null;)u|=e.lanes|e.childLanes,a|=e.subtreeFlags,a|=e.flags,e.return=l,e=e.sibling;return l.subtreeFlags|=a,l.childLanes=u,t}function Ny(l,t,u){var a=t.pendingProps;switch(Tf(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return P(t),null;case 1:return P(t),null;case 3:return u=t.stateNode,a=null,l!==null&&(a=l.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Mt(fl),fa(),u.pendingContext&&(u.context=u.pendingContext,u.pendingContext=null),(l===null||l.child===null)&&(pa(t)?yt(t):l===null||l.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Hs())),P(t),null;case 26:return u=t.memoizedState,l===null?(yt(t),u!==null?(P(t),uo(t,u)):(P(t),t.flags&=-16777217)):u?u!==l.memoizedState?(yt(t),P(t),uo(t,u)):(P(t),t.flags&=-16777217):(l.memoizedProps!==a&&yt(t),P(t),t.flags&=-16777217),null;case 27:zn(t),u=wt.current;var e=t.type;if(l!==null&&t.stateNode!=null)l.memoizedProps!==a&&yt(t);else{if(!a){if(t.stateNode===null)throw Error(S(166));return P(t),null}l=ft.current,pa(t)?Rs(t):(l=bd(e,a,u),t.stateNode=l,yt(t))}return P(t),null;case 5:if(zn(t),u=t.type,l!==null&&t.stateNode!=null)l.memoizedProps!==a&&yt(t);else{if(!a){if(t.stateNode===null)throw Error(S(166));return P(t),null}if(l=ft.current,pa(t))Rs(t);else{switch(e=Kn(wt.current),l){case 1:l=e.createElementNS("http://www.w3.org/2000/svg",u);break;case 2:l=e.createElementNS("http://www.w3.org/1998/Math/MathML",u);break;default:switch(u){case"svg":l=e.createElementNS("http://www.w3.org/2000/svg",u);break;case"math":l=e.createElementNS("http://www.w3.org/1998/Math/MathML",u);break;case"script":l=e.createElement("div"),l.innerHTML=" - - - -
- - diff --git a/static/site.webmanifest b/static/site.webmanifest index 45dc8a2..fa99de7 100644 --- a/static/site.webmanifest +++ b/static/site.webmanifest @@ -1 +1,19 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +}