commit 45adc7ad479eea31859647dc3b688f5b6c316321 Author: wx <2636507191@qq.com> Date: Tue Aug 18 11:39:45 2026 +0800 feat: 呼籁旅行-甄选酒店站点初始化——访客页+后台管理(零依赖Node,data.json内容存储,自动备份50份,图片上传回收) 来源: hulai-travel-site.zip (2026-08-18 Kimi版复刻+CMS,移除Kimi外链脚本) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..41396dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# 运行时生成,勿入库 +config.json # 管理密码哈希(首次启动自动生成) +data-backups/ # 后台每次保存自动备份(最多 50 份) +hotels/_trash/ # 删除的图片回收目录 +server.log +nohup.out + +# 系统/编辑器垃圾 +__MACOSX/ +._* +.DS_Store +Thumbs.db +node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..18fd7fd --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# 呼籁旅行 - 甄选酒店(独立部署版 · 带后台管理) + +本目录是 Kimi 版「呼籁旅行 - 甄选酒店」页面的完整复刻 + 内容管理系统。 +已移除 Kimi 的 sdk-seed.js(Kimi 外链脚本,即"风险提示"弹窗/水印的来源), +页面本身的功能、文字、图片与样式与原文一致。 + +## 功能 + +- 访客:打开首页直接浏览,无需登录,无任何干扰 +- 管理:隐藏入口 + 密码登录,可在后台对以下内容增删改查,保存后**所有访客立即看到更新** + - 产品线:线路(南线/北线/南北线·满)+ 天数标签(5天4晚/6天5晚/7天6晚…),可增删改排序 + - 行程:每天入住的酒店(名称、房型、星级、年份、位置、床型、设施、餐饮) + - 图片:每家酒店 3 张图(房间/外观/设施)、顶部主图,可直接上传替换/删除 + - 备选酒店:统一资料库,改一处自动同步到所有线路 + - 文字:站点标题、页脚、温馨提示等 + - 安全:自动历史备份(50 份)、一键恢复、导入/导出 JSON + +## 目录结构 + + hulai-travel-site/ + ├── server.js # 站点服务(零依赖 Node.js,启动它即可) + ├── data.json # 全部内容数据(后台维护的就是这个文件) + ├── data.seed.json # 初始数据底稿(后台「恢复为初始数据」用) + ├── index.html # 访客页面(服务端会注入最新数据) + ├── admin.html/admin.js/admin.css # 管理后台 + ├── assets/ # 前端构建产物(勿改) + ├── hotels/ # 154 张酒店图片 + 上传的图片 + ├── config.json # 首次启动自动生成,保存管理密码(哈希) + ├── data-backups/ # 自动生成的历史备份 + ├── nginx.conf.example # Nginx 反向代理示例(可选) + └── README.md + (运行时还会自动创建 hotels/_trash 图片回收目录) + +## 部署 + +要求:服务器已安装 Node.js(16 及以上,无任何 npm 依赖)。 + +1. 把整个目录上传到服务器,例如 /www/hulai-travel-site +2. 进入目录执行: + + node server.js # 直接前台运行 + # 或后台常驻(推荐,配合 PM2 / pm2 管理器): + pm2 start server.js --name hulai-travel + # 或 nohup node server.js > server.log 2>&1 & + +3. 访问 http://服务器IP:3000/ 即可(端口可用环境变量修改:PORT=8080 node server.js) +4. 有域名的话,用 Nginx 反向代理到 3000 端口并配置 HTTPS,参考 nginx.conf.example + +宝塔面板:选择「Node 项目」或直接 SSH 用 pm2 运行 server.js 即可。 + +## 管理入口(隐式,不影响客人) + +三种方式任选: + +1. 访客页面上,**连续快速点击页脚文字 5 次** → 自动跳转管理后台 +2. 直接访问 http://你的域名/admin.html +3. 初始密码: qscy2014@@ + (登录后可在「站点设置 → 修改管理密码」中修改;密码存在服务器 config.json, + 忘记时删除 config.json 并重启服务,密码恢复为初始密码) + +## 日常维护 + +- 登录后台 → 左侧选择要维护的模块 → 修改 → 点右上角「保存并发布」→ 前台立即生效 +- 图片:每个图片位都有「上传 / 移除 / 占位图」按钮,上传前最好压到 2MB 以内 +- 误操作:备份与恢复里可一键恢复任意历史版本或初始数据 +- 所有修改都会先自动备份,放心改 + +## 关于 5 张图片的说明 + +原 Kimi 服务器上以下图片缺失(404 或 0 字节):百年俄式酒店 3 张、 +友谊宾馆 1 张、旺泉宾馆 1 张(原页面这些位置本来就是裂图)。 +这里已放置同风格占位图(标有"图片待补充")。有真实照片后, +直接在后台对应酒店处上传替换即可。 + +## 本地预览 + + node server.js + # 打开 http://localhost:3000/ ;管理后台 http://localhost:3000/admin.html diff --git a/admin.css b/admin.css new file mode 100644 index 0000000..1f2acc2 --- /dev/null +++ b/admin.css @@ -0,0 +1,95 @@ +:root{ + --gold:#b8883a; --gold-d:#8b5e1c; --cream:#fdf6ec; --ink:#333; + --line:#e5e0d5; --bg:#f6f3ec; --danger:#c0392b; --ok:#2e7d32; +} +*{box-sizing:border-box;margin:0;padding:0} +body{font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--ink);font-size:14px} +.hidden{display:none!important} + +/* login */ +.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(160deg,#fdf6ec,#efe3c8 60%,#e6d3ac)} +.login-card{width:360px;background:#fff;border-radius:14px;padding:36px 32px;box-shadow:0 18px 50px rgba(91,61,28,.18);text-align:center} +.login-logo{font-size:26px;font-weight:700;color:var(--gold-d);letter-spacing:2px} +.login-sub{color:#999;margin:6px 0 26px;font-size:13px} +.login-card input{width:100%;padding:11px 14px;border:1px solid var(--line);border-radius:8px;font-size:15px;margin-bottom:14px;outline:none} +.login-card input:focus{border-color:var(--gold)} +.login-error{color:var(--danger);font-size:13px;min-height:18px;margin-top:10px} + +/* topbar */ +.topbar{position:sticky;top:0;z-index:50;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:56px} +.topbar-brand{font-weight:700;color:var(--gold-d);font-size:16px;letter-spacing:1px} +.topbar-actions{display:flex;align-items:center;gap:10px} +.save-status{font-size:12px;color:#999;margin-right:4px} + +/* buttons */ +.btn{border:1px solid transparent;border-radius:8px;padding:9px 16px;font-size:14px;cursor:pointer;transition:.15s} +.btn-gold{background:linear-gradient(90deg,var(--gold),#9a6e2e);color:#fff} +.btn-gold:hover{filter:brightness(1.06)} +.btn-gold:disabled{opacity:.45;cursor:not-allowed} +.btn-line{background:#fff;border-color:var(--line);color:var(--ink)} +.btn-line:hover{border-color:var(--gold);color:var(--gold-d)} +.btn-danger{background:#fff;border-color:#e8c4c0;color:var(--danger)} +.btn-danger:hover{background:#fdf1f0} +.btn-mini{padding:4px 10px;font-size:12px;border-radius:6px} + +/* layout */ +.layout{display:flex;min-height:calc(100vh - 56px)} +.side{width:200px;background:#fff;border-right:1px solid var(--line);padding:14px 10px;flex-shrink:0} +.side-item{display:block;width:100%;text-align:left;border:none;background:transparent;padding:11px 14px;border-radius:8px;font-size:14px;color:var(--ink);cursor:pointer;margin-bottom:4px} +.side-item:hover{background:#faf6ee} +.side-item.active{background:linear-gradient(90deg,#f7ecd8,#fdf6ec);color:var(--gold-d);font-weight:600} +.content{flex:1;padding:22px 26px;max-width:1060px} +.view h2{font-size:18px;color:var(--gold-d);margin-bottom:6px} +.view .desc{color:#999;font-size:13px;margin-bottom:18px} + +/* cards & forms */ +.card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px;margin-bottom:14px} +.card h3{font-size:15px;margin-bottom:12px;color:#555} +.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px 16px} +.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px 16px} +.field{display:flex;flex-direction:column;gap:4px} +.field label{font-size:12px;color:#8a7d63} +.field input,.field select,.field textarea{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;outline:none;font-family:inherit;background:#fff} +.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--gold)} +.field textarea{resize:vertical;min-height:64px} + +/* image slots */ +.img-row{display:flex;gap:12px;flex-wrap:wrap} +.img-slot{width:180px;border:1px dashed #d8cdb6;border-radius:10px;background:#fbf8f1;overflow:hidden} +.img-slot .thumb{width:100%;height:112px;object-fit:cover;display:block;background:#eee} +.img-slot .slot-label{font-size:11px;color:#9a8d70;padding:6px 8px 2px;text-align:center} +.img-slot .slot-actions{display:flex;gap:6px;justify-content:center;padding:6px 8px 10px;flex-wrap:wrap} + +/* hotel rows in trips */ +.hotel-card{margin-bottom:12px} +.hotel-head{display:flex;align-items:center;gap:10px;cursor:pointer;user-select:none} +.hotel-head .title{font-weight:600;color:var(--ink);flex:1} +.hotel-head .badge{font-size:11px;color:#fff;background:var(--gold);border-radius:10px;padding:2px 8px} +.hotel-head .arrow{color:#aaa;transition:.2s} +.hotel-card.open .arrow{transform:rotate(90deg)} +.hotel-body{border-top:1px dashed var(--line);margin-top:12px;padding-top:14px} +.alt-item{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;padding:6px 10px;margin-bottom:6px;background:#fdfbf6} +.alt-item .name{flex:1;font-weight:500} +.row-actions{display:flex;gap:8px;align-items:center} + +/* misc */ +.section-title{display:flex;align-items:center;gap:10px;margin:16px 0 10px} +.section-title h3{font-size:15px;color:var(--gold-d)} +.section-title .line{flex:1;height:1px;background:var(--line)} +.hint{font-size:12px;color:#a89a7d;margin-top:8px;line-height:1.6} +.toast{position:fixed;left:50%;bottom:34px;transform:translateX(-50%);background:rgba(40,40,40,.92);color:#fff;padding:11px 20px;border-radius:24px;font-size:14px;z-index:999;opacity:0;pointer-events:none;transition:.25s} +.toast.show{opacity:1} +.route-row{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px;background:#fdfbf6;flex-wrap:wrap} +.route-row .rkey{font-size:11px;color:#aaa;font-family:monospace} +.line-block{margin-bottom:20px} +.alt-card{margin-bottom:12px} +.backup-row{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin-bottom:6px;background:#fdfbf6} +.backup-row .fname{flex:1;font-family:monospace;font-size:12px;color:#666} +select.trip-sel{padding:8px 10px;border:1px solid var(--line);border-radius:8px;margin-right:10px;font-size:14px} +@media (max-width:860px){ + .layout{flex-direction:column} + .side{width:100%;display:flex;flex-wrap:wrap;gap:4px;border-right:none;border-bottom:1px solid var(--line)} + .side-item{width:auto} + .grid2,.grid3{grid-template-columns:1fr} + .content{padding:16px} +} diff --git a/admin.html b/admin.html new file mode 100644 index 0000000..1855b7c --- /dev/null +++ b/admin.html @@ -0,0 +1,51 @@ + + + + + +呼籁旅行 · 内容管理 + + + + + + + + + + diff --git a/admin.js b/admin.js new file mode 100644 index 0000000..12d6381 --- /dev/null +++ b/admin.js @@ -0,0 +1,689 @@ +/* 呼籁旅行 · 内容管理后台 */ +'use strict'; + +const $ = (s, el) => (el || document).querySelector(s); +const $$ = (s, el) => Array.from((el || document).querySelectorAll(s)); + +let DATA = null; // 工作副本 +let DIRTY = false; +let VIEW = 'settings'; +let TRIPS = { line: null, route: null }; +let OPEN_HOTELS = new Set(); +let ALT_LIB = null; // Map: name -> 备选酒店对象 + +/* ---------- 工具 ---------- */ +function esc(s) { + return String(s == null ? '' : s) + .replace(/&/g, '&').replace(//g, '>') + .replace(/"/g, '"').replace(/'/g, '''); +} +// 生成可直接放进 onclick="..." 的 JS 字符串字面量 +function q(s) { + return "'" + String(s).replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'"; +} +function altLibArr() { return Array.from(ALT_LIB.values()); } +function getByPath(obj, path) { + if (path.startsWith('__altLib__.')) { + const rest = path.slice('__altLib__.'.length); + const dot = rest.indexOf('.'); + const idx = parseInt(dot < 0 ? rest : rest.slice(0, dot), 10); + const a = altLibArr()[idx]; + if (!a) return undefined; + return dot < 0 ? a : getByPath(a, rest.slice(dot + 1)); + } + return path.split('.').reduce((o, k) => (o == null ? o : o[k]), obj); +} +function setByPath(obj, path, value) { + if (path.startsWith('__altLib__.')) { + const rest = path.slice('__altLib__.'.length); + const dot = rest.indexOf('.'); + const idx = parseInt(dot < 0 ? rest : rest.slice(0, dot), 10); + const a = altLibArr()[idx]; + if (!a) return; + if (dot < 0) { altLibArr()[idx] = value; return; } + setByPath(a, rest.slice(dot + 1), value); + return; + } + const keys = path.split('.'); + let o = obj; + for (let i = 0; i < keys.length - 1; i++) { + if (o[keys[i]] == null) o[keys[i]] = {}; + o = o[keys[i]]; + } + o[keys[keys.length - 1]] = value; +} +function markDirty() { DIRTY = true; $('#btn-save').disabled = false; $('#save-status').textContent = '有未保存修改'; } +function markClean() { DIRTY = false; $('#btn-save').disabled = true; $('#save-status').textContent = '已同步'; } +function toast(msg, isErr) { + const t = $('#toast'); + t.textContent = msg; + t.style.background = isErr ? 'rgba(160,40,30,.94)' : 'rgba(40,40,40,.92)'; + t.classList.add('show'); + clearTimeout(t._timer); + t._timer = setTimeout(() => t.classList.remove('show'), 2600); +} +async function api(path, opts) { + opts = opts || {}; + const headers = Object.assign({ 'X-Requested-With': 'hulai-admin' }, opts.headers || {}); + if (opts.json !== undefined) headers['Content-Type'] = 'application/json'; + const res = await fetch(path, { method: opts.method || 'GET', headers, body: opts.json !== undefined ? JSON.stringify(opts.json) : opts.body }); + let data = null; + try { data = await res.json(); } catch (e) {} + if (!res.ok) { + const err = new Error((data && data.error) || ('请求失败 ' + res.status)); + err.status = res.status; + throw err; + } + return data; +} +function uid() { return Date.now().toString(36) + Math.random().toString(36).slice(2, 7); } +function newHotel(day) { + return { day: day || 1, city: '', name: '新酒店', subtitle: '', stars: 4, year: '2025年装修', + location: '', bedType: '', facilities: '', breakfast: '含早餐', alternatives: [], images: [], altHotels: [] }; +} +function newAltHotel(name) { + return { name: name || '新备选酒店', subtitle: '', stars: 4, year: '', location: '', bedType: '', + facilities: '', breakfast: '', images: [] }; +} + +/* ---------- 资料库 ---------- */ +function buildAltLib() { + const map = new Map(); + for (const rk of Object.keys(DATA.Am || {})) { + for (const h of (DATA.Am[rk].hotels || [])) { + for (const a of (h.altHotels || [])) { + if (!map.has(a.name)) map.set(a.name, JSON.parse(JSON.stringify(a))); + } + } + } + return map; +} + +/* ---------- 图片 ---------- */ +function uploadImage(file, cb) { + if (!file) return; + if (file.size > 12 * 1024 * 1024) { toast('图片超过 12MB,请压缩后再传', true); return; } + const reader = new FileReader(); + reader.onload = async () => { + try { + const r = await api('/api/upload', { method: 'POST', json: { filename: file.name, data: reader.result } }); + cb(r.path); + toast('图片上传成功'); + markDirty(); render(); + } catch (e) { toast(e.message, true); } + }; + reader.readAsDataURL(file); +} +function makeFileInput(path, idx, label) { + const id = 'f_' + uid(); + return '' + + ''; +} +window.onSlotFile = function (input, path, idx) { + const file = input.files && input.files[0]; + uploadImage(file, (p) => { + const cur = getByPath(DATA, path); + if (Array.isArray(cur)) { + while (cur.length <= idx) cur.push(null); + cur[idx] = p; + } else { + setByPath(DATA, path, p); + } + }); +}; +window.removeSlot = function (path, idx) { + if (!confirm('确定移除该图片?图片文件将移入回收目录。')) return; + const arr = getByPath(DATA, path); + const p = arr[idx]; + arr.splice(idx, 1); + api('/api/delete-image', { method: 'POST', json: { path: p } }).catch(() => {}); + markDirty(); render(); +}; +window.fillPlaceholder = function (path, idx) { + const cur = getByPath(DATA, path); + if (Array.isArray(cur)) { + while (cur.length <= idx) cur.push(null); + cur[idx] = '/hotels/_placeholder.png'; + } else { + setByPath(DATA, path, '/hotels/_placeholder.png'); + } + markDirty(); render(); +}; +function imageSlots(path) { + const arr = getByPath(DATA, path) || []; + let html = '
'; + for (let i = 0; i < 3; i++) { + const src = arr[i]; + html += '
'; + html += src + ? '' + : '
' + ['房间图','外观图','设施图'][i] + '(空)
'; + html += '
' + ['房间图','外观图','设施图'][i] + '
'; + html += '
'; + if (src) { + html += ''; + } else { + html += makeFileInput(path, i, '上传'); + html += ''; + } + html += '
'; + } + html += '
前台要求至少 3 张图才展示图片区,建议保持 3 张齐全。
'; + return html; +} + +/* ---------- 渲染 ---------- */ +function render() { + if (!DATA) return; + renderSettings(); + renderLines(); + renderTrips(); + renderAlts(); +} + +/* 站点设置 */ +function renderSettings() { + const el = $('#view-settings'); + el.innerHTML = + '

站点设置

修改后点击右上角「保存并发布」,前台即刻生效。
' + + '

页面文字

' + + field('siteName', '顶部/主标题', 'siteName') + + field('siteSubtitle', '副标题', 'siteSubtitle') + + field('siteEn', '英文副标题', 'siteEn') + + field('siteTitle', '浏览器标签标题', 'siteTitle') + + field('tipsLabel', '提示语前缀', 'tipsLabel') + + field('footerText', '页脚文字', 'footerText') + + '
' + + '
' + + '
' + + '
' + + '

顶部主图(hero)

' + + '
' + + '' + + '
' + makeFileInput('heroBg', 0, '更换图片') + + '' + + '
' + + '
建议尺寸 1920×1080。上传后自动保存到 /hotels/ 目录。
' + + '
' + + '

修改管理密码

' + + '
' + + '
' + + '
' + + '
' + + '
密码保存在服务器 config.json 中(加密存储),忘记时可删除 config.json 后重启服务,密码会恢复为初始密码。
'; +} +function field(id, label, path) { + const v = getByPath(DATA, path); + return '
' + + '
'; +} +window.onField = function (input) { + setByPath(DATA, input.dataset.path, input.value); + markDirty(); +}; +window.changePassword = async function () { + const o = $('#pwd-old').value, n = $('#pwd-new').value, c = $('#pwd-confirm').value; + if (!o || !n) return toast('请填写完整', true); + if (n !== c) return toast('两次输入的新密码不一致', true); + if (n.length < 6) return toast('新密码至少 6 位', true); + try { + await api('/api/change-password', { method: 'POST', json: { old: o, next: n } }); + toast('密码已更新'); + $('#pwd-old').value = $('#pwd-new').value = $('#pwd-confirm').value = ''; + } catch (e) { toast(e.message, true); } +}; + +/* 产品线 */ +function renderLines() { + const el = $('#view-lines'); + let html = '

产品线(线路 / 天数标签)

' + + '
「线路」= 前台顶部导航(南线/北线等);「天数标签」= 线路下的行程选择。均可增、删、改名、排序。
'; + const av = DATA.av || []; + av.forEach((line, li) => { + const kf = DATA.Kf[line] || { label: line, routes: [] }; + html += '
' + + '
' + + '
' + + '' + + '' + + '' + + '
'; + (kf.routes || []).forEach((rk, ri) => { + const am = DATA.Am[rk] || { label: '', days: '', hotels: [] }; + html += '
' + + '' + esc(rk) + '' + + '
' + + '
' + + '
' + + '
' + + '
酒店数:' + (am.hotels || []).length + '
' + + '' + + '' + + '' + + '
'; + }); + html += '
'; + }); + html += '
'; + el.innerHTML = html; +} +window.moveLine = function (i, d) { + const av = DATA.av; + const j = i + d; + if (j < 0 || j >= av.length) return; + [av[i], av[j]] = [av[j], av[i]]; + markDirty(); render(); +}; +window.deleteLine = function (i) { + const av = DATA.av; + const line = av[i]; + if (!confirm('删除线路「' + DATA.Kf[line].label + '」?其下行程与酒店数据也会一并删除。')) return; + (DATA.Kf[line].routes || []).forEach(rk => delete DATA.Am[rk]); + delete DATA.Kf[line]; + av.splice(i, 1); + markDirty(); render(); +}; +window.addLine = function () { + const base = '新线路'; + let key = base, n = 1; + while (DATA.Kf[key]) key = base + n++; + DATA.av.push(key); + DATA.Kf[key] = { label: '新线路', routes: [] }; + markDirty(); render(); +}; +window.moveRoute = function (line, i, d) { + const rs = DATA.Kf[line].routes; + const j = i + d; + if (j < 0 || j >= rs.length) return; + [rs[i], rs[j]] = [rs[j], rs[i]]; + markDirty(); render(); +}; +window.deleteRoute = function (line, i) { + const rs = DATA.Kf[line].routes; + const rk = rs[i]; + if (!confirm('删除行程「' + DATA.Am[rk].days + '」?其中 ' + (DATA.Am[rk].hotels || []).length + ' 天的酒店数据也会删除。')) return; + rs.splice(i, 1); + delete DATA.Am[rk]; + markDirty(); render(); +}; +window.addRoute = function (line) { + const days = prompt('请输入标签文字(如:6天5晚)'); + if (!days) return; + let key = line + days, n = 1; + while (DATA.Am[key]) key = line + days + '-' + (n++); + DATA.Kf[line].routes.push(key); + DATA.Am[key] = { label: days, days, hotels: [] }; + markDirty(); render(); +}; + +/* 行程与酒店 */ +function renderTrips() { + const el = $('#view-trips'); + const av = DATA.av || []; + if (!TRIPS.line || !DATA.Kf[TRIPS.line]) TRIPS.line = av[0] || null; + const routes = (TRIPS.line && DATA.Kf[TRIPS.line]) ? (DATA.Kf[TRIPS.line].routes || []) : []; + if (!TRIPS.route || !DATA.Am[TRIPS.route]) TRIPS.route = routes[0] || null; + if (!TRIPS.line) { el.innerHTML = '

行程与酒店

请先在「产品线」中添加线路。
'; return; } + let html = '

行程与酒店

维护每个行程每天的酒店:文字、星级、3 张图片、备选酒店均可增删改。
'; + html += '
' + + '' + + '' + + '' + + '
'; + const am = DATA.Am[TRIPS.route] || { hotels: [] }; + (am.hotels || []).forEach((h, i) => { + const key = TRIPS.route + ':' + i; + const open = OPEN_HOTELS.has(key); + html += '
' + + '
' + + '▶' + + 'DAY ' + esc(h.day) + '' + + '' + esc(h.city ? (h.city + ' · ') : '') + esc(h.name) + (h.subtitle ? '(' + esc(h.subtitle) + ')' : '') + '' + + '' + '💎'.repeat(h.stars || 0) + '' + + '
' + + (open ? '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + imageSlots('Am.' + TRIPS.route + '.hotels.' + i + '.images') + '
' + + '
' + + '
' + renderAltList(i) + '
' + + '
' + + '' + + '' + + '' + + '' + + '
' : '') + + '
'; + }); + el.innerHTML = html; +} +function renderAltList(i) { + const am = DATA.Am[TRIPS.route]; + const h = am.hotels[i]; + const alts = h.altHotels || []; + let html = alts.map((a, ai) => + '
' + esc(a.name) + (a.subtitle ? '(' + esc(a.subtitle) + ')' : '') + '' + + '' + + '
' + ).join(''); + const used = new Set(alts.map(a => a.name)); + const options = altLibArr().filter(a => !used.has(a.name)) + .map(a => '').join(''); + html += '
' + + '' + + '' + + '' + + '
'; + return html; +} +window.tripSelLine = function (v) { TRIPS.line = v; const rs = DATA.Kf[v].routes || []; TRIPS.route = rs[0] || null; renderTrips(); }; +window.tripSelRoute = function (v) { TRIPS.route = v; renderTrips(); }; +window.toggleHotel = function (key) { OPEN_HOTELS.has(key) ? OPEN_HOTELS.delete(key) : OPEN_HOTELS.add(key); renderTrips(); }; +window.onHotelField = function (input, i) { + const h = DATA.Am[TRIPS.route].hotels[i]; + const k = input.dataset.key; + let v = input.value; + if (k === 'stars' || k === 'day') v = parseInt(v, 10) || 1; + h[k] = v; + markDirty(); +}; +window.addHotel = function () { + const am = DATA.Am[TRIPS.route]; + am.hotels = am.hotels || []; + am.hotels.push(newHotel(am.hotels.length + 1)); + OPEN_HOTELS.add(TRIPS.route + ':' + (am.hotels.length - 1)); + markDirty(); renderTrips(); +}; +window.deleteHotel = function (i) { + const am = DATA.Am[TRIPS.route]; + if (!confirm('删除 DAY ' + am.hotels[i].day + '(' + am.hotels[i].name + ')?')) return; + am.hotels.splice(i, 1); + markDirty(); renderTrips(); +}; +window.moveHotel = function (i, d) { + const hs = DATA.Am[TRIPS.route].hotels; + const j = i + d; + if (j < 0 || j >= hs.length) return; + [hs[i], hs[j]] = [hs[j], hs[i]]; + markDirty(); renderTrips(); +}; +window.dupHotel = function (i) { + const hs = DATA.Am[TRIPS.route].hotels; + hs.splice(i + 1, 0, JSON.parse(JSON.stringify(hs[i]))); + markDirty(); renderTrips(); +}; +window.addAlt = function (i) { + const sel = $('#alt-add-sel-' + i); + const name = sel.value; + if (!name) return; + const lib = ALT_LIB.get(name); + const h = DATA.Am[TRIPS.route].hotels[i]; + h.altHotels = h.altHotels || []; + h.altHotels.push(JSON.parse(JSON.stringify(lib))); + markDirty(); renderTrips(); +}; +window.removeAlt = function (i, ai) { + DATA.Am[TRIPS.route].hotels[i].altHotels.splice(ai, 1); + markDirty(); renderTrips(); +}; +window.createAlt = function (i) { + const name = prompt('新备选酒店名称:'); + if (!name) return; + const h = DATA.Am[TRIPS.route].hotels[i]; + h.altHotels = h.altHotels || []; + h.altHotels.push(newAltHotel(name)); + ALT_LIB = buildAltLib(); + markDirty(); renderTrips(); +}; +window.editAlt = function (i, ai) { + const h = DATA.Am[TRIPS.route].hotels[i]; + const a = h.altHotels[ai]; + const name = prompt('备选酒店名称:', a.name); + if (!name || name === a.name) return; + a.name = name; + ALT_LIB = buildAltLib(); + markDirty(); renderTrips(); +}; + +/* 备选酒店资料库 */ +function renderAlts() { + const el = $('#view-alts'); + let html = '

备选酒店资料库

' + + '
同一家备选酒店可能出现在多条线路。这里维护一份,保存发布时自动同步到所有引用处;改名也会同步。
'; + const lib = altLibArr(); + if (!lib.length) { html += '
暂无备选酒店。
'; el.innerHTML = html; return; } + lib.forEach((a, idx) => { + html += '
' + + '' + esc(a.name) + '' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + imageSlots('__altLib__.' + idx + '.images') + '
' + + '
'; + }); + el.innerHTML = html; +} +window.onAltField = function (input, idx) { + const a = altLibArr()[idx]; + const k = input.dataset.key; + a[k] = (k === 'stars') ? (parseInt(input.value, 10) || 1) : input.value; + markDirty(); +}; +window.renameAlt = function (idx) { + const a = altLibArr()[idx]; + const old = a.name; + const next = prompt('新名称:', old); + if (!next || next === old) return; + for (const rk of Object.keys(DATA.Am)) { + for (const h of DATA.Am[rk].hotels) { + for (const x of (h.altHotels || [])) if (x.name === old) x.name = next; + if (h.alternatives) h.alternatives = h.alternatives.map(n => n === old ? next : n); + } + } + a.name = next; + ALT_LIB = buildAltLib(); + markDirty(); render(); +}; +window.deleteAltFromLib = function (idx) { + const a = altLibArr()[idx]; + if (!confirm('从资料库删除「' + a.name + '」,并同时从所有行程中移除该备选?')) return; + for (const rk of Object.keys(DATA.Am)) { + for (const h of DATA.Am[rk].hotels) { + h.altHotels = (h.altHotels || []).filter(x => x.name !== a.name); + if (h.alternatives) h.alternatives = h.alternatives.filter(n => n !== a.name); + } + } + ALT_LIB = buildAltLib(); + markDirty(); render(); +}; + +/* 备份与恢复 */ +function renderBackup() { + const el = $('#view-backup'); + el.innerHTML = '

备份与恢复

' + + '
每次「保存并发布」都会自动生成一份历史备份(保留最近 50 份)。
' + + '

数据操作

' + + '' + + '' + + '' + + '' + + '
导入会整体替换当前内容,请先下载备份。
' + + '

历史备份

加载中…
'; + api('/api/backups').then(r => { + const list = $('#backup-list'); + if (!r.files || !r.files.length) { list.innerHTML = '
暂无备份。
'; return; } + list.innerHTML = r.files.map(f => + '
' + esc(f) + '' + + '
' + ).join(''); + }).catch(e => { $('#backup-list').innerHTML = '
加载失败:' + esc(e.message) + '
'; }); +} +window.downloadData = function () { + const blob = new Blob([JSON.stringify(DATA, null, 2)], { type: 'application/json' }); + const a = document.createElement('a'); + a.href = URL.createObjectURL(blob); + a.download = 'hulai-data-' + new Date().toISOString().slice(0, 10) + '.json'; + a.click(); +}; +window.onImport = function (input) { + const file = input.files && input.files[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = () => { + try { + const obj = JSON.parse(reader.result); + if (!obj || typeof obj.Am !== 'object' || typeof obj.Kf !== 'object' || !Array.isArray(obj.av)) throw new Error('结构不对'); + DATA = obj; + ALT_LIB = buildAltLib(); + TRIPS = { line: DATA.av[0] || null, route: null }; + OPEN_HOTELS.clear(); + markDirty(); render(); + toast('已导入,点击「保存并发布」生效'); + } catch (e) { toast('导入失败:' + e.message, true); } + }; + reader.readAsText(file); + input.value = ''; +}; +window.restoreSeed = async function () { + if (!confirm('恢复为初始数据?当前修改将丢失(会先自动备份当前数据)。')) return; + try { + const r = await api('/data.seed.json'); + DATA = r; ALT_LIB = buildAltLib(); + TRIPS = { line: DATA.av[0] || null, route: null }; + OPEN_HOTELS.clear(); + markDirty(); render(); + toast('已载入初始数据,点击「保存并发布」生效'); + } catch (e) { toast(e.message, true); } +}; +window.restoreBackup = async function (file) { + if (!confirm('恢复到 ' + file + ' ?当前数据会先自动备份。')) return; + try { + await api('/api/restore-backup', { method: 'POST', json: { file } }); + const d = await api('/api/data'); + DATA = d; ALT_LIB = buildAltLib(); + TRIPS = { line: DATA.av[0] || null, route: null }; + OPEN_HOTELS.clear(); + markClean(); render(); + toast('已恢复该版本,前台立即生效'); + } catch (e) { toast(e.message, true); } +}; + +/* ---------- 保存 ---------- */ +window.saveAll = async function () { + try { + // 资料库同步到所有引用 + 重建 alternatives + 清洗 + for (const rk of Object.keys(DATA.Am)) { + for (const h of DATA.Am[rk].hotels) { + h.altHotels = (h.altHotels || []).map(a => { + const lib = ALT_LIB.get(a.name); + return lib ? JSON.parse(JSON.stringify(lib)) : a; + }); + h.alternatives = h.altHotels.map(a => a.name); + h.images = (h.images || []).filter(Boolean).slice(0, 3); + h.stars = Math.min(5, Math.max(1, parseInt(h.stars, 10) || 1)); + h.day = parseInt(h.day, 10) || 1; + } + } + // 清理孤儿数据 + const usedRoutes = new Set(); + for (const line of DATA.av) { + if (!DATA.Kf[line]) continue; + (DATA.Kf[line].routes || []).forEach(rk => usedRoutes.add(rk)); + } + for (const rk of Object.keys(DATA.Am)) if (!usedRoutes.has(rk)) delete DATA.Am[rk]; + for (const a of altLibArr()) a.images = (a.images || []).filter(Boolean).slice(0, 3); + + await api('/api/data', { method: 'PUT', json: DATA }); + markClean(); + toast('已发布,前台立即生效 ✨'); + } catch (e) { + if (e.status === 401) { showLogin(); return; } + toast('保存失败:' + e.message, true); + } +}; + +/* ---------- 视图切换 ---------- */ +function switchView(v) { + VIEW = v; + $$('.side-item').forEach(b => b.classList.toggle('active', b.dataset.view === v)); + $$('.view').forEach(x => x.classList.add('hidden')); + $('#view-' + v).classList.remove('hidden'); + if (v === 'backup') renderBackup(); +} +$$('.side-item').forEach(b => b.addEventListener('click', () => switchView(b.dataset.view))); + +/* ---------- 登录 ---------- */ +function showLogin() { + $('#login-view').classList.remove('hidden'); + $('#app-view').classList.add('hidden'); +} +function showApp() { + $('#login-view').classList.add('hidden'); + $('#app-view').classList.remove('hidden'); +} +async function doLogin() { + const pwd = $('#login-password').value; + $('#login-error').textContent = ''; + try { + await api('/api/login', { method: 'POST', json: { password: pwd } }); + await initApp(); + } catch (e) { + $('#login-error').textContent = e.message || '登录失败'; + } +} +$('#login-btn').addEventListener('click', doLogin); +$('#login-password').addEventListener('keydown', e => { if (e.key === 'Enter') doLogin(); }); +$('#btn-logout').addEventListener('click', async () => { + await api('/api/logout', { method: 'POST' }).catch(() => {}); + DATA = null; DIRTY = false; + showLogin(); +}); +$('#btn-save').addEventListener('click', saveAll); +$('#btn-preview').addEventListener('click', () => window.open('/', '_blank')); + +/* ---------- 初始化 ---------- */ +async function initApp() { + try { + const me = await api('/api/me'); + if (!me.authed) return showLogin(); + const d = await api('/api/data'); + DATA = d; + ALT_LIB = buildAltLib(); + TRIPS = { line: DATA.av[0] || null, route: null }; + OPEN_HOTELS.clear(); + markClean(); + showApp(); + render(); + } catch (e) { + $('#login-error').textContent = '加载失败:' + e.message; + showLogin(); + } +} +initApp(); diff --git a/assets/index-BIX6B1UZ.js b/assets/index-BIX6B1UZ.js new file mode 100644 index 0000000..0f7fdac --- /dev/null +++ b/assets/index-BIX6B1UZ.js @@ -0,0 +1,11 @@ +(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const h of document.querySelectorAll('link[rel="modulepreload"]'))s(h);new MutationObserver(h=>{for(const d of h)if(d.type==="childList")for(const S of d.addedNodes)S.tagName==="LINK"&&S.rel==="modulepreload"&&s(S)}).observe(document,{childList:!0,subtree:!0});function r(h){const d={};return h.integrity&&(d.integrity=h.integrity),h.referrerPolicy&&(d.referrerPolicy=h.referrerPolicy),h.crossOrigin==="use-credentials"?d.credentials="include":h.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function s(h){if(h.ep)return;h.ep=!0;const d=r(h);fetch(h.href,d)}})();var qf={exports:{}},Un={};var nm;function m0(){if(nm)return Un;nm=1;var c=Symbol.for("react.transitional.element"),o=Symbol.for("react.fragment");function r(s,h,d){var S=null;if(d!==void 0&&(S=""+d),h.key!==void 0&&(S=""+h.key),"key"in h){d={};for(var z in h)z!=="key"&&(d[z]=h[z])}else d=h;return h=d.ref,{$$typeof:c,type:s,key:S,ref:h!==void 0?h:null,props:d}}return Un.Fragment=o,Un.jsx=r,Un.jsxs=r,Un}var um;function d0(){return um||(um=1,qf.exports=m0()),qf.exports}var Y=d0(),Bf={exports:{}},I={};var im;function y0(){if(im)return I;im=1;var c=Symbol.for("react.transitional.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),S=Symbol.for("react.context"),z=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),M=Symbol.for("react.lazy"),_=Symbol.for("react.activity"),j=Symbol.iterator;function Z(v){return v===null||typeof v!="object"?null:(v=j&&v[j]||v["@@iterator"],typeof v=="function"?v:null)}var V={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},G=Object.assign,H={};function J(v,U,B){this.props=v,this.context=U,this.refs=H,this.updater=B||V}J.prototype.isReactComponent={},J.prototype.setState=function(v,U){if(typeof v!="object"&&typeof v!="function"&&v!=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,v,U,"setState")},J.prototype.forceUpdate=function(v){this.updater.enqueueForceUpdate(this,v,"forceUpdate")};function et(){}et.prototype=J.prototype;function W(v,U,B){this.props=v,this.context=U,this.refs=H,this.updater=B||V}var St=W.prototype=new et;St.constructor=W,G(St,J.prototype),St.isPureReactComponent=!0;var Et=Array.isArray;function xt(){}var F={H:null,A:null,T:null,S:null},Dt=Object.prototype.hasOwnProperty;function Wt(v,U,B){var X=B.ref;return{$$typeof:c,type:v,key:U,ref:X!==void 0?X:null,props:B}}function je(v,U){return Wt(v.type,U,v.props)}function ve(v){return typeof v=="object"&&v!==null&&v.$$typeof===c}function kt(v){var U={"=":"=0",":":"=2"};return"$"+v.replace(/[=:]/g,function(B){return U[B]})}var He=/\/+/g;function pe(v,U){return typeof v=="object"&&v!==null&&v.key!=null?kt(""+v.key):U.toString(36)}function jt(v){switch(v.status){case"fulfilled":return v.value;case"rejected":throw v.reason;default:switch(typeof v.status=="string"?v.then(xt,xt):(v.status="pending",v.then(function(U){v.status==="pending"&&(v.status="fulfilled",v.value=U)},function(U){v.status==="pending"&&(v.status="rejected",v.reason=U)})),v.status){case"fulfilled":return v.value;case"rejected":throw v.reason}}throw v}function D(v,U,B,X,P){var nt=typeof v;(nt==="undefined"||nt==="boolean")&&(v=null);var mt=!1;if(v===null)mt=!0;else switch(nt){case"bigint":case"string":case"number":mt=!0;break;case"object":switch(v.$$typeof){case c:case o:mt=!0;break;case M:return mt=v._init,D(mt(v._payload),U,B,X,P)}}if(mt)return P=P(v),mt=X===""?"."+pe(v,0):X,Et(P)?(B="",mt!=null&&(B=mt.replace(He,"$&/")+"/"),D(P,U,B,"",function(La){return La})):P!=null&&(ve(P)&&(P=je(P,B+(P.key==null||v&&v.key===P.key?"":(""+P.key).replace(He,"$&/")+"/")+mt)),U.push(P)),1;mt=0;var Ft=X===""?".":X+":";if(Et(v))for(var Nt=0;Nt>>1,At=D[gt];if(0>>1;gth(B,k))Xh(P,B)?(D[gt]=P,D[X]=k,gt=X):(D[gt]=B,D[U]=k,gt=U);else if(Xh(P,k))D[gt]=P,D[X]=k,gt=X;else break t}}return q}function h(D,q){var k=D.sortIndex-q.sortIndex;return k!==0?k:D.id-q.id}if(c.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;c.unstable_now=function(){return d.now()}}else{var S=Date,z=S.now();c.unstable_now=function(){return S.now()-z}}var p=[],g=[],M=1,_=null,j=3,Z=!1,V=!1,G=!1,H=!1,J=typeof setTimeout=="function"?setTimeout:null,et=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;function St(D){for(var q=r(g);q!==null;){if(q.callback===null)s(g);else if(q.startTime<=D)s(g),q.sortIndex=q.expirationTime,o(p,q);else break;q=r(g)}}function Et(D){if(G=!1,St(D),!V)if(r(p)!==null)V=!0,xt||(xt=!0,kt());else{var q=r(g);q!==null&&jt(Et,q.startTime-D)}}var xt=!1,F=-1,Dt=5,Wt=-1;function je(){return H?!0:!(c.unstable_now()-WtD&&je());){var gt=_.callback;if(typeof gt=="function"){_.callback=null,j=_.priorityLevel;var At=gt(_.expirationTime<=D);if(D=c.unstable_now(),typeof At=="function"){_.callback=At,St(D),q=!0;break e}_===r(p)&&s(p),St(D)}else s(p);_=r(p)}if(_!==null)q=!0;else{var v=r(g);v!==null&&jt(Et,v.startTime-D),q=!1}}break t}finally{_=null,j=k,Z=!1}q=void 0}}finally{q?kt():xt=!1}}}var kt;if(typeof W=="function")kt=function(){W(ve)};else if(typeof MessageChannel<"u"){var He=new MessageChannel,pe=He.port2;He.port1.onmessage=ve,kt=function(){pe.postMessage(null)}}else kt=function(){J(ve,0)};function jt(D,q){F=J(function(){D(c.unstable_now())},q)}c.unstable_IdlePriority=5,c.unstable_ImmediatePriority=1,c.unstable_LowPriority=4,c.unstable_NormalPriority=3,c.unstable_Profiling=null,c.unstable_UserBlockingPriority=2,c.unstable_cancelCallback=function(D){D.callback=null},c.unstable_forceFrameRate=function(D){0>D||125gt?(D.sortIndex=k,o(g,D),r(p)===null&&D===r(g)&&(G?(et(F),F=-1):G=!0,jt(Et,k-gt))):(D.sortIndex=At,o(p,D),V||Z||(V=!0,xt||(xt=!0,kt()))),D},c.unstable_shouldYield=je,c.unstable_wrapCallback=function(D){var q=j;return function(){var k=j;j=q;try{return D.apply(this,arguments)}finally{j=k}}}})(Gf)),Gf}var sm;function v0(){return sm||(sm=1,Lf.exports=g0()),Lf.exports}var Xf={exports:{}},$t={};var om;function p0(){if(om)return $t;om=1;var c=Jf();function o(p){var g="https://react.dev/errors/"+p;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(o){console.error(o)}}return c(),Xf.exports=p0(),Xf.exports}var hm;function S0(){if(hm)return jn;hm=1;var c=v0(),o=Jf(),r=b0();function s(t){var e="https://react.dev/errors/"+t;if(1At||(t.current=gt[At],gt[At]=null,At--)}function B(t,e){At++,gt[At]=t.current,t.current=e}var X=v(null),P=v(null),nt=v(null),mt=v(null);function Ft(t,e){switch(B(nt,e),B(P,t),B(X,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?xh(t):0;break;default:if(t=e.tagName,e=e.namespaceURI)e=xh(e),t=Oh(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}U(X),B(X,t)}function Nt(){U(X),U(P),U(nt)}function La(t){t.memoizedState!==null&&B(mt,t);var e=X.current,l=Oh(e,t.type);e!==l&&(B(P,t),B(X,l))}function Xn(t){P.current===t&&(U(X),U(P)),mt.current===t&&(U(mt),Mn._currentValue=k)}var vi,ls;function Ul(t){if(vi===void 0)try{throw Error()}catch(l){var e=l.stack.trim().match(/\n( *(at )?)/);vi=e&&e[1]||"",ls=-1)":-1n||m[a]!==A[n]){var x=` +`+m[a].replace(" at new "," at ");return t.displayName&&x.includes("")&&(x=x.replace("",t.displayName)),x}while(1<=a&&0<=n);break}}}finally{pi=!1,Error.prepareStackTrace=l}return(l=t?t.displayName||t.name:"")?Ul(l):""}function Vm(t,e){switch(t.tag){case 26:case 27:case 5:return Ul(t.type);case 16:return Ul("Lazy");case 13:return t.child!==e&&e!==null?Ul("Suspense Fallback"):Ul("Suspense");case 19:return Ul("SuspenseList");case 0:case 15:return bi(t.type,!1);case 11:return bi(t.type.render,!1);case 1:return bi(t.type,!0);case 31:return Ul("Activity");default:return""}}function as(t){try{var e="",l=null;do e+=Vm(t,l),l=t,t=t.return;while(t);return e}catch(a){return` +Error generating stack: `+a.message+` +`+a.stack}}var Si=Object.prototype.hasOwnProperty,Ei=c.unstable_scheduleCallback,Ai=c.unstable_cancelCallback,Km=c.unstable_shouldYield,wm=c.unstable_requestPaint,ie=c.unstable_now,Jm=c.unstable_getCurrentPriorityLevel,ns=c.unstable_ImmediatePriority,us=c.unstable_UserBlockingPriority,Qn=c.unstable_NormalPriority,Wm=c.unstable_LowPriority,is=c.unstable_IdlePriority,km=c.log,$m=c.unstable_setDisableYieldValue,Ga=null,ce=null;function fl(t){if(typeof km=="function"&&$m(t),ce&&typeof ce.setStrictMode=="function")try{ce.setStrictMode(Ga,t)}catch{}}var fe=Math.clz32?Math.clz32:Pm,Fm=Math.log,Im=Math.LN2;function Pm(t){return t>>>=0,t===0?32:31-(Fm(t)/Im|0)|0}var Zn=256,Vn=262144,Kn=4194304;function jl(t){var e=t&42;if(e!==0)return e;switch(t&-t){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:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function wn(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,i=t.pingedLanes;t=t.warmLanes;var f=a&134217727;return f!==0?(a=f&~u,a!==0?n=jl(a):(i&=f,i!==0?n=jl(i):l||(l=f&~t,l!==0&&(n=jl(l))))):(f=a&~u,f!==0?n=jl(f):i!==0?n=jl(i):l||(l=a&~t,l!==0&&(n=jl(l)))),n===0?0:e!==0&&e!==n&&(e&u)===0&&(u=n&-n,l=e&-e,u>=l||u===32&&(l&4194048)!==0)?e:n}function Xa(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function td(t,e){switch(t){case 1:case 2:case 4:case 8:case 64:return e+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 e+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 cs(){var t=Kn;return Kn<<=1,(Kn&62914560)===0&&(Kn=4194304),t}function Ti(t){for(var e=[],l=0;31>l;l++)e.push(t);return e}function Qa(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function ed(t,e,l,a,n,u){var i=t.pendingLanes;t.pendingLanes=l,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=l,t.entangledLanes&=l,t.errorRecoveryDisabledLanes&=l,t.shellSuspendCounter=0;var f=t.entanglements,m=t.expirationTimes,A=t.hiddenUpdates;for(l=i&~l;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var cd=/[\n"\\]/g;function Se(t){return t.replace(cd,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function Mi(t,e,l,a,n,u,i,f){t.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?t.type=i:t.removeAttribute("type"),e!=null?i==="number"?(e===0&&t.value===""||t.value!=e)&&(t.value=""+be(e)):t.value!==""+be(e)&&(t.value=""+be(e)):i!=="submit"&&i!=="reset"||t.removeAttribute("value"),e!=null?Di(t,i,be(e)):l!=null?Di(t,i,be(l)):a!=null&&t.removeAttribute("value"),n==null&&u!=null&&(t.defaultChecked=!!u),n!=null&&(t.checked=n&&typeof n!="function"&&typeof n!="symbol"),f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"?t.name=""+be(f):t.removeAttribute("name")}function Ss(t,e,l,a,n,u,i,f){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(t.type=u),e!=null||l!=null){if(!(u!=="submit"&&u!=="reset"||e!=null)){Oi(t);return}l=l!=null?""+be(l):"",e=e!=null?""+be(e):l,f||e===t.value||(t.value=e),t.defaultValue=e}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,t.checked=f?t.checked:!!a,t.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(t.name=i),Oi(t)}function Di(t,e,l){e==="number"&&kn(t.ownerDocument)===t||t.defaultValue===""+l||(t.defaultValue=""+l)}function aa(t,e,l,a){if(t=t.options,e){e={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hi=!1;if(Ze)try{var wa={};Object.defineProperty(wa,"passive",{get:function(){Hi=!0}}),window.addEventListener("test",wa,wa),window.removeEventListener("test",wa,wa)}catch{Hi=!1}var ol=null,qi=null,Fn=null;function xs(){if(Fn)return Fn;var t,e=qi,l=e.length,a,n="value"in ol?ol.value:ol.textContent,u=n.length;for(t=0;t=ka),Us=" ",js=!1;function Hs(t,e){switch(t){case"keyup":return Hd.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qs(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var ca=!1;function Bd(t,e){switch(t){case"compositionend":return qs(e);case"keypress":return e.which!==32?null:(js=!0,Us);case"textInput":return t=e.data,t===Us&&js?null:t;default:return null}}function Yd(t,e){if(ca)return t==="compositionend"||!Xi&&Hs(t,e)?(t=xs(),Fn=qi=ol=null,ca=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1=e)return{node:l,offset:e-t};t=a}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}l=l.parentNode}l=void 0}l=Vs(l)}}function ws(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?ws(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function Js(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var e=kn(t.document);e instanceof t.HTMLIFrameElement;){try{var l=typeof e.contentWindow.location.href=="string"}catch{l=!1}if(l)t=e.contentWindow;else break;e=kn(t.document)}return e}function Vi(t){var e=t&&t.nodeName&&t.nodeName.toLowerCase();return e&&(e==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||e==="textarea"||t.contentEditable==="true")}var wd=Ze&&"documentMode"in document&&11>=document.documentMode,fa=null,Ki=null,Pa=null,wi=!1;function Ws(t,e,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;wi||fa==null||fa!==kn(a)||(a=fa,"selectionStart"in a&&Vi(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}),Pa&&Ia(Pa,a)||(Pa=a,a=Vu(Ki,"onSelect"),0>=i,n-=i,qe=1<<32-fe(e)+n|l<lt?(ft=Q,Q=null):ft=Q.sibling;var rt=T(b,Q,E[lt],N);if(rt===null){Q===null&&(Q=ft);break}t&&Q&&rt.alternate===null&&e(b,Q),y=u(rt,y,lt),ot===null?K=rt:ot.sibling=rt,ot=rt,Q=ft}if(lt===E.length)return l(b,Q),st&&Ke(b,lt),K;if(Q===null){for(;ltlt?(ft=Q,Q=null):ft=Q.sibling;var Cl=T(b,Q,rt.value,N);if(Cl===null){Q===null&&(Q=ft);break}t&&Q&&Cl.alternate===null&&e(b,Q),y=u(Cl,y,lt),ot===null?K=Cl:ot.sibling=Cl,ot=Cl,Q=ft}if(rt.done)return l(b,Q),st&&Ke(b,lt),K;if(Q===null){for(;!rt.done;lt++,rt=E.next())rt=C(b,rt.value,N),rt!==null&&(y=u(rt,y,lt),ot===null?K=rt:ot.sibling=rt,ot=rt);return st&&Ke(b,lt),K}for(Q=a(Q);!rt.done;lt++,rt=E.next())rt=R(Q,b,lt,rt.value,N),rt!==null&&(t&&rt.alternate!==null&&Q.delete(rt.key===null?lt:rt.key),y=u(rt,y,lt),ot===null?K=rt:ot.sibling=rt,ot=rt);return t&&Q.forEach(function(h0){return e(b,h0)}),st&&Ke(b,lt),K}function bt(b,y,E,N){if(typeof E=="object"&&E!==null&&E.type===G&&E.key===null&&(E=E.props.children),typeof E=="object"&&E!==null){switch(E.$$typeof){case Z:t:{for(var K=E.key;y!==null;){if(y.key===K){if(K=E.type,K===G){if(y.tag===7){l(b,y.sibling),N=n(y,E.props.children),N.return=b,b=N;break t}}else if(y.elementType===K||typeof K=="object"&&K!==null&&K.$$typeof===Dt&&Kl(K)===y.type){l(b,y.sibling),N=n(y,E.props),un(N,E),N.return=b,b=N;break t}l(b,y);break}else e(b,y);y=y.sibling}E.type===G?(N=Gl(E.props.children,b.mode,N,E.key),N.return=b,b=N):(N=cu(E.type,E.key,E.props,null,b.mode,N),un(N,E),N.return=b,b=N)}return i(b);case V:t:{for(K=E.key;y!==null;){if(y.key===K)if(y.tag===4&&y.stateNode.containerInfo===E.containerInfo&&y.stateNode.implementation===E.implementation){l(b,y.sibling),N=n(y,E.children||[]),N.return=b,b=N;break t}else{l(b,y);break}else e(b,y);y=y.sibling}N=Pi(E,b.mode,N),N.return=b,b=N}return i(b);case Dt:return E=Kl(E),bt(b,y,E,N)}if(jt(E))return L(b,y,E,N);if(kt(E)){if(K=kt(E),typeof K!="function")throw Error(s(150));return E=K.call(E),w(b,y,E,N)}if(typeof E.then=="function")return bt(b,y,du(E),N);if(E.$$typeof===W)return bt(b,y,ou(b,E),N);yu(b,E)}return typeof E=="string"&&E!==""||typeof E=="number"||typeof E=="bigint"?(E=""+E,y!==null&&y.tag===6?(l(b,y.sibling),N=n(y,E),N.return=b,b=N):(l(b,y),N=Ii(E,b.mode,N),N.return=b,b=N),i(b)):l(b,y)}return function(b,y,E,N){try{nn=0;var K=bt(b,y,E,N);return ba=null,K}catch(Q){if(Q===pa||Q===hu)throw Q;var ot=oe(29,Q,null,b.mode);return ot.lanes=N,ot.return=b,ot}}}var Jl=po(!0),bo=po(!1),yl=!1;function rc(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function hc(t,e){t=t.updateQueue,e.updateQueue===t&&(e.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function gl(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function vl(t,e,l){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(ht&2)!==0){var n=a.pending;return n===null?e.next=e:(e.next=n.next,n.next=e),a.pending=e,e=iu(t),eo(t,null,l),e}return uu(t,a,e,l),iu(t)}function cn(t,e,l){if(e=e.updateQueue,e!==null&&(e=e.shared,(l&4194048)!==0)){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,ss(t,l)}}function mc(t,e){var l=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=e:u=u.next=e}else n=u=e;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},t.updateQueue=l;return}t=l.lastBaseUpdate,t===null?l.firstBaseUpdate=e:t.next=e,l.lastBaseUpdate=e}var dc=!1;function fn(){if(dc){var t=va;if(t!==null)throw t}}function sn(t,e,l,a){dc=!1;var n=t.updateQueue;yl=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,f=n.shared.pending;if(f!==null){n.shared.pending=null;var m=f,A=m.next;m.next=null,i===null?u=A:i.next=A,i=m;var x=t.alternate;x!==null&&(x=x.updateQueue,f=x.lastBaseUpdate,f!==i&&(f===null?x.firstBaseUpdate=A:f.next=A,x.lastBaseUpdate=m))}if(u!==null){var C=n.baseState;i=0,x=A=m=null,f=u;do{var T=f.lane&-536870913,R=T!==f.lane;if(R?(ct&T)===T:(a&T)===T){T!==0&&T===ga&&(dc=!0),x!==null&&(x=x.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});t:{var L=t,w=f;T=e;var bt=l;switch(w.tag){case 1:if(L=w.payload,typeof L=="function"){C=L.call(bt,C,T);break t}C=L;break t;case 3:L.flags=L.flags&-65537|128;case 0:if(L=w.payload,T=typeof L=="function"?L.call(bt,C,T):L,T==null)break t;C=_({},C,T);break t;case 2:yl=!0}}T=f.callback,T!==null&&(t.flags|=64,R&&(t.flags|=8192),R=n.callbacks,R===null?n.callbacks=[T]:R.push(T))}else R={lane:T,tag:f.tag,payload:f.payload,callback:f.callback,next:null},x===null?(A=x=R,m=C):x=x.next=R,i|=T;if(f=f.next,f===null){if(f=n.shared.pending,f===null)break;R=f,f=R.next,R.next=null,n.lastBaseUpdate=R,n.shared.pending=null}}while(!0);x===null&&(m=C),n.baseState=m,n.firstBaseUpdate=A,n.lastBaseUpdate=x,u===null&&(n.shared.lanes=0),Al|=i,t.lanes=i,t.memoizedState=C}}function So(t,e){if(typeof t!="function")throw Error(s(191,t));t.call(e)}function Eo(t,e){var l=t.callbacks;if(l!==null)for(t.callbacks=null,t=0;tu?u:8;var i=D.T,f={};D.T=f,Uc(t,!1,e,l);try{var m=n(),A=D.S;if(A!==null&&A(f,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var x=ey(m,a);hn(t,e,x,ye(t))}else hn(t,e,a,ye(t))}catch(C){hn(t,e,{then:function(){},status:"rejected",reason:C},ye())}finally{q.p=u,i!==null&&f.types!==null&&(i.types=f.types),D.T=i}}function cy(){}function Nc(t,e,l,a){if(t.tag!==5)throw Error(s(476));var n=Po(t).queue;Io(t,n,e,k,l===null?cy:function(){return tr(t),l(a)})}function Po(t){var e=t.memoizedState;if(e!==null)return e;e={memoizedState:k,baseState:k,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ke,lastRenderedState:k},next:null};var l={};return e.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ke,lastRenderedState:l},next:null},t.memoizedState=e,t=t.alternate,t!==null&&(t.memoizedState=e),e}function tr(t){var e=Po(t);e.next===null&&(e=t.alternate.memoizedState),hn(t,e.next.queue,{},ye())}function Cc(){return Kt(Mn)}function er(){return Ut().memoizedState}function lr(){return Ut().memoizedState}function fy(t){for(var e=t.return;e!==null;){switch(e.tag){case 24:case 3:var l=ye();t=gl(l);var a=vl(e,t,l);a!==null&&(ue(a,e,l),cn(a,e,l)),e={cache:cc()},t.payload=e;return}e=e.return}}function sy(t,e,l){var a=ye();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Ru(t)?nr(e,l):(l=$i(t,e,l,a),l!==null&&(ue(l,t,a),ur(l,e,a)))}function ar(t,e,l){var a=ye();hn(t,e,l,a)}function hn(t,e,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(Ru(t))nr(e,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=e.lastRenderedReducer,u!==null))try{var i=e.lastRenderedState,f=u(i,l);if(n.hasEagerState=!0,n.eagerState=f,se(f,i))return uu(t,e,n,0),Tt===null&&nu(),!1}catch{}if(l=$i(t,e,n,a),l!==null)return ue(l,t,a),ur(l,e,a),!0}return!1}function Uc(t,e,l,a){if(a={lane:2,revertLane:hf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Ru(t)){if(e)throw Error(s(479))}else e=$i(t,l,a,2),e!==null&&ue(e,t,2)}function Ru(t){var e=t.alternate;return t===tt||e!==null&&e===tt}function nr(t,e){Ea=pu=!0;var l=t.pending;l===null?e.next=e:(e.next=l.next,l.next=e),t.pending=e}function ur(t,e,l){if((l&4194048)!==0){var a=e.lanes;a&=t.pendingLanes,l|=a,e.lanes=l,ss(t,l)}}var mn={readContext:Kt,use:Eu,useCallback:Ot,useContext:Ot,useEffect:Ot,useImperativeHandle:Ot,useLayoutEffect:Ot,useInsertionEffect:Ot,useMemo:Ot,useReducer:Ot,useRef:Ot,useState:Ot,useDebugValue:Ot,useDeferredValue:Ot,useTransition:Ot,useSyncExternalStore:Ot,useId:Ot,useHostTransitionStatus:Ot,useFormState:Ot,useActionState:Ot,useOptimistic:Ot,useMemoCache:Ot,useCacheRefresh:Ot};mn.useEffectEvent=Ot;var ir={readContext:Kt,use:Eu,useCallback:function(t,e){return It().memoizedState=[t,e===void 0?null:e],t},useContext:Kt,useEffect:Zo,useImperativeHandle:function(t,e,l){l=l!=null?l.concat([t]):null,Tu(4194308,4,Jo.bind(null,e,t),l)},useLayoutEffect:function(t,e){return Tu(4194308,4,t,e)},useInsertionEffect:function(t,e){Tu(4,2,t,e)},useMemo:function(t,e){var l=It();e=e===void 0?null:e;var a=t();if(Wl){fl(!0);try{t()}finally{fl(!1)}}return l.memoizedState=[a,e],a},useReducer:function(t,e,l){var a=It();if(l!==void 0){var n=l(e);if(Wl){fl(!0);try{l(e)}finally{fl(!1)}}}else n=e;return a.memoizedState=a.baseState=n,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=sy.bind(null,tt,t),[a.memoizedState,t]},useRef:function(t){var e=It();return t={current:t},e.memoizedState=t},useState:function(t){t=_c(t);var e=t.queue,l=ar.bind(null,tt,e);return e.dispatch=l,[t.memoizedState,l]},useDebugValue:Mc,useDeferredValue:function(t,e){var l=It();return Dc(l,t,e)},useTransition:function(){var t=_c(!1);return t=Io.bind(null,tt,t.queue,!0,!1),It().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,e,l){var a=tt,n=It();if(st){if(l===void 0)throw Error(s(407));l=l()}else{if(l=e(),Tt===null)throw Error(s(349));(ct&127)!==0||xo(a,e,l)}n.memoizedState=l;var u={value:l,getSnapshot:e};return n.queue=u,Zo(Mo.bind(null,a,u,t),[t]),a.flags|=2048,Ta(9,{destroy:void 0},Oo.bind(null,a,u,l,e),null),l},useId:function(){var t=It(),e=Tt.identifierPrefix;if(st){var l=Be,a=qe;l=(a&~(1<<32-fe(a)-1)).toString(32)+l,e="_"+e+"R_"+l,l=bu++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[Zt]=e,u[Pt]=a;t:for(i=e.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===e)break t;for(;i.sibling===null;){if(i.return===null||i.return===e)break t;i=i.return}i.sibling.return=i.return,i=i.sibling}e.stateNode=u;t:switch(Jt(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break t;case"img":a=!0;break t;default:a=!1}a&&Fe(e)}}return Rt(e),Jc(e,e.type,t===null?null:t.memoizedProps,e.pendingProps,l),null;case 6:if(t&&e.stateNode!=null)t.memoizedProps!==a&&Fe(e);else{if(typeof a!="string"&&e.stateNode===null)throw Error(s(166));if(t=nt.current,da(e)){if(t=e.stateNode,l=e.memoizedProps,a=null,n=Vt,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[Zt]=e,t=!!(t.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||Rh(t.nodeValue,l)),t||ml(e,!0)}else t=Ku(t).createTextNode(a),t[Zt]=e,e.stateNode=t}return Rt(e),null;case 31:if(l=e.memoizedState,t===null||t.memoizedState!==null){if(a=da(e),l!==null){if(t===null){if(!a)throw Error(s(318));if(t=e.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(s(557));t[Zt]=e}else Xl(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Rt(e),t=!1}else l=ac(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=l),t=!0;if(!t)return e.flags&256?(he(e),e):(he(e),null);if((e.flags&128)!==0)throw Error(s(558))}return Rt(e),null;case 13:if(a=e.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=da(e),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(s(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(s(317));n[Zt]=e}else Xl(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;Rt(e),n=!1}else n=ac(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return e.flags&256?(he(e),e):(he(e),null)}return he(e),(e.flags&128)!==0?(e.lanes=l,e):(l=a!==null,t=t!==null&&t.memoizedState!==null,l&&(a=e.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==t&&l&&(e.child.flags|=8192),Du(e,e.updateQueue),Rt(e),null);case 4:return Nt(),t===null&&gf(e.stateNode.containerInfo),Rt(e),null;case 10:return Je(e.type),Rt(e),null;case 19:if(U(Ct),a=e.memoizedState,a===null)return Rt(e),null;if(n=(e.flags&128)!==0,u=a.rendering,u===null)if(n)yn(a,!1);else{if(Mt!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(u=vu(t),u!==null){for(e.flags|=128,yn(a,!1),t=u.updateQueue,e.updateQueue=t,Du(e,t),e.subtreeFlags=0,t=l,l=e.child;l!==null;)lo(l,t),l=l.sibling;return B(Ct,Ct.current&1|2),st&&Ke(e,a.treeForkCount),e.child}t=t.sibling}a.tail!==null&&ie()>Hu&&(e.flags|=128,n=!0,yn(a,!1),e.lanes=4194304)}else{if(!n)if(t=vu(u),t!==null){if(e.flags|=128,n=!0,t=t.updateQueue,e.updateQueue=t,Du(e,t),yn(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!st)return Rt(e),null}else 2*ie()-a.renderingStartTime>Hu&&l!==536870912&&(e.flags|=128,n=!0,yn(a,!1),e.lanes=4194304);a.isBackwards?(u.sibling=e.child,e.child=u):(t=a.last,t!==null?t.sibling=u:e.child=u,a.last=u)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=ie(),t.sibling=null,l=Ct.current,B(Ct,n?l&1|2:l&1),st&&Ke(e,a.treeForkCount),t):(Rt(e),null);case 22:case 23:return he(e),gc(),a=e.memoizedState!==null,t!==null?t.memoizedState!==null!==a&&(e.flags|=8192):a&&(e.flags|=8192),a?(l&536870912)!==0&&(e.flags&128)===0&&(Rt(e),e.subtreeFlags&6&&(e.flags|=8192)):Rt(e),l=e.updateQueue,l!==null&&Du(e,l.retryQueue),l=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),a=null,e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),a!==l&&(e.flags|=2048),t!==null&&U(Vl),null;case 24:return l=null,t!==null&&(l=t.memoizedState.cache),e.memoizedState.cache!==l&&(e.flags|=2048),Je(Ht),Rt(e),null;case 25:return null;case 30:return null}throw Error(s(156,e.tag))}function dy(t,e){switch(ec(e),e.tag){case 1:return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return Je(Ht),Nt(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 26:case 27:case 5:return Xn(e),null;case 31:if(e.memoizedState!==null){if(he(e),e.alternate===null)throw Error(s(340));Xl()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 13:if(he(e),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(s(340));Xl()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return U(Ct),null;case 4:return Nt(),null;case 10:return Je(e.type),null;case 22:case 23:return he(e),gc(),t!==null&&U(Vl),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 24:return Je(Ht),null;case 25:return null;default:return null}}function Dr(t,e){switch(ec(e),e.tag){case 3:Je(Ht),Nt();break;case 26:case 27:case 5:Xn(e);break;case 4:Nt();break;case 31:e.memoizedState!==null&&he(e);break;case 13:he(e);break;case 19:U(Ct);break;case 10:Je(e.type);break;case 22:case 23:he(e),gc(),t!==null&&U(Vl);break;case 24:Je(Ht)}}function gn(t,e){try{var l=e.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&t)===t){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(f){yt(e,e.return,f)}}function Sl(t,e,l){try{var a=e.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&t)===t){var i=a.inst,f=i.destroy;if(f!==void 0){i.destroy=void 0,n=e;var m=l,A=f;try{A()}catch(x){yt(n,m,x)}}}a=a.next}while(a!==u)}}catch(x){yt(e,e.return,x)}}function Nr(t){var e=t.updateQueue;if(e!==null){var l=t.stateNode;try{Eo(e,l)}catch(a){yt(t,t.return,a)}}}function Cr(t,e,l){l.props=kl(t.type,t.memoizedProps),l.state=t.memoizedState;try{l.componentWillUnmount()}catch(a){yt(t,e,a)}}function vn(t,e){try{var l=t.ref;if(l!==null){switch(t.tag){case 26:case 27:case 5:var a=t.stateNode;break;case 30:a=t.stateNode;break;default:a=t.stateNode}typeof l=="function"?t.refCleanup=l(a):l.current=a}}catch(n){yt(t,e,n)}}function Ye(t,e){var l=t.ref,a=t.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){yt(t,e,n)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){yt(t,e,n)}else l.current=null}function Ur(t){var e=t.type,l=t.memoizedProps,a=t.stateNode;try{t:switch(e){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break t;case"img":l.src?a.src=l.src:l.srcSet&&(a.srcset=l.srcSet)}}catch(n){yt(t,t.return,n)}}function Wc(t,e,l){try{var a=t.stateNode;qy(a,t.type,l,e),a[Pt]=e}catch(n){yt(t,t.return,n)}}function jr(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&xl(t.type)||t.tag===4}function kc(t){t:for(;;){for(;t.sibling===null;){if(t.return===null||jr(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&xl(t.type)||t.flags&2||t.child===null||t.tag===4)continue t;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function $c(t,e,l){var a=t.tag;if(a===5||a===6)t=t.stateNode,e?(l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l).insertBefore(t,e):(e=l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l,e.appendChild(t),l=l._reactRootContainer,l!=null||e.onclick!==null||(e.onclick=Qe));else if(a!==4&&(a===27&&xl(t.type)&&(l=t.stateNode,e=null),t=t.child,t!==null))for($c(t,e,l),t=t.sibling;t!==null;)$c(t,e,l),t=t.sibling}function Nu(t,e,l){var a=t.tag;if(a===5||a===6)t=t.stateNode,e?l.insertBefore(t,e):l.appendChild(t);else if(a!==4&&(a===27&&xl(t.type)&&(l=t.stateNode),t=t.child,t!==null))for(Nu(t,e,l),t=t.sibling;t!==null;)Nu(t,e,l),t=t.sibling}function Hr(t){var e=t.stateNode,l=t.memoizedProps;try{for(var a=t.type,n=e.attributes;n.length;)e.removeAttributeNode(n[0]);Jt(e,a,l),e[Zt]=t,e[Pt]=l}catch(u){yt(t,t.return,u)}}var Ie=!1,Yt=!1,Fc=!1,qr=typeof WeakSet=="function"?WeakSet:Set,Qt=null;function yy(t,e){if(t=t.containerInfo,bf=Iu,t=Js(t),Vi(t)){if("selectionStart"in t)var l={start:t.selectionStart,end:t.selectionEnd};else t:{l=(l=t.ownerDocument)&&l.defaultView||window;var a=l.getSelection&&l.getSelection();if(a&&a.rangeCount!==0){l=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{l.nodeType,u.nodeType}catch{l=null;break t}var i=0,f=-1,m=-1,A=0,x=0,C=t,T=null;e:for(;;){for(var R;C!==l||n!==0&&C.nodeType!==3||(f=i+n),C!==u||a!==0&&C.nodeType!==3||(m=i+a),C.nodeType===3&&(i+=C.nodeValue.length),(R=C.firstChild)!==null;)T=C,C=R;for(;;){if(C===t)break e;if(T===l&&++A===n&&(f=i),T===u&&++x===a&&(m=i),(R=C.nextSibling)!==null)break;C=T,T=C.parentNode}C=R}l=f===-1||m===-1?null:{start:f,end:m}}else l=null}l=l||{start:0,end:0}}else l=null;for(Sf={focusedElem:t,selectionRange:l},Iu=!1,Qt=e;Qt!==null;)if(e=Qt,t=e.child,(e.subtreeFlags&1028)!==0&&t!==null)t.return=e,Qt=t;else for(;Qt!==null;){switch(e=Qt,u=e.alternate,t=e.flags,e.tag){case 0:if((t&4)!==0&&(t=e.updateQueue,t=t!==null?t.events:null,t!==null))for(l=0;l title"))),Jt(u,a,l),u[Zt]=t,Xt(u),a=u;break t;case"link":var i=Qh("link","href",n).get(a+(l.href||""));if(i){for(var f=0;fbt&&(i=bt,bt=w,w=i);var b=Ks(f,w),y=Ks(f,bt);if(b&&y&&(R.rangeCount!==1||R.anchorNode!==b.node||R.anchorOffset!==b.offset||R.focusNode!==y.node||R.focusOffset!==y.offset)){var E=C.createRange();E.setStart(b.node,b.offset),R.removeAllRanges(),w>bt?(R.addRange(E),R.extend(y.node,y.offset)):(E.setEnd(y.node,y.offset),R.addRange(E))}}}}for(C=[],R=f;R=R.parentNode;)R.nodeType===1&&C.push({element:R,left:R.scrollLeft,top:R.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fl?32:l,D.T=null,l=nf,nf=null;var u=zl,i=al;if(Lt=0,Oa=zl=null,al=0,(ht&6)!==0)throw Error(s(331));var f=ht;if(ht|=4,Jr(u.current),Vr(u,u.current,i,l),ht=f,Tn(0,!1),ce&&typeof ce.onPostCommitFiberRoot=="function")try{ce.onPostCommitFiberRoot(Ga,u)}catch{}return!0}finally{q.p=n,D.T=a,rh(t,e)}}function mh(t,e,l){e=Ae(l,e),e=Bc(t.stateNode,e,2),t=vl(t,e,2),t!==null&&(Qa(t,2),Le(t))}function yt(t,e,l){if(t.tag===3)mh(t,t,l);else for(;e!==null;){if(e.tag===3){mh(e,t,l);break}else if(e.tag===1){var a=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Tl===null||!Tl.has(a))){t=Ae(l,t),l=dr(2),a=vl(e,l,2),a!==null&&(yr(l,a,e,t),Qa(a,2),Le(a));break}}e=e.return}}function sf(t,e,l){var a=t.pingCache;if(a===null){a=t.pingCache=new py;var n=new Set;a.set(e,n)}else n=a.get(e),n===void 0&&(n=new Set,a.set(e,n));n.has(l)||(tf=!0,n.add(l),t=Ty.bind(null,t,e,l),e.then(t,t))}function Ty(t,e,l){var a=t.pingCache;a!==null&&a.delete(e),t.pingedLanes|=t.suspendedLanes&l,t.warmLanes&=~l,Tt===t&&(ct&l)===l&&(Mt===4||Mt===3&&(ct&62914560)===ct&&300>ie()-ju?(ht&2)===0&&Ma(t,0):ef|=l,xa===ct&&(xa=0)),Le(t)}function dh(t,e){e===0&&(e=cs()),t=Ll(t,e),t!==null&&(Qa(t,e),Le(t))}function zy(t){var e=t.memoizedState,l=0;e!==null&&(l=e.retryLane),dh(t,l)}function Ry(t,e){var l=0;switch(t.tag){case 31:case 13:var a=t.stateNode,n=t.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=t.stateNode;break;case 22:a=t.stateNode._retryCache;break;default:throw Error(s(314))}a!==null&&a.delete(e),dh(t,l)}function _y(t,e){return Ei(t,e)}var Xu=null,Na=null,of=!1,Qu=!1,rf=!1,_l=0;function Le(t){t!==Na&&t.next===null&&(Na===null?Xu=Na=t:Na=Na.next=t),Qu=!0,of||(of=!0,Oy())}function Tn(t,e){if(!rf&&Qu){rf=!0;do for(var l=!1,a=Xu;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,f=a.pingedLanes;u=(1<<31-fe(42|t)+1)-1,u&=n&~(i&~f),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,ph(a,u))}else u=ct,u=wn(a,a===Tt?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||Xa(a,u)||(l=!0,ph(a,u));a=a.next}while(l);rf=!1}}function xy(){yh()}function yh(){Qu=of=!1;var t=0;_l!==0&&Yy()&&(t=_l);for(var e=ie(),l=null,a=Xu;a!==null;){var n=a.next,u=gh(a,e);u===0?(a.next=null,l===null?Xu=n:l.next=n,n===null&&(Na=l)):(l=a,(t!==0||(u&3)!==0)&&(Qu=!0)),a=n}Lt!==0&&Lt!==5||Tn(t),_l!==0&&(_l=0)}function gh(t,e){for(var l=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0f)break;var x=m.transferSize,C=m.initiatorType;x&&_h(C)&&(m=m.responseEnd,i+=x*(m"u"?null:document;function Yh(t,e,l){var a=Ca;if(a&&typeof e=="string"&&e){var n=Se(e);n='link[rel="'+t+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),Bh.has(n)||(Bh.add(n),t={rel:t,crossOrigin:l,href:e},a.querySelector(n)===null&&(e=a.createElement("link"),Jt(e,"link",t),Xt(e),a.head.appendChild(e)))}}function Jy(t){nl.D(t),Yh("dns-prefetch",t,null)}function Wy(t,e){nl.C(t,e),Yh("preconnect",t,e)}function ky(t,e,l){nl.L(t,e,l);var a=Ca;if(a&&t&&e){var n='link[rel="preload"][as="'+Se(e)+'"]';e==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+Se(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+Se(l.imageSizes)+'"]')):n+='[href="'+Se(t)+'"]';var u=n;switch(e){case"style":u=Ua(t);break;case"script":u=ja(t)}Oe.has(u)||(t=_({rel:"preload",href:e==="image"&&l&&l.imageSrcSet?void 0:t,as:e},l),Oe.set(u,t),a.querySelector(n)!==null||e==="style"&&a.querySelector(xn(u))||e==="script"&&a.querySelector(On(u))||(e=a.createElement("link"),Jt(e,"link",t),Xt(e),a.head.appendChild(e)))}}function $y(t,e){nl.m(t,e);var l=Ca;if(l&&t){var a=e&&typeof e.as=="string"?e.as:"script",n='link[rel="modulepreload"][as="'+Se(a)+'"][href="'+Se(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=ja(t)}if(!Oe.has(u)&&(t=_({rel:"modulepreload",href:t},e),Oe.set(u,t),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(On(u)))return}a=l.createElement("link"),Jt(a,"link",t),Xt(a),l.head.appendChild(a)}}}function Fy(t,e,l){nl.S(t,e,l);var a=Ca;if(a&&t){var n=ea(a).hoistableStyles,u=Ua(t);e=e||"default";var i=n.get(u);if(!i){var f={loading:0,preload:null};if(i=a.querySelector(xn(u)))f.loading=5;else{t=_({rel:"stylesheet",href:t,"data-precedence":e},l),(l=Oe.get(u))&&xf(t,l);var m=i=a.createElement("link");Xt(m),Jt(m,"link",t),m._p=new Promise(function(A,x){m.onload=A,m.onerror=x}),m.addEventListener("load",function(){f.loading|=1}),m.addEventListener("error",function(){f.loading|=2}),f.loading|=4,Ju(i,e,a)}i={type:"stylesheet",instance:i,count:1,state:f},n.set(u,i)}}}function Iy(t,e){nl.X(t,e);var l=Ca;if(l&&t){var a=ea(l).hoistableScripts,n=ja(t),u=a.get(n);u||(u=l.querySelector(On(n)),u||(t=_({src:t,async:!0},e),(e=Oe.get(n))&&Of(t,e),u=l.createElement("script"),Xt(u),Jt(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Py(t,e){nl.M(t,e);var l=Ca;if(l&&t){var a=ea(l).hoistableScripts,n=ja(t),u=a.get(n);u||(u=l.querySelector(On(n)),u||(t=_({src:t,async:!0,type:"module"},e),(e=Oe.get(n))&&Of(t,e),u=l.createElement("script"),Xt(u),Jt(u,"link",t),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Lh(t,e,l,a){var n=(n=nt.current)?wu(n):null;if(!n)throw Error(s(446));switch(t){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(e=Ua(l.href),l=ea(n).hoistableStyles,a=l.get(e),a||(a={type:"style",instance:null,count:0,state:null},l.set(e,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){t=Ua(l.href);var u=ea(n).hoistableStyles,i=u.get(t);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,i),(u=n.querySelector(xn(t)))&&!u._p&&(i.instance=u,i.state.loading=5),Oe.has(t)||(l={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Oe.set(t,l),u||t0(n,t,l,i.state))),e&&a===null)throw Error(s(528,""));return i}if(e&&a!==null)throw Error(s(529,""));return null;case"script":return e=l.async,l=l.src,typeof l=="string"&&e&&typeof e!="function"&&typeof e!="symbol"?(e=ja(l),l=ea(n).hoistableScripts,a=l.get(e),a||(a={type:"script",instance:null,count:0,state:null},l.set(e,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(s(444,t))}}function Ua(t){return'href="'+Se(t)+'"'}function xn(t){return'link[rel="stylesheet"]['+t+"]"}function Gh(t){return _({},t,{"data-precedence":t.precedence,precedence:null})}function t0(t,e,l,a){t.querySelector('link[rel="preload"][as="style"]['+e+"]")?a.loading=1:(e=t.createElement("link"),a.preload=e,e.addEventListener("load",function(){return a.loading|=1}),e.addEventListener("error",function(){return a.loading|=2}),Jt(e,"link",l),Xt(e),t.head.appendChild(e))}function ja(t){return'[src="'+Se(t)+'"]'}function On(t){return"script[async]"+t}function Xh(t,e,l){if(e.count++,e.instance===null)switch(e.type){case"style":var a=t.querySelector('style[data-href~="'+Se(l.href)+'"]');if(a)return e.instance=a,Xt(a),a;var n=_({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),Xt(a),Jt(a,"style",n),Ju(a,l.precedence,t),e.instance=a;case"stylesheet":n=Ua(l.href);var u=t.querySelector(xn(n));if(u)return e.state.loading|=4,e.instance=u,Xt(u),u;a=Gh(l),(n=Oe.get(n))&&xf(a,n),u=(t.ownerDocument||t).createElement("link"),Xt(u);var i=u;return i._p=new Promise(function(f,m){i.onload=f,i.onerror=m}),Jt(u,"link",a),e.state.loading|=4,Ju(u,l.precedence,t),e.instance=u;case"script":return u=ja(l.src),(n=t.querySelector(On(u)))?(e.instance=n,Xt(n),n):(a=l,(n=Oe.get(u))&&(a=_({},l),Of(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),Xt(n),Jt(n,"link",a),t.head.appendChild(n),e.instance=n);case"void":return null;default:throw Error(s(443,e.type))}else e.type==="stylesheet"&&(e.state.loading&4)===0&&(a=e.instance,e.state.loading|=4,Ju(a,l.precedence,t));return e.instance}function Ju(t,e,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title"):null)}function e0(t,e,l){if(l===1||e.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof e.precedence!="string"||typeof e.href!="string"||e.href==="")break;return!0;case"link":if(typeof e.rel!="string"||typeof e.href!="string"||e.href===""||e.onLoad||e.onError)break;return e.rel==="stylesheet"?(t=e.disabled,typeof e.precedence=="string"&&t==null):!0;case"script":if(e.async&&typeof e.async!="function"&&typeof e.async!="symbol"&&!e.onLoad&&!e.onError&&e.src&&typeof e.src=="string")return!0}return!1}function Vh(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function l0(t,e,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=Ua(a.href),u=e.querySelector(xn(n));if(u){e=u._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(t.count++,t=ku.bind(t),e.then(t,t)),l.state.loading|=4,l.instance=u,Xt(u);return}u=e.ownerDocument||e,a=Gh(a),(n=Oe.get(n))&&xf(a,n),u=u.createElement("link"),Xt(u);var i=u;i._p=new Promise(function(f,m){i.onload=f,i.onerror=m}),Jt(u,"link",a),l.instance=u}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(l,e),(e=l.state.preload)&&(l.state.loading&3)===0&&(t.count++,l=ku.bind(t),e.addEventListener("load",l),e.addEventListener("error",l))}}var Mf=0;function a0(t,e){return t.stylesheets&&t.count===0&&Fu(t,t.stylesheets),0Mf?50:800)+e);return t.unsuspend=l,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function ku(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Fu(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var $u=null;function Fu(t,e){t.stylesheets=null,t.unsuspend!==null&&(t.count++,$u=new Map,e.forEach(n0,t),$u=null,ku.call(t))}function n0(t,e){if(!(e.state.loading&4)){var l=$u.get(t);if(l)var a=l.get(null);else{l=new Map,$u.set(t,l);for(var n=t.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(o){console.error(o)}}return c(),Yf.exports=S0(),Yf.exports}var A0=E0();var Wf=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,Tm=/^[\\/]{2}/;function T0(c,o){return o+c.replace(/\\/g,"/")}var dm="popstate";function ym(c){return typeof c=="object"&&c!=null&&"pathname"in c&&"search"in c&&"hash"in c&&"state"in c&&"key"in c}function z0(c={}){function o(s,h){let d=h.state?.masked,{pathname:S,search:z,hash:p}=d||s.location;return wf("",{pathname:S,search:z,hash:p},h.state&&h.state.usr||null,h.state&&h.state.key||"default",d?{pathname:s.location.pathname,search:s.location.search,hash:s.location.hash}:void 0)}function r(s,h){return typeof h=="string"?h:Bn(h)}return _0(o,r,null,c)}function Gt(c,o){if(c===!1||c===null||typeof c>"u")throw new Error(o)}function Ge(c,o){if(!c){typeof console<"u"&&console.warn(o);try{throw new Error(o)}catch{}}}function R0(){return Math.random().toString(36).substring(2,10)}function gm(c,o){return{usr:c.state,key:c.key,idx:o,masked:c.mask?{pathname:c.pathname,search:c.search,hash:c.hash}:void 0}}function wf(c,o,r=null,s,h){return{pathname:typeof c=="string"?c:c.pathname,search:"",hash:"",...typeof o=="string"?Yn(o):o,state:r,key:o&&o.key||s||R0(),mask:h}}function Bn({pathname:c="/",search:o="",hash:r=""}){return o&&o!=="?"&&(c+=o.charAt(0)==="?"?o:"?"+o),r&&r!=="#"&&(c+=r.charAt(0)==="#"?r:"#"+r),c}function Yn(c){let o={};if(c){let r=c.indexOf("#");r>=0&&(o.hash=c.substring(r),c=c.substring(0,r));let s=c.indexOf("?");s>=0&&(o.search=c.substring(s),c=c.substring(0,s)),c&&(o.pathname=c)}return o}function _0(c,o,r,s={}){let{window:h=document.defaultView,v5Compat:d=!1}=s,S=h.history,z="POP",p=null,g=M();g==null&&(g=0,S.replaceState({...S.state,idx:g},""));function M(){return(S.state||{idx:null}).idx}function _(){z="POP";let H=M(),J=H==null?null:H-g;g=H,p&&p({action:z,location:G.location,delta:J})}function j(H,J){z="PUSH";let et=ym(H)?H:wf(G.location,H,J);g=M()+1;let W=gm(et,g),St=G.createHref(et.mask||et);try{S.pushState(W,"",St)}catch(Et){if(Et instanceof DOMException&&Et.name==="DataCloneError")throw Et;h.location.assign(St)}d&&p&&p({action:z,location:G.location,delta:1})}function Z(H,J){z="REPLACE";let et=ym(H)?H:wf(G.location,H,J);g=M();let W=gm(et,g),St=G.createHref(et.mask||et);S.replaceState(W,"",St),d&&p&&p({action:z,location:G.location,delta:0})}function V(H){return x0(h,H)}let G={get action(){return z},get location(){return c(h,S)},listen(H){if(p)throw new Error("A history only accepts one active listener");return h.addEventListener(dm,_),p=H,()=>{h.removeEventListener(dm,_),p=null}},createHref(H){return o(h,H)},createURL:V,encodeLocation(H){let J=V(H);return{pathname:J.pathname,search:J.search,hash:J.hash}},push:j,replace:Z,go(H){return S.go(H)}};return G}function x0(c,o,r=!1){let s="http://localhost";c&&(s=c.location.origin!=="null"?c.location.origin:c.location.href),Gt(s,"No window.location.(origin|href) available to create URL");let h=typeof o=="string"?o:Bn(o);return h=h.replace(/ $/,"%20"),!r&&Tm.test(h)&&(h=s+h),new URL(h,s)}function zm(c,o,r="/"){return O0(c,o,r,!1)}function O0(c,o,r,s,h){let d=typeof o=="string"?Yn(o):o,S=ul(d.pathname||"/",r);if(S==null)return null;let z=M0(c),p=null,g=G0(S);for(let M=0;p==null&&M{let M={relativePath:g===void 0?S.path||"":g,caseSensitive:S.caseSensitive===!0,childrenIndex:z,route:S};if(M.relativePath.startsWith("/")){if(!M.relativePath.startsWith(s)&&p)return;Gt(M.relativePath.startsWith(s),`Absolute route path "${M.relativePath}" nested under path "${s}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),M.relativePath=M.relativePath.slice(s.length)}let _=Ue([s,M.relativePath]),j=r.concat(M);S.children&&S.children.length>0&&(Gt(S.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${_}".`),Rm(S.children,o,j,_,p)),!(S.path==null&&!S.index)&&o.push({path:_,score:B0(_,S.index),routesMeta:j.map((Z,V)=>{let[G,H]=Om(Z.relativePath,Z.caseSensitive,V===j.length-1);return{...Z,matcher:G,compiledParams:H}})})};return c.forEach((S,z)=>{if(S.path===""||!S.path?.includes("?"))d(S,z);else for(let p of _m(S.path))d(S,z,!0,p)}),o}function _m(c){let o=c.split("/");if(o.length===0)return[];let[r,...s]=o,h=r.endsWith("?"),d=r.replace(/\?$/,"");if(s.length===0)return h?[d,""]:[d];let S=_m(s.join("/")),z=[];return z.push(...S.map(p=>p===""?d:[d,p].join("/"))),h&&z.push(...S),z.map(p=>c.startsWith("/")&&p===""?"/":p)}function D0(c){c.sort((o,r)=>o.score!==r.score?r.score-o.score:Y0(o.routesMeta.map(s=>s.childrenIndex),r.routesMeta.map(s=>s.childrenIndex)))}var N0=/^:[\w-]+$/,C0=3,U0=2,j0=1,H0=10,q0=-2,vm=c=>c==="*";function B0(c,o){let r=c.split("/"),s=r.length;return r.some(vm)&&(s+=q0),o&&(s+=U0),r.filter(h=>!vm(h)).reduce((h,d)=>h+(N0.test(d)?C0:d===""?j0:H0),s)}function Y0(c,o){return c.length===o.length&&c.slice(0,-1).every((s,h)=>s===o[h])?c[c.length-1]-o[o.length-1]:0}function L0(c,o,r=!1){let{routesMeta:s}=c,h={},d="/",S=[];for(let z=0;z{if(M==="*"){let V=z[j]||"";S=d.slice(0,d.length-V.length).replace(/(.)\/+$/,"$1")}const Z=z[j];return _&&!Z?g[M]=void 0:g[M]=(Z||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:S,pattern:c}}function Om(c,o=!1,r=!0){Ge(c==="*"||!c.endsWith("*")||c.endsWith("/*"),`Route path "${c}" will be treated as if it were "${c.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${c.replace(/\*$/,"/*")}".`);let s=[],h="^"+c.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(S,z,p,g,M)=>{if(s.push({paramName:z,isOptional:p!=null}),p){let _=M.charAt(g+S.length);return _&&_!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return c.endsWith("*")?(s.push({paramName:"*"}),h+=c==="*"||c==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?h+="\\/*$":c!==""&&c!=="/"&&(h+="(?:(?=\\/|$))"),[new RegExp(h,o?void 0:"i"),s]}function G0(c){try{return c.split("/").map(o=>decodeURIComponent(o).replace(/\//g,"%2F")).join("/")}catch(o){return Ge(!1,`The URL path "${c}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${o}).`),c}}function ul(c,o){if(o==="/")return c;if(!c.toLowerCase().startsWith(o.toLowerCase()))return null;let r=o.endsWith("/")?o.length-1:o.length,s=c.charAt(r);return s&&s!=="/"?null:c.slice(r)||"/"}function X0(c,o="/"){let{pathname:r,search:s="",hash:h=""}=typeof c=="string"?Yn(c):c,d;return r?(r=Dm(r),r.startsWith("/")?d=pm(r.substring(1),"/"):d=pm(r,o)):d=o,{pathname:d,search:V0(s),hash:K0(h)}}function pm(c,o){let r=hi(o).split("/");return c.split("/").forEach(h=>{h===".."?r.length>1&&r.pop():h!=="."&&r.push(h)}),r.length>1?r.join("/"):"/"}function Qf(c,o,r,s){return`Cannot include a '${c}' character in a manually specified \`to.${o}\` field [${JSON.stringify(s)}]. Please separate it out to the \`to.${r}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Q0(c){return c.filter((o,r)=>r===0||o.route.path&&o.route.path.length>0)}function Mm(c){let o=Q0(c);return o.map((r,s)=>s===o.length-1?r.pathname:r.pathnameBase)}function kf(c,o,r,s=!1){let h;typeof c=="string"?h=Yn(c):(h={...c},Gt(!h.pathname||!h.pathname.includes("?"),Qf("?","pathname","search",h)),Gt(!h.pathname||!h.pathname.includes("#"),Qf("#","pathname","hash",h)),Gt(!h.search||!h.search.includes("#"),Qf("#","search","hash",h)));let d=c===""||h.pathname==="",S=d?"/":h.pathname,z;if(S==null)z=r;else{let _=o.length-1;if(!s&&S.startsWith("..")){let j=S.split("/");for(;j[0]==="..";)j.shift(),_-=1;h.pathname=j.join("/")}z=_>=0?o[_]:"/"}let p=X0(h,z),g=S&&S!=="/"&&S.endsWith("/"),M=(d||S===".")&&r.endsWith("/");return!p.pathname.endsWith("/")&&(g||M)&&(p.pathname+="/"),p}var Dm=c=>c.replace(/[\\/]{2,}/g,"/"),Ue=c=>Dm(c.join("/")),hi=c=>c.replace(/\/+$/,""),Z0=c=>hi(c).replace(/^\/*/,"/"),V0=c=>!c||c==="?"?"":c.startsWith("?")?c:"?"+c,K0=c=>!c||c==="#"?"":c.startsWith("#")?c:"#"+c,w0=class{constructor(c,o,r,s=!1){this.status=c,this.statusText=o||"",this.internal=s,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}};function J0(c){return c!=null&&typeof c.status=="number"&&typeof c.statusText=="string"&&typeof c.internal=="boolean"&&"data"in c}function W0(c){let o=c.map(r=>r.route.path).filter(Boolean);return Ue(o)||"/"}var Nm=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Cm(c,o){let r=c;if(typeof r!="string"||!Wf.test(r))return{absoluteURL:void 0,isExternal:!1,to:r};let s=r,h=!1;if(Nm)try{let d=new URL(window.location.href),S=Tm.test(r)?new URL(T0(r,d.protocol)):new URL(r),z=ul(S.pathname,o);S.origin===d.origin&&z!=null?r=z+S.search+S.hash:h=!0}catch{Ge(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:s,isExternal:h,to:r}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Um=["POST","PUT","PATCH","DELETE"];new Set(Um);var k0=["GET",...Um];new Set(k0);var $0=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];function F0(c){try{return $0.includes(new URL(c).protocol)}catch{return!1}}var Ya=O.createContext(null);Ya.displayName="DataRouter";var mi=O.createContext(null);mi.displayName="DataRouterState";var jm=O.createContext(!1);function I0(){return O.useContext(jm)}var Hm=O.createContext({isTransitioning:!1});Hm.displayName="ViewTransition";var P0=O.createContext(new Map);P0.displayName="Fetchers";var tg=O.createContext(null);tg.displayName="Await";var Me=O.createContext(null);Me.displayName="Navigation";var di=O.createContext(null);di.displayName="Location";var il=O.createContext({outlet:null,matches:[],isDataRoute:!1});il.displayName="Route";var $f=O.createContext(null);$f.displayName="RouteError";var qm="REACT_ROUTER_ERROR",eg="REDIRECT",lg="ROUTE_ERROR_RESPONSE";function ag(c){if(c.startsWith(`${qm}:${eg}:{`))try{let o=JSON.parse(c.slice(28));if(typeof o=="object"&&o&&typeof o.status=="number"&&typeof o.statusText=="string"&&typeof o.location=="string"&&typeof o.reloadDocument=="boolean"&&typeof o.replace=="boolean")return o}catch{}}function ng(c){if(c.startsWith(`${qm}:${lg}:{`))try{let o=JSON.parse(c.slice(40));if(typeof o=="object"&&o&&typeof o.status=="number"&&typeof o.statusText=="string")return new w0(o.status,o.statusText,o.data)}catch{}}function ug(c,{relative:o}={}){Gt(Ln(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:s}=O.useContext(Me),{hash:h,pathname:d,search:S}=Gn(c,{relative:o}),z=d;return r!=="/"&&(z=d==="/"?r:Ue([r,d])),s.createHref({pathname:z,search:S,hash:h})}function Ln(){return O.useContext(di)!=null}function cl(){return Gt(Ln(),"useLocation() may be used only in the context of a component."),O.useContext(di).location}var Bm="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Ym(c){O.useContext(Me).static||O.useLayoutEffect(c)}function ig(){let{isDataRoute:c}=O.useContext(il);return c?bg():cg()}function cg(){Gt(Ln(),"useNavigate() may be used only in the context of a component.");let c=O.useContext(Ya),{basename:o,navigator:r}=O.useContext(Me),{matches:s}=O.useContext(il),{pathname:h}=cl(),d=JSON.stringify(Mm(s)),S=O.useRef(!1);return Ym(()=>{S.current=!0}),O.useCallback((p,g={})=>{if(Ge(S.current,Bm),!S.current)return;if(typeof p=="number"){r.go(p);return}let M=kf(p,JSON.parse(d),h,g.relative==="path");c==null&&o!=="/"&&(M.pathname=M.pathname==="/"?o:Ue([o,M.pathname])),(g.replace?r.replace:r.push)(M,g.state,g)},[o,r,d,h,c])}O.createContext(null);function Gn(c,{relative:o}={}){let{matches:r}=O.useContext(il),{pathname:s}=cl(),h=JSON.stringify(Mm(r));return O.useMemo(()=>kf(c,JSON.parse(h),s,o==="path"),[c,h,s,o])}function fg(c,o,r){Gt(Ln(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=O.useContext(Me),{matches:h}=O.useContext(il),d=h[h.length-1],S=d?d.params:{},z=d?d.pathname:"/",p=d?d.pathnameBase:"/",g=d&&d.route;{let H=g&&g.path||"";Gm(z,!g||H.endsWith("*")||H.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${z}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let M=cl(),_;_=M;let j=_.pathname||"/",Z=j;if(p!=="/"){let H=p.replace(/^\//,"").split("/");Z="/"+j.replace(/^\//,"").split("/").slice(H.length).join("/")}let V=r&&r.state.matches.length?r.state.matches.map(H=>Object.assign(H,{route:r.manifest[H.route.id]||H.route})):zm(c,{pathname:Z});return Ge(g||V!=null,`No routes matched location "${_.pathname}${_.search}${_.hash}" `),Ge(V==null||V[V.length-1].route.element!==void 0||V[V.length-1].route.Component!==void 0||V[V.length-1].route.lazy!==void 0,`Matched leaf route at location "${_.pathname}${_.search}${_.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`),mg(V&&V.map(H=>Object.assign({},H,{params:Object.assign({},S,H.params),pathname:Ue([p,s.encodeLocation?s.encodeLocation(H.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:H.pathname]),pathnameBase:H.pathnameBase==="/"?p:Ue([p,s.encodeLocation?s.encodeLocation(H.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:H.pathnameBase])})),h,r)}function sg(){let c=pg(),o=J0(c)?`${c.status} ${c.statusText}`:c instanceof Error?c.message:JSON.stringify(c),r=c instanceof Error?c.stack:null,s="rgba(200,200,200, 0.5)",h={padding:"0.5rem",backgroundColor:s},d={padding:"2px 4px",backgroundColor:s},S=null;return console.error("Error handled by React Router default ErrorBoundary:",c),S=O.createElement(O.Fragment,null,O.createElement("p",null,"💿 Hey developer 👋"),O.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",O.createElement("code",{style:d},"ErrorBoundary")," or"," ",O.createElement("code",{style:d},"errorElement")," prop on your route.")),O.createElement(O.Fragment,null,O.createElement("h2",null,"Unexpected Application Error!"),O.createElement("h3",{style:{fontStyle:"italic"}},o),r?O.createElement("pre",{style:h},r):null,S)}var og=O.createElement(sg,null),Lm=class extends O.Component{constructor(c){super(c),this.state={location:c.location,revalidation:c.revalidation,error:c.error}}static getDerivedStateFromError(c){return{error:c}}static getDerivedStateFromProps(c,o){return o.location!==c.location||o.revalidation!=="idle"&&c.revalidation==="idle"?{error:c.error,location:c.location,revalidation:c.revalidation}:{error:c.error!==void 0?c.error:o.error,location:o.location,revalidation:c.revalidation||o.revalidation}}componentDidCatch(c,o){this.props.onError?this.props.onError(c,o):console.error("React Router caught the following error during render",c)}render(){let c=this.state.error;if(this.context&&typeof c=="object"&&c&&"digest"in c&&typeof c.digest=="string"){const r=ng(c.digest);r&&(c=r)}let o=c!==void 0?O.createElement(il.Provider,{value:this.props.routeContext},O.createElement($f.Provider,{value:c,children:this.props.component})):this.props.children;return this.context?O.createElement(rg,{error:c},o):o}};Lm.contextType=jm;var Zf=new WeakMap;function rg({children:c,error:o}){let{basename:r}=O.useContext(Me);if(typeof o=="object"&&o&&"digest"in o&&typeof o.digest=="string"){let s=ag(o.digest);if(s){let h=Zf.get(o);if(h)throw h;let d=Cm(s.location,r),S=d.absoluteURL||d.to;if(F0(S))throw new Error("Invalid redirect location");if(Nm&&!Zf.get(o))if(d.isExternal||s.reloadDocument)window.location.href=S;else{const z=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(d.to,{replace:s.replace}));throw Zf.set(o,z),z}return O.createElement("meta",{httpEquiv:"refresh",content:`0;url=${S}`})}}return c}function hg({routeContext:c,match:o,children:r}){let s=O.useContext(Ya);return s&&s.static&&s.staticContext&&(o.route.errorElement||o.route.ErrorBoundary)&&(s.staticContext._deepestRenderedBoundaryId=o.route.id),O.createElement(il.Provider,{value:c},r)}function mg(c,o=[],r){let s=r?.state;if(c==null){if(!s)return null;if(s.errors)c=s.matches;else if(o.length===0&&!s.initialized&&s.matches.length>0)c=s.matches;else return null}let h=c,d=s?.errors;if(d!=null){let M=h.findIndex(_=>_.route.id&&d?.[_.route.id]!==void 0);Gt(M>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(d).join(",")}`),h=h.slice(0,Math.min(h.length,M+1))}let S=!1,z=-1;if(r&&s){S=s.renderFallback;for(let M=0;M=0?h=h.slice(0,z+1):h=[h[0]];break}}}}let p=r?.onError,g=s&&p?(M,_)=>{p(M,{location:s.location,params:s.matches?.[0]?.params??{},pattern:W0(s.matches),errorInfo:_})}:void 0;return h.reduceRight((M,_,j)=>{let Z,V=!1,G=null,H=null;s&&(Z=d&&_.route.id?d[_.route.id]:void 0,G=_.route.errorElement||og,S&&(z<0&&j===0?(Gm("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),V=!0,H=null):z===j&&(V=!0,H=_.route.hydrateFallbackElement||null)));let J=o.concat(h.slice(0,j+1)),et=()=>{let W;return Z?W=G:V?W=H:_.route.Component?W=O.createElement(_.route.Component,null):_.route.element?W=_.route.element:W=M,O.createElement(hg,{match:_,routeContext:{outlet:M,matches:J,isDataRoute:s!=null},children:W})};return s&&(_.route.ErrorBoundary||_.route.errorElement||j===0)?O.createElement(Lm,{location:s.location,revalidation:s.revalidation,component:G,error:Z,children:et(),routeContext:{outlet:null,matches:J,isDataRoute:!0},onError:g}):et()},null)}function Ff(c){return`${c} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function dg(c){let o=O.useContext(Ya);return Gt(o,Ff(c)),o}function yg(c){let o=O.useContext(mi);return Gt(o,Ff(c)),o}function gg(c){let o=O.useContext(il);return Gt(o,Ff(c)),o}function If(c){let o=gg(c),r=o.matches[o.matches.length-1];return Gt(r.route.id,`${c} can only be used on routes that contain a unique "id"`),r.route.id}function vg(){return If("useRouteId")}function pg(){let c=O.useContext($f),o=yg("useRouteError"),r=If("useRouteError");return c!==void 0?c:o.errors?.[r]}function bg(){let{router:c}=dg("useNavigate"),o=If("useNavigate"),r=O.useRef(!1);return Ym(()=>{r.current=!0}),O.useCallback(async(h,d={})=>{Ge(r.current,Bm),r.current&&(typeof h=="number"?await c.navigate(h):await c.navigate(h,{fromRouteId:o,...d}))},[c,o])}var bm={};function Gm(c,o,r){!o&&!bm[c]&&(bm[c]=!0,Ge(!1,r))}O.memo(Sg);function Sg({routes:c,manifest:o,future:r,state:s,isStatic:h,onError:d}){return fg(c,void 0,{manifest:o,state:s,isStatic:h,onError:d})}function Eg({basename:c="/",children:o=null,location:r,navigationType:s="POP",navigator:h,static:d=!1,useTransitions:S}){Gt(!Ln(),"You cannot render a inside another . You should never have more than one in your app.");let z=c.replace(/^\/*/,"/"),p=O.useMemo(()=>({basename:z,navigator:h,static:d,useTransitions:S,future:{}}),[z,h,d,S]);typeof r=="string"&&(r=Yn(r));let{pathname:g="/",search:M="",hash:_="",state:j=null,key:Z="default",mask:V}=r,G=O.useMemo(()=>{let H=ul(g,z);return H==null?null:{location:{pathname:H,search:M,hash:_,state:j,key:Z,mask:V},navigationType:s}},[z,g,M,_,j,Z,s,V]);return Ge(G!=null,` is not able to match the URL "${g}${M}${_}" because it does not start with the basename, so the won't render anything.`),G==null?null:O.createElement(Me.Provider,{value:p},O.createElement(di.Provider,{children:o,value:G}))}var si="get",oi="application/x-www-form-urlencoded";function yi(c){return typeof HTMLElement<"u"&&c instanceof HTMLElement}function Ag(c){return yi(c)&&c.tagName.toLowerCase()==="button"}function Tg(c){return yi(c)&&c.tagName.toLowerCase()==="form"}function zg(c){return yi(c)&&c.tagName.toLowerCase()==="input"}function Rg(c){return!!(c.metaKey||c.altKey||c.ctrlKey||c.shiftKey)}function _g(c,o){return c.button===0&&(!o||o==="_self")&&!Rg(c)}var ui=null;function xg(){if(ui===null)try{new FormData(document.createElement("form"),0),ui=!1}catch{ui=!0}return ui}var Og=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Vf(c){return c!=null&&!Og.has(c)?(Ge(!1,`"${c}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${oi}"`),null):c}function Mg(c,o){let r,s,h,d,S;if(Tg(c)){let z=c.getAttribute("action");s=z?ul(z,o):null,r=c.getAttribute("method")||si,h=Vf(c.getAttribute("enctype"))||oi,d=new FormData(c)}else if(Ag(c)||zg(c)&&(c.type==="submit"||c.type==="image")){let z=c.form;if(z==null)throw new Error('Cannot submit a