{
  "version": 3,
  "sources": ["daily-story.jsx"],
  "sourcesContent": ["/* Geschichte des Tages. Spec: 06_Planung/specs/2026-10-24-stickiness-screening.md §8–11.\n *\n * Einstiege (nie ein Pop-up, E77):\n *   dailyBalloonSync  – goldener Tagesballon neben der eigenen Figur (DOM-Marker auf der Karte)\n *   DailyStoryCard    – Karte unten, nur wenn kein Fakt in Reichweite ist (steuert screen-map.jsx)\n *   DailyTodayRow     – Zeile „Heute“ oben im Reisebuch\n * DailyStorySheet     – Vollbild: Ratefrage → Stempel → kurze Geschichte → Woche + Statistik,\n *                       danach „Nächste Geschichte“ (Feed quer durch alle Städte, E117).\n *\n * Keine Coins (E61 gilt wieder, Testrunde 24.10.). Wer den Fakt später vor Ort sammelt, sieht „kennst du schon“.\n * Testen: ?daily=1 zeigt Ballon und Karte immer, ?daily=open öffnet direkt die Geschichte.\n */\n\nconst DAILY_KEY_ANSWERS  = 'fact_daily_answers';\nconst DAILY_KEY_HIDDEN   = 'fact_daily_hidden';\nconst DAILY_KEY_WISH     = 'fact_trip_wishlist';\nconst DAILY_KEY_SESSIONS = 'fact_daily_sessions';\nconst DAILY_KEY_BALLOON  = 'fact_daily_balloon';\nconst DAILY_KEY_INTRO    = 'fact_daily_intro_seen';\nconst DAILY_KEY_BUBBLE   = 'fact_daily_bubble_day';\nconst DAILY_KEY_BONUS    = 'fact_daily_bonus_paid';\nconst DAILY_DAY_START_H  = 4;   // neue Geschichte ab 4 Uhr Ortszeit (E77)\nconst DAILY_ANCHOR_MOVE_M = 250; // Ballon bleibt an seinem Punkt, bis man sich so weit entfernt hat (E118)\n// Ziel für geteilte Bilder und Links. TODO vor Launch: auf die FACT-Webseite umstellen (Memory: PWA ist Prototyp).\nconst DAILY_SHARE_HOST = 'fact-cityguide.netlify.app';\n\nfunction dailyRead(key, fallback) {\n  try { const v = localStorage.getItem(key); return v ? JSON.parse(v) : fallback; } catch (e) { return fallback; }\n}\nfunction dailyWrite(key, val) {\n  try { localStorage.setItem(key, JSON.stringify(val)); } catch (e) {}\n}\nfunction dailyDayNo(ts) {\n  const d = ts ? new Date(ts) : new Date();\n  return Math.floor((d.getTime() - d.getTimezoneOffset() * 60000 - DAILY_DAY_START_H * 3600000) / 86400000);\n}\n// Tag 0 (1.1.1970) war ein Donnerstag: 0 = Montag … 6 = Sonntag\nfunction dailyWeekday(day) { return ((day + 3) % 7 + 7) % 7; }\nfunction dailyParam() {\n  try { return new URLSearchParams(location.search).get('daily'); } catch (e) { return null; }\n}\n\n// App-Starts zählen (einmal pro Laden der Seite), für „erst ab dem zweiten Start“ (E96)\n(function () {\n  try { dailyWrite(DAILY_KEY_SESSIONS, (dailyRead(DAILY_KEY_SESSIONS, 0) || 0) + 1); } catch (e) {}\n})();\n\n/* Heute + die letzten sechs Tage, rotierend über den Bestand. */\nwindow.dailyStoryLineup = function dailyStoryLineup() {\n  const all = window.DAILY_STORIES || [];\n  if (!all.length) return { today: null, past: [] };\n  const n = all.length, d = dailyDayNo();\n  const answers = dailyRead(DAILY_KEY_ANSWERS, {});\n  // Mit Tagesplan aus der Pipeline (date gesetzt): Geschichte des Datums, sonst Reserve-Rotation.\n  const iso = (day) => new Date(day * 86400000).toISOString().slice(0, 10);\n  if (all.some(s => s.date)) {\n    const byDate = (day) => all.find(s => s.date === iso(day));\n    const reserve = all.filter(s => !s.date);\n    const pool = reserve.length ? reserve : all;\n    // Schon vorher im Feed gelesen? Dann eine ungelesene, damit der Ballon morgens nicht gleich abgehakt ist.\n    const planned = byDate(d);\n    const fresh = (s) => !answers[s.id] || answers[s.id].day === d;\n    const today = (planned && fresh(planned) ? planned : null)\n      || pool.find(fresh) || all.find(s => fresh(s) && (!s.date || s.date > iso(d)))\n      || planned || pool[((d % pool.length) + pool.length) % pool.length];\n    const past = [];\n    for (let k = 1; k < 7; k++) { const s = byDate(d - k); if (s && s !== today) past.push(s); }\n    return { today, past };\n  }\n  // Ohne Plan (Mockup): Rotation. Ist die Geschichte des Tages schon an einem früheren Tag gelesen,\n  // kommt die nächste ungelesene (Audit: sonst war ab Tag 8 alles erledigt).\n  let off = 0;\n  while (off < n) { const s = all[(((d + off) % n) + n) % n]; const a = answers[s.id]; if (!a || a.day === d) break; off++; }\n  const today = all[(((d + off) % n) + n) % n];\n  const past = [];\n  for (let k = 1; k < Math.min(7, n); k++) { const s = all[(((d + off - k) % n) + n) % n]; if (s !== today) past.push(s); }\n  return { today, past };\n};\n\nwindow.dailyStoryForced = () => { const p = dailyParam(); return p === '1' || p === 'open'; };\nwindow.dailyStoryHiddenToday = () => !window.dailyStoryForced() && dailyRead(DAILY_KEY_HIDDEN, null) === dailyDayNo();\nwindow.dailyStoryHideToday = () => dailyWrite(DAILY_KEY_HIDDEN, dailyDayNo());\nwindow.dailyStoryAnswered = (id) => !!dailyRead(DAILY_KEY_ANSWERS, {})[id];\n\n/* Schalter im Profil (E99) und wer den Ballon überhaupt sieht (E96). */\nwindow.dailyBalloonEnabled = () => dailyRead(DAILY_KEY_BALLOON, true) !== false;\nwindow.setDailyBalloonEnabled = (v) => { dailyWrite(DAILY_KEY_BALLOON, !!v); try { window.dispatchEvent(new CustomEvent('fact-daily-changed')); } catch (e) {} };\nwindow.dailyBalloonEligible = (collectedCount) => {\n  if (window.dailyStoryForced()) return true;\n  if (!window.dailyBalloonEnabled()) return false;\n  try { if (localStorage.getItem('fact_tour_shown') !== 'true' && (dailyRead(DAILY_KEY_SESSIONS, 0) || 0) < 3) return false; } catch (e) {}\n  return (dailyRead(DAILY_KEY_SESSIONS, 0) || 0) >= 2 || (collectedCount || 0) > 0;\n};\n\n/* Reiseliste: Städte, die man sich für später merkt (auch vom Stadt-Intro genutzt). */\nwindow.factTripWish = {\n  list: () => dailyRead(DAILY_KEY_WISH, []),\n  has:  (city) => dailyRead(DAILY_KEY_WISH, []).includes(city),\n  toggle: (city) => {\n    const l = dailyRead(DAILY_KEY_WISH, []);\n    const next = l.includes(city) ? l.filter(c => c !== city) : l.concat(city);\n    dailyWrite(DAILY_KEY_WISH, next);\n    return next.includes(city);\n  },\n};\n\nfunction dailyPick(field, lang) {\n  if (!field) return '';\n  return field[lang] || field.de || '';\n}\nfunction dailyCityName(city, lang) {\n  const w = ((window.CITY_INTROS || {})[city] || {}).cards;\n  const c = w && w[0];\n  if (!c) return city;\n  return (lang === 'en' ? (c.titleEn || c.title) : c.title) || city;\n}\nconst DAILY_MYSTERY_GRAD = ['#3B2A1E', '#8A6A4A'];\nfunction dailyCityVisual(city) {\n  const w = ((window.CITY_INTROS || {})[city] || {}).cards;\n  const c = w && w[0];\n  const grad = c && c.gradient && c.gradient.length === 2 ? c.gradient : ['#5C4A30', '#A08860'];\n  return { img: c && c.image && c.image.url, grad };\n}\nfunction dailyBg(v) {\n  const g = `linear-gradient(140deg, ${v.grad[0]}, ${v.grad[1]})`;\n  return v.img ? `url(${v.img}) center/cover, ${g}` : g;\n}\nfunction dailyFmtNum(n, lang) {\n  try { return Number(n).toLocaleString(lang === 'en' ? 'en-GB' : 'de-DE'); } catch (e) { return String(n); }\n}\n// Bei „Welche Stadt?“ bleibt die Stadt bis zur Antwort verborgen (E88).\nfunction dailyHidesCity(story, answered) { return story && story.format === 'city' && !answered; }\n\n/* Der echte Fakt hinter der Geschichte (E76). */\nfunction dailyFactFor(story) {\n  if (!story || (!story.factNr && !story.factId)) return null;\n  return (window.FACTS || []).find(f => (story.factId && String(f.id) === String(story.factId)) || String(f.nr) === String(story.factNr)) || null;\n}\n\n/* Gelesene Geschichten gehören zum Konto (E127, Tabelle daily_answers). Lokal ist die sofortige Wahrheit,\n   app.jsx speichert jede neue Antwort zusätzlich auf dem Server (Event fact-daily-answered). */\nfunction dailyAnnounce(id, rec) {\n  try {\n    window.dispatchEvent(new CustomEvent('fact-daily-answered', { detail: { id, rec } }));\n    window.dispatchEvent(new CustomEvent('fact-daily-changed'));\n  } catch (e) {}\n}\n/* Beim Anmelden: Server-Liste mit dem Gerät zusammenführen. Gibt die Einträge zurück, die nur auf dem Gerät\n   liegen (Gastzeit), damit app.jsx sie hochlädt. */\nwindow.dailyMergeAnswers = function dailyMergeAnswers(rows) {\n  const local = dailyRead(DAILY_KEY_ANSWERS, {});\n  const onServer = new Set();\n  (rows || []).forEach(r => {\n    onServer.add(r.story_id);\n    if (local[r.story_id]) return;\n    const ch = r.choice == null ? null : (/^-?\\d+(\\.\\d+)?$/.test(r.choice) ? Number(r.choice) : r.choice);\n    local[r.story_id] = { choice: ch, correct: r.correct, read: !!r.read_only, day: r.day, at: Date.parse(r.answered_at) || Date.now() };\n  });\n  dailyWrite(DAILY_KEY_ANSWERS, local);\n  try { window.dispatchEvent(new CustomEvent('fact-daily-changed')); } catch (e) {}\n  return Object.entries(local).filter(([id]) => !onServer.has(id));\n};\n\n/* Feed (E117): alle ungelesenen Geschichten außer der von heute. Die stärksten (REIZ) zuerst,\n   innerhalb gleicher Stärke pro Tag gemischt, und nie zweimal dieselbe Stadt hintereinander. */\nfunction dailyFeedOrder(answers, todayId, lastCity) {\n  const day = dailyDayNo();\n  const mix = (id) => { let h = day; for (let i = 0; i < id.length; i++) h = (h * 31 + id.charCodeAt(i)) >>> 0; return h; };\n  const pool = (window.DAILY_STORIES || []).filter(s => s.id !== todayId && !answers[s.id])\n    .sort((a, b) => (b.appeal || 3) - (a.appeal || 3) || mix(a.id) - mix(b.id));\n  const out = [];\n  let last = lastCity;\n  while (pool.length) {\n    let i = pool.findIndex(s => s.city !== last);\n    if (i < 0) i = 0;\n    const s = pool.splice(i, 1)[0];\n    out.push(s); last = s.city;\n  }\n  return out;\n}\n\n/* „Kennst du schon“: wer die Tagesgeschichte geraten hat und den Fakt später vor Ort sammelt.\n   Gibt true genau einmal pro Fakt zurück, app.jsx zeigt dann einen Hinweis. */\nwindow.dailyKnownFactBonus = function dailyKnownFactBonus(fact) {\n  if (!fact) return false;\n  const answers = dailyRead(DAILY_KEY_ANSWERS, {});\n  const story = (window.DAILY_STORIES || []).find(s =>\n    ((s.factId && String(s.factId) === String(fact.id)) || (s.factNr && String(s.factNr) === String(fact.nr)))\n    && answers[s.id] && answers[s.id].correct !== null);\n  if (!story) return false;\n  const paid = dailyRead(DAILY_KEY_BONUS, []);\n  if (paid.includes(story.id)) return false;\n  dailyWrite(DAILY_KEY_BONUS, paid.concat(story.id));\n  return true;\n};\n\n/* Woche (Mo–So) und Statistik aus den gespeicherten Antworten (E70). */\nfunction dailyStats(answers) {\n  const list = Object.values(answers || {});\n  const days = new Set(list.map(a => a.day).filter(d => d != null));\n  const today = dailyDayNo();\n  const monday = today - dailyWeekday(today);\n  const week = [0, 1, 2, 3, 4, 5, 6].map(i => days.has(monday + i));\n  const guessed = list.filter(a => a.correct !== null);\n  const right = guessed.filter(a => a.correct === true).length;\n  return {\n    week, todayIdx: dailyWeekday(today),\n    played: list.length,\n    rate: guessed.length ? Math.round(right / guessed.length * 100) : null,\n    cities: new Set(Object.keys(answers || {}).map(id => ((window.DAILY_STORIES || []).find(s => s.id === id) || {}).city).filter(Boolean)).size,\n  };\n}\n\n/* ── Teilbild 1080×1350 ─────────────────────────────────────────────────\n   Ohne Stadtfoto: fremde Bilder würden das Canvas sperren (CORS). */\nfunction dailyWrap(ctx, text, maxW) {\n  const words = String(text).split(/\\s+/), lines = [];\n  let cur = '';\n  words.forEach(w => {\n    const test = cur ? cur + ' ' + w : w;\n    if (ctx.measureText(test).width > maxW && cur) { lines.push(cur); cur = w; } else cur = test;\n  });\n  if (cur) lines.push(cur);\n  return lines;\n}\nasync function dailyShareImage({ story, lang, cityName, line, url }) {\n  try { if (document.fonts && document.fonts.ready) await document.fonts.ready; } catch (e) {}\n  const W = 1080, H = 1350, P = 96;\n  const cv = document.createElement('canvas'); cv.width = W; cv.height = H;\n  const ctx = cv.getContext('2d');\n  const grad = story.format === 'city' ? DAILY_MYSTERY_GRAD : dailyCityVisual(story.city).grad;\n  const g = ctx.createLinearGradient(0, 0, W, H);\n  g.addColorStop(0, grad[0]); g.addColorStop(1, grad[1]);\n  ctx.fillStyle = g; ctx.fillRect(0, 0, W, H);\n  ctx.fillStyle = 'rgba(14,11,9,0.38)'; ctx.fillRect(0, 0, W, H);\n  ctx.fillStyle = '#E8380D';\n  ctx.beginPath(); if (ctx.roundRect) ctx.roundRect(P, P, 92, 92, 22); else ctx.rect(P, P, 92, 92); ctx.fill();\n  ctx.fillStyle = '#fff'; ctx.font = '900 64px Nunito, sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n  ctx.fillText('!', P + 46, P + 50);\n  ctx.textAlign = 'left'; ctx.font = '900 56px Nunito, sans-serif'; ctx.fillText('FACT', P + 116, P + 50);\n  ctx.textBaseline = 'alphabetic';\n  ctx.font = '600 30px \"JetBrains Mono\", monospace'; ctx.fillStyle = 'rgba(255,255,255,0.85)';\n  ctx.fillText(t('daily.kicker', lang).toUpperCase(), P, 360);\n  ctx.font = '900 92px Nunito, sans-serif'; ctx.fillStyle = '#fff';\n  ctx.fillText(cityName, P, 460);\n  ctx.font = '800 54px Nunito, sans-serif';\n  const qs = dailyWrap(ctx, dailyPick(story.question, lang), W - 2 * P).slice(0, 7);\n  qs.forEach((l, i) => ctx.fillText(l, P, 600 + i * 70));\n  ctx.fillStyle = '#F5C518'; ctx.font = '900 46px Nunito, sans-serif';\n  dailyWrap(ctx, line, W - 2 * P).slice(0, 2).forEach((l, i) => ctx.fillText(l, P, H - 230 + i * 58));\n  ctx.fillStyle = 'rgba(255,255,255,0.8)'; ctx.font = '500 30px \"JetBrains Mono\", monospace';\n  ctx.fillText(url, P, H - P);\n  return await new Promise(r => cv.toBlob(r, 'image/png'));\n}\n\n/* ── Tagesballon neben der Figur (E77, E97) ─────────────────────────────\n   Eigener DOM-Marker auf der MapLibre-Karte. screen-map.jsx ruft dailyBalloonSync bei jeder\n   Änderung von Position oder Sichtbarkeit. Ohne GPS steht er in der Kartenmitte. */\nlet dailyBalloonState = { marker: null, el: null, bubbleTimer: null, onOpen: null, placedNoGps: false, popped: false };\n// Aufploppen: beim ersten Sichtbarwerden und jedes Mal, wenn die App wieder nach vorne kommt (Handy rausgezogen)\nfunction dailyBalloonPop() {\n  const el = dailyBalloonState.el;\n  if (!el || el.style.display === 'none') return;\n  const p = el.querySelector('.db-pop');\n  p.classList.remove('db-popping'); void p.offsetWidth; p.classList.add('db-popping');\n}\n/* Wann der Ballon da ist (E131): nur beim Zurückkommen nach einer Pause (3 Stunden oder neuer Tag),\n   nicht dauerhaft auf Tour. Wer losläuft und sich gut 150 m entfernt, ist unterwegs: dann verschwindet er\n   bis zur nächsten Pause. Die Geschichten bleiben jederzeit über das Reisebuch erreichbar. */\nconst DAILY_KEY_LASTSEEN = 'fact_daily_last_active';\nconst DAILY_BREAK_MS = 3 * 3600 * 1000;\nconst DAILY_WALKAWAY_M = 150;\nlet dailyMoment = null;   // { start, from: {lat,lng} | null }\nfunction dailyCheckReturn() {\n  const last = dailyRead(DAILY_KEY_LASTSEEN, 0), now = Date.now();\n  if (!last || now - last > DAILY_BREAK_MS || dailyDayNo(last) !== dailyDayNo(now)) dailyMoment = { start: now, from: null };\n  dailyWrite(DAILY_KEY_LASTSEEN, now);\n}\ndailyCheckReturn();\ndocument.addEventListener('visibilitychange', () => {\n  if (document.visibilityState === 'visible') { dailyCheckReturn(); setTimeout(dailyBalloonPop, 350); }\n  else dailyWrite(DAILY_KEY_LASTSEEN, Date.now());\n});\nfunction dailyBalloonBuild() {\n  const el = document.createElement('button');\n  el.type = 'button';\n  el.className = 'daily-balloon';\n  // Testrunde 24.10.: ein Pulsring, „HEUTE“-Schild und alle paar Sekunden ein Münzdreher, sonst erkennt man ihn nicht als antippbar\n  el.innerHTML = '<span class=\"db-bubble\" aria-hidden=\"true\"></span><span class=\"db-pop\"><span class=\"db-float\"><span class=\"db-ring\"></span><span class=\"db-head\">!</span><span class=\"db-stem\"></span><span class=\"db-tag\" aria-hidden=\"true\"></span></span></span>';\n  el.addEventListener('click', (ev) => { ev.stopPropagation(); dailyBalloonState.onOpen && dailyBalloonState.onOpen(); });\n  return el;\n}\nfunction dailyBalloonBubble(text, ms) {\n  const el = dailyBalloonState.el;\n  if (!el) return;\n  const b = el.querySelector('.db-bubble');\n  b.textContent = text;\n  el.classList.add('db-talk');\n  clearTimeout(dailyBalloonState.bubbleTimer);\n  dailyBalloonState.bubbleTimer = setTimeout(() => el.classList.remove('db-talk'), ms);\n}\nwindow.dailyBalloonSync = function dailyBalloonSync({ map, pos, visible, lang, onOpen }) {\n  const st = dailyBalloonState;\n  st.onOpen = onOpen;\n  const ML = window.maplibregl || window.mapboxgl;\n  if (!map || !ML) return;\n  const { today } = window.dailyStoryLineup();\n  if (!today) return;\n  // Karte neu gebaut (Remount von MapScreen): alten Marker abhängen, auf der neuen Karte neu setzen\n  if (st.marker && st.map !== map) { try { st.marker.remove(); } catch (e) {} st.marker = null; st.popped = false; }\n  st.map = map;\n  if (!st.marker) {\n    st.el = dailyBalloonBuild();\n    st.marker = new ML.Marker({ element: st.el, anchor: 'bottom' });\n    const c = pos ? [pos.lng, pos.lat] : (() => { const m = map.getCenter(); return [m.lng, m.lat]; })();\n    st.marker.setLngLat(c).addTo(map);\n    st.placedNoGps = !pos;\n    st.anchor = null;\n  }\n  // Fest in der Umgebung verankert (E118): ein Punkt rund 25 m neben dir, der beim Drehen der Karte und bei\n  // kleinen Schritten stehen bleibt. Erst wer sich weit entfernt, findet ihn an der neuen Stelle wieder.\n  if (pos) {\n    const far = !st.anchor || Math.hypot((pos.lat - st.anchor.from.lat) * 111320, (pos.lng - st.anchor.from.lng) * 111320 * Math.cos(pos.lat * Math.PI / 180)) > DAILY_ANCHOR_MOVE_M;\n    if (far) {\n      const at = { lat: pos.lat + 18 / 111320, lng: pos.lng + 18 / (111320 * Math.cos(pos.lat * Math.PI / 180)) };\n      st.anchor = { from: { lat: pos.lat, lng: pos.lng }, at };\n      st.marker.setLngLat([at.lng, at.lat]);\n    }\n    st.placedNoGps = false;\n  } else if (st.placedNoGps) { const c = map.getCenter(); st.marker.setLngLat([c.lng, c.lat]); }\n  // Tagesgeschichte gelesen, aber noch Geschichten im Feed: Ballon bleibt golden und dreht sich, Schild „MEHR“.\n  // Der kleine Haken kommt erst, wenn wirklich alles gelesen ist (Testrunde 24.10.: sonst übersieht man ihn).\n  const answers = dailyRead(DAILY_KEY_ANSWERS, {});\n  const done = !!answers[today.id];\n  const allRead = done && !(window.DAILY_STORIES || []).some(s => !answers[s.id]);\n  st.el.classList.toggle('db-done', allRead);\n  st.el.querySelector('.db-tag').textContent = t(done ? 'daily.balloon.more' : 'daily.today', lang);\n  const wasHidden = st.el.style.display === 'none' || !st.popped;\n  // Pause-Moment: Startpunkt merken, beim Weglaufen beenden; währenddessen gilt die App als „aktiv“\n  dailyWrite(DAILY_KEY_LASTSEEN, Date.now());\n  if (dailyMoment && pos) {\n    if (!dailyMoment.from) dailyMoment.from = { lat: pos.lat, lng: pos.lng };\n    else if (Math.hypot((pos.lat - dailyMoment.from.lat) * 111320, (pos.lng - dailyMoment.from.lng) * 111320 * Math.cos(pos.lat * Math.PI / 180)) > DAILY_WALKAWAY_M) dailyMoment = null;\n  }\n  visible = visible && (!!dailyMoment || window.dailyStoryForced());\n  st.el.style.display = visible ? '' : 'none';\n  if (visible && wasHidden) { st.popped = true; if (!allRead) setTimeout(dailyBalloonPop, 500); }\n  st.el.setAttribute('aria-label', t(allRead ? 'daily.balloon.ariaDone' : done ? 'daily.balloon.ariaMore' : 'daily.balloon.aria', lang));\n  if (!visible || done) return;\n  // Einmalige Erklärung beim allerersten Mal, danach einmal am Tag „Heute: Stadt“ (E77, E96)\n  const day = dailyDayNo();\n  if (!dailyRead(DAILY_KEY_INTRO, false)) {\n    dailyWrite(DAILY_KEY_INTRO, true);\n    dailyWrite(DAILY_KEY_BUBBLE, day);\n    setTimeout(() => dailyBalloonBubble(t('daily.balloon.intro', lang), 6500), 1200);\n  } else if (dailyRead(DAILY_KEY_BUBBLE, null) !== day) {\n    dailyWrite(DAILY_KEY_BUBBLE, day);\n    const name = today.format === 'city' ? t('daily.mystery', lang) : dailyCityName(today.city, lang);\n    setTimeout(() => dailyBalloonBubble(t('daily.balloon.today', lang).replace('{city}', name), 3500), 1200);\n  }\n};\n\n/* ── Karte unten auf der Map ───────────────────────────────────────────── */\nwindow.DailyStoryCard = function DailyStoryCard({ lang, dark, onOpen, onHide }) {\n  const { today } = window.dailyStoryLineup();\n  if (!today) return null;\n  const answered = window.dailyStoryAnswered(today.id);\n  const hide = dailyHidesCity(today, answered);\n  const v = hide ? { img: null, grad: DAILY_MYSTERY_GRAD } : dailyCityVisual(today.city);\n  const kicker = hide ? t('daily.card.kickerCity', lang) : t('daily.card.kicker', lang).replace('{city}', dailyCityName(today.city, lang));\n  const ink = dark ? '#F5F0E8' : '#1A1208';\n  const ink3 = dark ? '#B0A898' : '#5C4A30';\n\n  return (\n    <div className=\"daily-card-in\" style={{\n      position: 'absolute', bottom: 'calc(max(24px, env(safe-area-inset-bottom, 0px)) + 70px)', left: 10, right: 10, zIndex: 40,\n    }}>\n      <div style={{\n        display: 'flex', alignItems: 'stretch', borderRadius: 20, overflow: 'hidden',\n        background: dark ? 'rgba(28,24,20,0.94)' : 'rgba(255,253,249,0.97)',\n        boxShadow: '0 10px 28px rgba(20,12,6,0.22), 0 1px 3px rgba(20,12,6,0.12)',\n        backdropFilter: 'blur(10px)', WebkitBackdropFilter: 'blur(10px)',\n      }}>\n        <button type=\"button\" onClick={onOpen} style={{\n          flex: 1, minWidth: 0, display: 'flex', alignItems: 'center', gap: 12, padding: 10,\n          background: 'transparent', border: 'none', textAlign: 'left', cursor: 'pointer', color: ink,\n        }}>\n          <span aria-hidden=\"true\" style={{\n            flex: '0 0 auto', width: 58, height: 58, borderRadius: 14, background: dailyBg(v),\n            boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.06)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n            color: '#F5C518', fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 28,\n          }}>{hide ? '?' : ''}</span>\n          <span style={{ minWidth: 0, display: 'flex', flexDirection: 'column', gap: 3 }}>\n            <span style={{\n              fontFamily: 'JetBrains Mono, ui-monospace, monospace', fontWeight: 600, fontSize: 11,\n              letterSpacing: '0.08em', textTransform: 'uppercase', color: '#E8380D',\n            }}>{kicker}</span>\n            <span style={{\n              fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 16, lineHeight: 1.2,\n              display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden',\n            }}>{answered ? dailyPick(today.title, lang) : dailyPick(today.teaser, lang)}</span>\n            {answered && (\n              <span style={{ fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 12.5, color: ink3 }}>\n                {t('daily.card.done', lang)}\n              </span>\n            )}\n          </span>\n        </button>\n        <button type=\"button\" onClick={onHide} aria-label={t('daily.card.hide', lang)} style={{\n          flex: '0 0 auto', width: 44, border: 'none', background: 'transparent', cursor: 'pointer',\n          color: ink3, fontSize: 20, lineHeight: 1,\n        }}>×</button>\n      </div>\n    </div>\n  );\n};\n\n/* ── Zeile „Heute“ oben im Reisebuch (E77) ─────────────────────────────── */\n/* ── „Schon gelesen“ im Reisebuch pro Stadt (E130) ─────────────────────────\n   Bewusst schlicht und getrennt von den goldenen, vor Ort gesammelten Fakten: gelesen ist nicht gesammelt.\n   Antippen öffnet die Geschichte noch einmal zum Lesen (ohne Rätsel). */\nwindow.DailyReadList = function DailyReadList({ lang, city, onOpen }) {\n  const [open, setOpen] = React.useState(false);\n  const answers = dailyRead(DAILY_KEY_ANSWERS, {});\n  const list = (window.DAILY_STORIES || []).filter(s => s.city === city && answers[s.id])\n    .sort((a, b) => (answers[b.id].at || 0) - (answers[a.id].at || 0));\n  if (!list.length) return null;\n  const shown = open ? list : list.slice(0, 3);\n  return (\n    <div style={{ marginTop: 6, padding: '12px 14px', borderRadius: 14, background: 'rgba(255,255,255,0.08)', border: '1px solid rgba(255,255,255,0.14)', textAlign: 'left' }}>\n      <div style={{ fontFamily: 'JetBrains Mono, monospace', fontWeight: 600, fontSize: 11, letterSpacing: '0.08em', textTransform: 'uppercase', color: 'rgba(255,255,255,0.7)' }}>\n        {t('daily.readList.title', lang)} · {list.length}\n      </div>\n      <div style={{ fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 12.5, color: 'rgba(255,255,255,0.6)', marginTop: 2 }}>\n        {t('daily.readList.sub', lang)}\n      </div>\n      <div style={{ display: 'flex', flexDirection: 'column', marginTop: 6 }}>\n        {shown.map(s => (\n          <button key={s.id} type=\"button\" onClick={() => onOpen && onOpen(s.id)} style={{\n            display: 'flex', alignItems: 'center', gap: 10, minHeight: 44, padding: '6px 0', border: 'none',\n            borderTop: '1px solid rgba(255,255,255,0.10)', background: 'transparent', cursor: 'pointer', textAlign: 'left',\n            color: 'rgba(255,255,255,0.92)', fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14, lineHeight: 1.25,\n          }}>\n            <span style={{ flex: 1 }}>{dailyPick(s.title, lang)}</span>\n            <span aria-hidden=\"true\" style={{ opacity: 0.5 }}>›</span>\n          </button>\n        ))}\n      </div>\n      {list.length > 3 && (\n        <button type=\"button\" onClick={() => setOpen(!open)} style={{\n          marginTop: 4, minHeight: 40, padding: 0, border: 'none', background: 'transparent', cursor: 'pointer',\n          color: 'rgba(255,255,255,0.75)', fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 600, fontSize: 13.5,\n          textDecoration: 'underline', textUnderlineOffset: 3,\n        }}>{open ? t('daily.readList.less', lang) : t('daily.readList.all', lang).replace('{n}', list.length)}</button>\n      )}\n    </div>\n  );\n};\n\nwindow.DailyTodayRow = function DailyTodayRow({ lang, theme, onOpen }) {\n  const { today } = window.dailyStoryLineup();\n  if (!today) return null;\n  const dark = theme === 'dark';\n  const answered = window.dailyStoryAnswered(today.id);\n  const hide = dailyHidesCity(today, answered);\n  const v = hide ? { img: null, grad: DAILY_MYSTERY_GRAD } : dailyCityVisual(today.city);\n  return (\n    <div style={{ padding: '0 18px 18px' }}>\n      <button type=\"button\" onClick={onOpen} style={{\n        width: '100%', display: 'flex', alignItems: 'center', gap: 12, padding: 10, borderRadius: 18, cursor: 'pointer', textAlign: 'left',\n        background: dark ? '#1C1712' : '#FFF8EE', border: `1.5px solid ${dark ? 'rgba(245,197,24,0.35)' : 'rgba(184,140,10,0.30)'}`,\n        color: dark ? '#F5F0E8' : '#1A1208',\n      }}>\n        <span aria-hidden=\"true\" style={{\n          flex: '0 0 auto', width: 52, height: 52, borderRadius: 13, background: dailyBg(v), position: 'relative',\n          display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#F5C518', fontFamily: 'Nunito, sans-serif', fontWeight: 900, fontSize: 24,\n        }}>{hide ? '?' : ''}</span>\n        <span style={{ flex: 1, minWidth: 0 }}>\n          <span style={{ display: 'block', fontFamily: 'JetBrains Mono, monospace', fontWeight: 600, fontSize: 11, letterSpacing: '0.08em', textTransform: 'uppercase', color: '#B8860B' }}>\n            {t('daily.kicker', lang)}{answered ? ' ✓' : ''}\n          </span>\n          <span style={{ display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden', marginTop: 2, fontFamily: 'Nunito, sans-serif', fontWeight: 800, fontSize: 15, lineHeight: 1.25 }}>\n            {answered ? dailyPick(today.title, lang) : dailyPick(today.teaser, lang)}\n          </span>\n        </span>\n        <span aria-hidden=\"true\" style={{ fontFamily: 'Nunito, sans-serif', fontWeight: 900, fontSize: 20, opacity: 0.5 }}>›</span>\n      </button>\n    </div>\n  );\n};\n\n/* ── Vollbild ──────────────────────────────────────────────────────────── */\n// Wo man zuletzt war (Testrunde: nach „Mehr über …“ oder erneutem Öffnen nicht wieder bei der Tagesgeschichte landen)\nlet dailyResume = (() => { try { return JSON.parse(sessionStorage.getItem('fact_daily_resume') || 'null'); } catch (e) { return null; } })();\n// Kurz weg (Handy gesperrt, Bahn kam): dieselbe Geschichte wieder. Länger weg: eine neue (E129).\nconst DAILY_RESUME_MS = 10 * 60 * 1000;\nfunction dailySaveResume(r) {\n  dailyResume = r;\n  try { sessionStorage.setItem('fact_daily_resume', JSON.stringify(r)); } catch (e) {}\n}\n// Feed (E122): Kern sind die Fakten zum Lesen, nur jede vierte Karte ist ein Rätsel zum Auflockern\nconst DAILY_QUIZ_EVERY = 4;\n\nwindow.DailyStorySheet = function DailyStorySheet({ lang, dark, onClose, collectedFacts, startId }) {\n  const lineup = window.dailyStoryLineup();\n  const all0 = window.DAILY_STORIES || [];\n  // Start: ungelesene Tagesgeschichte, sonst direkt die nächste ungelesene aus dem Feed. Nie eine schon\n  // gelesene Geschichte noch einmal (Janek, Testrunde 24.10.). Gewählte Stadt und Rätsel-Takt laufen weiter.\n  const [start] = React.useState(() => {\n    const today = lineup.today;\n    // Aus dem Reisebuch („Schon gelesen“): genau diese Geschichte noch einmal lesen\n    if (startId && all0.some(s => s.id === startId)) return { id: startId, mode: 'reread', cityFilter: null, feedCount: 0 };\n    const r0 = dailyResume;\n    // Fortsetzen nur am selben Tag und nur, wenn die Tagesgeschichte schon dran war (Sackgassen-Test: sonst blieb sie liegen)\n    const todayOpen = today && !window.dailyStoryAnswered(today.id);\n    if (r0 && r0.at && Date.now() - r0.at < DAILY_RESUME_MS && r0.day === dailyDayNo() && all0.some(s => s.id === r0.id)\n      && (!todayOpen || r0.id === today.id)) return { ...r0 };\n    if (!today || !window.dailyStoryAnswered(today.id)) return { id: today && today.id, mode: 'today', cityFilter: null, feedCount: 0 };\n    const r = dailyResume && dailyResume.day === dailyDayNo() ? dailyResume : null;\n    const order = dailyFeedOrder(dailyRead(DAILY_KEY_ANSWERS, {}), today.id, r && (all0.find(s => s.id === r.id) || {}).city);\n    const inCity = r && r.cityFilter ? order.filter(s => s.city === r.cityFilter && s.format !== 'city') : [];\n    const pick = inCity[0] || order[0];\n    if (!pick) return { id: today.id, mode: 'empty', cityFilter: null, feedCount: 0 };   // alles gelesen: nur die Ende-Karte, nichts doppelt\n    return { id: pick.id, mode: inCity[0] ? 'city' : 'feed', cityFilter: inCity[0] ? r.cityFilter : null, feedCount: (r ? r.feedCount : 0) + 1 };\n  });\n  const [storyId, setStoryId] = React.useState(start.id);\n  const [mode, setMode] = React.useState(start.mode);   // today | feed | city | empty | reread (Kicker oben)\n  const [cityFilter, setCityFilter] = React.useState(start.cityFilter);\n  const [feedCount, setFeedCount] = React.useState(start.feedCount);\n  const readMode = mode !== 'today' && feedCount % DAILY_QUIZ_EVERY !== DAILY_QUIZ_EVERY - 1;\n  const [answers, setAnswers] = React.useState(() => dailyRead(DAILY_KEY_ANSWERS, {}));\n  const [guess, setGuess] = React.useState(null);\n  const [toast, setToast] = React.useState(null);\n  const [stampFor, setStampFor] = React.useState(null);   // Stempel nur direkt nach dem Antworten animieren\n  const [, setWishTick] = React.useState(0);\n  const scrollRef = React.useRef(null);\n  const resultRef = React.useRef(null);\n  const swipe = React.useRef(null);\n\n  const all = window.DAILY_STORIES || [];\n  const story = all.find(s => s.id === storyId) || lineup.today;\n  const res = story ? answers[story.id] : null;\n  const isToday = lineup.today && story && story.id === lineup.today.id;\n\n  const closeRef = React.useRef(null);\n  React.useEffect(() => {\n    try { closeRef.current && closeRef.current.focus({ preventScroll: true }); } catch (e) {}\n    const onKey = (e) => { if (e.key === 'Escape') onClose(); };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, []);\n  React.useEffect(() => {\n    if (!story) return;\n    // Kein Startwert: die Mitte der Skala lag beim Kolosseum genau auf der Lösung (Testrunde).\n    setGuess(null);\n    setStampFor(null);\n    if (scrollRef.current) scrollRef.current.scrollTop = 0;\n  }, [storyId]);\n  React.useEffect(() => {\n    if (!toast) return;\n    const id = setTimeout(() => setToast(null), 2400);\n    return () => clearTimeout(id);\n  }, [toast]);\n  React.useEffect(() => {\n    dailySaveResume({ id: storyId, mode, cityFilter, feedCount, day: dailyDayNo(), at: Date.now() });\n  }, [storyId, mode, cityFilter, feedCount]);\n  // Beim Schließen merken, wann man zuletzt drin war (zählt für die Zehn-Minuten-Regel)\n  React.useEffect(() => () => { if (dailyResume) dailySaveResume({ ...dailyResume, at: Date.now() }); }, []);\n  // Lese-Karte: zählt als gelesen, sobald sie offen ist (für Feed-Reihenfolge und Statistik)\n  React.useEffect(() => {\n    if (!story || !readMode || answers[story.id]) return;\n    const rec = { choice: 'read', correct: null, read: true, at: Date.now(), day: dailyDayNo() };\n    const next = { ...answers, [story.id]: rec };\n    setAnswers(next);\n    dailyWrite(DAILY_KEY_ANSWERS, next);\n    dailyAnnounce(story.id, rec);\n  }, [storyId, readMode]);\n\n  if (!story) return null;\n\n  const tok = dark ? {\n    bg: '#13100E', surface: '#1C1712', surface2: '#251F17', ink: '#F5F0E8', ink2: '#B0A898', ink3: '#8A8070', line: 'rgba(255,255,255,0.10)',\n  } : {\n    bg: '#FDF5E8', surface: '#FFF8EE', surface2: '#F5EDD8', ink: '#1A1208', ink2: '#5C4A30', ink3: '#8A7350', line: 'rgba(26,18,8,0.10)',\n  };\n  const GREEN = '#16A34A';\n  const answered = !!res;\n  const shown = answered || readMode;          // Geschichte sichtbar (aufgelöst oder Lese-Karte)\n  const hideCity = dailyHidesCity(story, shown);\n  const realVisual = dailyCityVisual(story.city);\n  const cityName = dailyCityName(story.city, lang);\n  const shownCity = hideCity ? t('daily.mystery', lang) : cityName;\n  const saved = window.factTripWish.has(story.city);\n  const fact = dailyFactFor(story);\n  const factCollected = fact && (collectedFacts || []).some(id => String(id) === String(fact.id));\n  const hasIntro = !!(window.CITY_INTROS || {})[story.city];          // ohne Intro kein „Mehr über …“ (Audit)\n  // Feed (Testrunde 24.10.): nach der Auflösung „Nächste Geschichte“, quer durch alle Städte\n  const feed = dailyFeedOrder(answers, lineup.today && lineup.today.id, story.city).filter(s => s.id !== story.id);\n  // Gewählte Stadt: „Welche Stadt?“-Fragen fallen raus (die Antwort stünde ja schon fest)\n  const inCity = (c) => feed.filter(s => s.city === c && s.format !== 'city');\n  const cityPool = cityFilter ? inCity(cityFilter) : [];\n  // Sicherheitsnetz: ist die Tagesgeschichte noch offen, kommt sie spätestens, wenn der Feed leer ist\n  const todayOpen = lineup.today && !answers[lineup.today.id] && lineup.today.id !== story.id ? lineup.today : null;\n  const nextStory = shown ? (cityPool[0] || feed[0] || todayOpen || null) : null;\n  const goNext = () => {\n    if (!nextStory) return;\n    if (cityFilter && !cityPool.length) setCityFilter(null);\n    setMode(nextStory === todayOpen ? 'today' : cityFilter && cityPool.length ? 'city' : 'feed');\n    setFeedCount(n => n + 1);\n    setStoryId(nextStory.id);\n  };\n  const pickCity = (c) => { const s = inCity(c)[0]; setCityFilter(c); if (s) { setMode('city'); setFeedCount(n => n + 1); setStoryId(s.id); } };\n  const cityChoices = Object.entries(feed.filter(s => s.format !== 'city').reduce((m, s) => { m[s.city] = (m[s.city] || 0) + 1; return m; }, {}))\n    .sort((x, y) => y[1] - x[1]);\n\n  const commit = (choice) => {\n    if (answers[story.id]) return;\n    let correct = false, near = false;\n    if (choice === 'skip') correct = null;\n    else if (story.format === 'estimate') {\n      const diff = Math.abs(choice - story.answer);\n      correct = diff <= story.near / 2;\n      near = !correct && diff <= story.near * 1.5;\n    } else correct = choice === story.answer;\n    // Keine Coins (Testrunde 24.10.: Coins fürs Falschraten sind Quatsch, E61 gilt wieder). Belohnung = Geschichte + Woche.\n    const rec = { choice, correct, near, at: Date.now(), day: dailyDayNo() };\n    const next = { ...answers, [story.id]: rec };\n    setAnswers(next);\n    dailyWrite(DAILY_KEY_ANSWERS, next);\n    setStampFor(story.id);\n    try { navigator.vibrate && navigator.vibrate(correct ? [18, 40, 18] : 30); } catch (e) {}\n    dailyAnnounce(story.id, rec);\n    // Nur so weit scrollen, dass die Überschrift der Geschichte sichtbar wird; die eigene\n    // Antwort bleibt oben noch im Blick (Testrunde: sonst springt die Frage aus dem Bild).\n    setTimeout(() => {\n      const sc = scrollRef.current, el = resultRef.current;\n      if (!sc || !el) return;\n      const target = el.offsetTop - sc.clientHeight * 0.38;\n      if (target > sc.scrollTop) { try { sc.scrollTo({ top: target, behavior: 'smooth' }); } catch (e) { sc.scrollTop = target; } }\n    }, 700);\n  };\n\n  // Teilen als Bild: Frage und eigenes Ergebnis, nie die Lösung (Wordle-Prinzip: „Du?“).\n  const share = async () => {\n    const url = DAILY_SHARE_HOST;\n    let line;\n    if (!res || res.correct === null) line = t('daily.img.open', lang);\n    else if (story.format === 'estimate') line = t('daily.img.estimate', lang).replace('{d}', dailyFmtNum(Math.abs(res.choice - story.answer), lang)).replace('{unit}', dailyPick(story.unit, lang));\n    else line = t(res.correct ? 'daily.img.right' : 'daily.img.wrong', lang);\n    const imgCity = story.format === 'city' ? t('daily.mystery', lang) : cityName;\n    let blob = null;\n    try { blob = await dailyShareImage({ story, lang, cityName: imgCity, line, url }); } catch (e) {}\n    const text = t('daily.shareText', lang).replace('{title}', dailyPick(story.teaser, lang)) + ' https://' + DAILY_SHARE_HOST;\n    try {\n      if (blob) {\n        const file = new File([blob], 'fact-' + story.id + '.png', { type: 'image/png' });\n        if (navigator.canShare && navigator.canShare({ files: [file] })) { await navigator.share({ files: [file], text }); return; }\n        const a = document.createElement('a');\n        a.href = URL.createObjectURL(blob); a.download = file.name; a.click();\n        setTimeout(() => URL.revokeObjectURL(a.href), 4000);\n        setToast(t('daily.img.saved', lang));\n        return;\n      }\n      if (navigator.share) { await navigator.share({ text }); return; }\n      await navigator.clipboard.writeText(text); setToast(t('daily.shared', lang));\n    } catch (e) {}\n  };\n  const toggleWish = () => {\n    const on = window.factTripWish.toggle(story.city);\n    setWishTick(x => x + 1);\n    setToast(t(on ? 'daily.wish.saved' : 'daily.wish.removed', lang).replace('{city}', cityName));\n  };\n  const openCity = (c) => {\n    onClose();\n    setTimeout(() => {\n      try { window.dispatchEvent(new CustomEvent('fact-open-city-intro', { detail: { city: c || story.city, source: 'daily' } })); } catch (e) {}\n    }, 120);\n  };\n  // Nach links wischen = nächste Geschichte (wie bei Tinder), nur nach der Auflösung und nicht im Archivstreifen/Regler\n  const onTouchStart = (e) => {\n    const tgt = e.target;\n    if (!shown || (tgt.closest && (tgt.closest('.daily-strip') || tgt.closest('input')))) { swipe.current = null; return; }\n    swipe.current = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n  };\n  const onTouchEnd = (e) => {\n    const s0 = swipe.current; swipe.current = null;\n    if (!s0) return;\n    const dx = e.changedTouches[0].clientX - s0.x, dy = e.changedTouches[0].clientY - s0.y;\n    if (dx < -70 && Math.abs(dy) < 60) goNext();\n  };\n\n  // Stempel (E78): RICHTIG / KNAPP DANEBEN / ERWISCHT / NICHT GANZ / GELESEN\n  const stamp = (() => {\n    if (!res || res.read || mode === 'empty' || mode === 'reread') return null;\n    if (res.correct === null) return { text: t('daily.stamp.read', lang), color: '#8A7350' };\n    if (res.correct) return { text: t('daily.stamp.right', lang), color: GREEN };\n    if (res.near) return { text: t('daily.stamp.near', lang), color: '#C98A00' };\n    if (story.format === 'odd') return { text: t('daily.stamp.caught', lang), color: '#E8380D' };\n    return { text: t('daily.stamp.wrong', lang), color: '#E8380D' };\n  })();\n  const fmtKey = 'daily.fmt.' + story.format;\n  const stats = answered ? dailyStats(answers) : null;\n  const weekLetters = t('daily.week.letters', lang).split(',');\n  const fineStep = (dir) => {\n    const base = guess == null ? Math.round((story.min + story.max) / 2 / story.step) * story.step + story.step * 3 : guess;\n    setGuess(Math.max(story.min, Math.min(story.max, base + dir * story.step)));\n  };\n\n  // Antwortknöpfe (alle Formate außer Schätzen)\n  const renderOptions = () => (\n    // key: beim Wechsel der Geschichte neu aufbauen, sonst blenden die Farben der alten Antwort sichtbar aus\n    <div key={story.id} style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 16 }}>\n      {story.options.map((o, i) => {\n        const isAns = i === story.answer;\n        const isMine = res && res.choice === i;\n        let border = tok.line, bg = tok.surface, badge = null;\n        if (answered) {\n          if (isAns) {\n            border = story.format === 'odd' ? '#E8380D' : GREEN;\n            bg = story.format === 'odd' ? 'rgba(232,56,13,0.08)' : 'rgba(22,163,74,0.10)';\n            badge = story.format === 'odd' ? t('daily.badge.fake', lang) : '✓';\n          } else if (isMine) {\n            border = tok.ink3;\n            badge = t('daily.badge.mine', lang);\n          }\n        }\n        return (\n          <button key={i} type=\"button\" disabled={answered} onClick={() => commit(i)} style={{\n            display: 'flex', alignItems: 'center', gap: 10, width: '100%', minHeight: 54, padding: '12px 14px',\n            textAlign: 'left', borderRadius: 14, cursor: answered ? 'default' : 'pointer',\n            background: bg, border: `1.5px solid ${border}`, color: tok.ink,\n            fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 600, fontSize: 15.5, lineHeight: 1.35,\n            boxShadow: answered ? 'none' : (dark ? 'none' : '0 2px 0 rgba(26,18,8,0.06)'),\n            opacity: answered && !isAns && !isMine ? 0.55 : 1,\n            transition: 'opacity .2s, border-color .2s, background .2s',\n          }}>\n            <span style={{ flex: 1 }}>{dailyPick(o, lang)}</span>\n            {badge && (\n              <span style={{\n                flex: '0 0 auto', fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 12,\n                letterSpacing: 0.4, color: isAns ? (story.format === 'odd' ? '#E8380D' : GREEN) : tok.ink3,\n              }}>{badge}</span>\n            )}\n          </button>\n        );\n      })}\n    </div>\n  );\n\n  const stepBtn = (dir, label) => (\n    <button type=\"button\" onClick={() => fineStep(dir)} aria-label={label} style={{\n      flex: '0 0 auto', width: 44, height: 44, borderRadius: 12, cursor: 'pointer',\n      background: tok.surface, border: `1.5px solid ${tok.line}`, color: tok.ink,\n      fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 22, lineHeight: 1,\n    }}>{dir < 0 ? '−' : '+'}</button>\n  );\n  const renderEstimate = () => {\n    const val = answered ? (res.choice === 'skip' ? null : res.choice) : guess;\n    const pct = (x) => ((x - story.min) / (story.max - story.min)) * 100;\n    return (\n      <div style={{ marginTop: 18 }}>\n        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 14 }}>\n          {!answered && stepBtn(-1, t('daily.estimate.less', lang))}\n          <div style={{ textAlign: 'center', minWidth: 150 }}>\n            <span style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 40, color: tok.ink, letterSpacing: '-0.01em' }}>\n              {val == null ? '?' : dailyFmtNum(val, lang)}\n            </span>\n            <span style={{ display: 'block', fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 14, color: tok.ink2, marginTop: -2 }}>{dailyPick(story.unit, lang)}</span>\n          </div>\n          {!answered && stepBtn(1, t('daily.estimate.more', lang))}\n        </div>\n        <div style={{ position: 'relative', marginTop: 10, padding: '0 4px' }}>\n          <input type=\"range\" min={story.min} max={story.max} step={story.step}\n            value={val == null ? story.min : val} disabled={answered}\n            onChange={(e) => setGuess(Number(e.target.value))}\n            aria-label={dailyPick(story.question, lang) + ' (' + dailyPick(story.unit, lang) + ')'}\n            className=\"daily-range\"\n            style={{ width: '100%', accentColor: '#E8380D', height: 32, opacity: answered ? 0.5 : (val == null ? 0.65 : 1) }} />\n          {answered && (\n            <div aria-hidden=\"true\" style={{\n              position: 'absolute', top: -6, bottom: -6, left: `calc(${pct(story.answer)}% )`, width: 3, marginLeft: -1.5,\n              background: GREEN, borderRadius: 2,\n            }} />\n          )}\n          <div style={{ display: 'flex', justifyContent: 'space-between', fontFamily: 'JetBrains Mono, monospace', fontSize: 11, color: tok.ink3 }}>\n            <span>{dailyFmtNum(story.min, lang)}</span><span>{dailyFmtNum(story.max, lang)}</span>\n          </div>\n        </div>\n        {!answered && guess == null && (\n          <div style={{ marginTop: 4, textAlign: 'center', fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 13, color: tok.ink3 }}>{t('daily.estimate.hint', lang)}</div>\n        )}\n        {!answered && (\n          <button type=\"button\" disabled={guess == null} onClick={() => commit(guess)} style={{\n            marginTop: 16, width: '100%', minHeight: 52, borderRadius: 14, border: 'none', cursor: guess == null ? 'not-allowed' : 'pointer',\n            background: '#E8380D', color: '#fff', boxShadow: guess == null ? 'none' : '0 3px 0 #A82508', opacity: guess == null ? 0.5 : 1,\n            fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 17,\n          }}>{t('daily.estimate.cta', lang)}</button>\n        )}\n      </div>\n    );\n  };\n\n  const resultLine = () => {\n    if (!res || res.read || readMode) return null;\n    let sub = null;\n    if (story.format === 'estimate') {\n      sub = res.choice === 'skip'\n        ? t('daily.res.answer', lang).replace('{a}', dailyPick(story.answerLabel, lang))\n        : t('daily.res.estimate', lang).replace('{you}', dailyFmtNum(res.choice, lang)).replace('{real}', dailyPick(story.answerLabel, lang));\n    } else if (story.format === 'odd') {\n      sub = res.correct ? null : t('daily.res.odd', lang).replace('{a}', dailyPick(story.options[story.answer], lang));\n    } else if (story.format === 'city') {\n      sub = res.correct ? null : t('daily.res.answer', lang).replace('{a}', cityName);\n    }\n    return sub ? <div style={{ fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 14, color: tok.ink2, marginBottom: 2 }}>{sub}</div> : null;\n  };\n\n  const sectionLabel = (txt, extra) => (\n    <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 11, letterSpacing: 1.5, textTransform: 'uppercase', color: tok.ink3, ...extra }}>{txt}</div>\n  );\n\n  return (\n    <div role=\"dialog\" aria-modal=\"true\" aria-label={t('daily.kicker', lang)} className=\"daily-sheet-in\"\n      onTouchStart={onTouchStart} onTouchEnd={onTouchEnd} style={{\n      position: 'absolute', inset: 0, zIndex: 9500, background: tok.bg, color: tok.ink,\n      display: 'flex', flexDirection: 'column',\n    }}>\n      <div ref={scrollRef} style={{ flex: 1, overflowY: 'auto', WebkitOverflowScrolling: 'touch', overscrollBehavior: 'contain' }}>\n        <div key={story.id} className={mode === 'feed' ? 'daily-next-in' : undefined}>\n        {/* Bild der Stadt (bei „Welche Stadt?“ erst nach der Antwort) */}\n        <div style={{ position: 'relative', height: 230, flex: '0 0 auto', background: dailyBg({ img: null, grad: DAILY_MYSTERY_GRAD }), overflow: 'hidden' }}>\n          <div aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, background: dailyBg(realVisual), opacity: hideCity ? 0 : 1, transition: 'opacity .6s ease' }} />\n          {hideCity && (\n            <div aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'rgba(245,197,24,0.9)', fontFamily: 'Nunito, sans-serif', fontWeight: 900, fontSize: 96 }}>?</div>\n          )}\n          <div aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, background: 'linear-gradient(180deg, rgba(14,11,9,0.35) 0%, rgba(14,11,9,0) 35%, rgba(14,11,9,0.72) 100%)' }} />\n          <button ref={closeRef} type=\"button\" onClick={onClose} aria-label={t('daily.close', lang)} style={{\n            position: 'absolute', top: 'calc(env(safe-area-inset-top, 0px) + 44px)', right: 12, width: 44, height: 44, borderRadius: '50%',\n            border: 'none', background: 'rgba(14,11,9,0.45)', color: '#fff', fontSize: 22, lineHeight: 1, cursor: 'pointer',\n            backdropFilter: 'blur(6px)', WebkitBackdropFilter: 'blur(6px)',\n          }}>×</button>\n          <div style={{ position: 'absolute', left: 20, right: 20, bottom: 16, color: '#fff' }}>\n            <div style={{ fontFamily: 'JetBrains Mono, ui-monospace, monospace', fontWeight: 600, fontSize: 11, letterSpacing: '0.1em', textTransform: 'uppercase', opacity: 0.9 }}>\n              {mode === 'reread' ? t('daily.readList.title', lang) : isToday && mode !== 'empty' ? t('daily.kicker', lang) : mode === 'city' ? t('daily.cities.kicker', lang) : t('daily.feed.kicker', lang)}\n            </div>\n            <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 30, lineHeight: 1.05, letterSpacing: '-0.01em', marginTop: 2 }}>\n              {shownCity}\n            </div>\n          </div>\n          {stamp && (\n            <div className={stampFor === story.id ? 'daily-stamp-in' : undefined} style={{\n              position: 'absolute', right: 18, bottom: 22, transform: 'rotate(-9deg)',\n              padding: '7px 12px 6px', borderRadius: 10, border: `3.5px solid ${stamp.color}`, color: stamp.color,\n              background: 'rgba(255,250,240,0.92)', boxShadow: '0 6px 18px rgba(0,0,0,0.25)', textAlign: 'center',\n            }}>\n              <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 19, letterSpacing: 1.5, textTransform: 'uppercase', lineHeight: 1 }}>{stamp.text}</div>\n            </div>\n          )}\n        </div>\n        {/* Ansage für Screenreader (E103) */}\n        <div aria-live=\"polite\" style={{ position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)' }}>\n          {stamp && stampFor === story.id ? stamp.text : ''}\n        </div>\n\n        <div style={{ padding: '20px 20px 8px' }}>\n          {/* Frage (nicht auf Lese-Karten im Feed) */}\n          {!readMode && (<>\n          <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 11, letterSpacing: 1.5, textTransform: 'uppercase', color: '#E8380D' }}>\n            {t(fmtKey, lang)}\n          </div>\n          <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 20, lineHeight: 1.3, marginTop: 6 }}>\n            {dailyPick(story.question, lang)}\n          </div>\n          {story.format === 'estimate' ? renderEstimate() : renderOptions()}\n          </>)}\n          {!answered && !readMode && (\n            <button type=\"button\" onClick={() => commit('skip')} style={{\n              display: 'block', margin: '10px auto 0', minHeight: 44, padding: '0 16px', border: 'none', background: 'transparent',\n              color: tok.ink2, cursor: 'pointer', fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 600, fontSize: 15,\n              textDecoration: 'underline', textUnderlineOffset: 3,\n            }}>{t('daily.skip', lang)}</button>\n          )}\n\n          {/* Auflösung + Geschichte */}\n          {shown && mode !== 'empty' && (\n            <div ref={resultRef} className={readMode ? undefined : 'daily-reveal-in'} style={{ marginTop: readMode ? 0 : 24, scrollMarginTop: 16 }}>\n              {resultLine()}\n              <h2 style={{ margin: '8px 0 0', fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 25, lineHeight: 1.15, letterSpacing: '-0.01em' }}>\n                {dailyPick(story.title, lang)}\n              </h2>\n              <p lang={lang} style={{\n                margin: '10px 0 0', fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 500, fontSize: 16, lineHeight: 1.6, color: tok.ink,\n                textAlign: 'justify', hyphens: 'auto', WebkitHyphens: 'auto',\n              }}>{dailyPick(story.body, lang)}</p>\n              {story.source && (\n                <div style={{ marginTop: 8, fontFamily: 'JetBrains Mono, ui-monospace, monospace', fontSize: 11, letterSpacing: '0.04em', color: tok.ink3 }}>\n                  {t('daily.source', lang)}: {story.source}\n                </div>\n              )}\n              {factCollected && (\n                <div style={{ marginTop: 10, fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 600, fontSize: 14, color: GREEN }}>{t('daily.collected', lang)}</div>\n              )}\n\n              <div style={{ display: 'flex', gap: 10, marginTop: 20 }}>\n                <button type=\"button\" onClick={toggleWish} aria-pressed={saved} style={{\n                  flex: 1, minHeight: 48, borderRadius: 14, cursor: 'pointer',\n                  background: saved ? 'rgba(232,56,13,0.10)' : 'transparent', border: `1.5px solid ${saved ? '#E8380D' : tok.line}`,\n                  color: saved ? '#E8380D' : tok.ink, fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14.5,\n                }}>{saved ? '♥ ' + t('daily.saved', lang) : '♡ ' + t('daily.save', lang)}</button>\n                <button type=\"button\" onClick={share} style={{\n                  flex: '0 0 auto', minHeight: 48, padding: '0 18px', borderRadius: 14, cursor: 'pointer',\n                  background: 'transparent', border: `1.5px solid ${tok.line}`, color: tok.ink,\n                  fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14.5,\n                }}>{t('daily.share', lang)}</button>\n              </div>\n              {/* „Weg zeigen“ ist raus (Testrunde: niemand läuft für eine Tagesgeschichte 7 km), „Mehr über …“ groß */}\n              {hasIntro && (\n                <button type=\"button\" onClick={() => openCity()} style={{\n                  marginTop: 12, width: '100%', minHeight: 58, borderRadius: 16, cursor: 'pointer',\n                  display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 12,\n                  background: tok.surface, border: '2px solid #E8380D', color: '#E8380D',\n                  fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 17.5,\n                }}>\n                  <span aria-hidden=\"true\" style={{ width: 30, height: 30, borderRadius: 9, flex: '0 0 auto', background: dailyBg(realVisual) }} />\n                  {t('daily.more', lang).replace('{city}', cityName)} →\n                </button>\n              )}\n\n              {/* Woche + Statistik (E70): Belohnung, keine Drohung */}\n              {stats && (\n                <div style={{ marginTop: 26, padding: '14px 16px', borderRadius: 16, background: tok.surface2 }}>\n                  {sectionLabel(t('daily.week.title', lang))}\n                  <div role=\"img\" aria-label={t('daily.week.aria', lang).replace('{n}', stats.week.filter(Boolean).length)} style={{ display: 'flex', justifyContent: 'space-between', marginTop: 10 }}>\n                    {stats.week.map((on, i) => (\n                      <div key={i} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 5 }}>\n                        <span aria-hidden=\"true\" style={{\n                          width: 28, height: 28, borderRadius: '50%',\n                          background: on ? '#F5C518' : 'transparent',\n                          border: on ? 'none' : `2px ${i > stats.todayIdx ? 'dashed' : 'solid'} ${tok.line}`,\n                          boxShadow: on ? '0 2px 0 #B8860B' : 'none',\n                          display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#3D2F00', fontWeight: 900, fontSize: 13,\n                        }}>{on ? '!' : ''}</span>\n                        <span style={{ fontFamily: 'JetBrains Mono, monospace', fontSize: 10.5, color: i === stats.todayIdx ? tok.ink : tok.ink3, fontWeight: i === stats.todayIdx ? 700 : 500 }}>{weekLetters[i]}</span>\n                      </div>\n                    ))}\n                  </div>\n                  <div style={{ display: 'flex', gap: 8, marginTop: 14 }}>\n                    {[\n                      [stats.played, t('daily.stats.played', lang)],\n                      [stats.rate == null ? '–' : stats.rate + ' %', t('daily.stats.rate', lang)],\n                      [stats.cities, t('daily.stats.cities', lang)],\n                    ].map(([n, l]) => (\n                      <div key={l} style={{ flex: 1, textAlign: 'center' }}>\n                        <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 22 }}>{n}</div>\n                        <div style={{ fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 12, color: tok.ink3, marginTop: 1 }}>{l}</div>\n                      </div>\n                    ))}\n                  </div>\n                </div>\n              )}\n            </div>\n          )}\n\n        </div>\n        {/* Statt „Die letzten Tage“: gezielt eine Stadt wählen (Testrunde 24.10.), danach läuft „Weiter“ in dieser Stadt */}\n        {cityChoices.length > 0 && (\n          <div style={{ padding: '26px 0 0' }}>\n            <div style={{ padding: '0 20px' }}>{sectionLabel(t('daily.cities.title', lang))}</div>\n            <div className=\"daily-strip\" style={{ display: 'flex', gap: 8, overflowX: 'auto', padding: '10px 20px 4px', scrollbarWidth: 'none' }}>\n              {cityFilter && (\n                <button type=\"button\" onClick={() => setCityFilter(null)} style={{\n                  flex: '0 0 auto', minHeight: 44, padding: '0 14px', borderRadius: 999, cursor: 'pointer',\n                  background: 'transparent', border: `1.5px solid ${tok.line}`, color: tok.ink2,\n                  fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14,\n                }}>{t('daily.cities.all', lang)}</button>\n              )}\n              {cityChoices.map(([c, n]) => {\n                const on = cityFilter === c;\n                return (\n                  <button key={c} type=\"button\" aria-pressed={on} onClick={() => pickCity(c)} style={{\n                    flex: '0 0 auto', display: 'flex', alignItems: 'center', gap: 8, minHeight: 44, padding: '4px 14px 4px 5px', borderRadius: 999, cursor: 'pointer',\n                    background: on ? 'rgba(232,56,13,0.10)' : tok.surface, border: `1.5px solid ${on ? '#E8380D' : tok.line}`, color: on ? '#E8380D' : tok.ink,\n                    fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14, whiteSpace: 'nowrap',\n                  }}>\n                    <span aria-hidden=\"true\" style={{ width: 34, height: 34, borderRadius: '50%', background: dailyBg(dailyCityVisual(c)), flex: '0 0 auto' }} />\n                    {dailyCityName(c, lang)}\n                    <span style={{ fontFamily: 'JetBrains Mono, monospace', fontSize: 11, fontWeight: 600, color: on ? '#E8380D' : tok.ink3 }}>{n}</span>\n                  </button>\n                );\n              })}\n            </div>\n          </div>\n        )}\n        {window.factTripWish.list().length > 0 && (\n          <div style={{ padding: '22px 20px 0' }}>\n            {sectionLabel(t('daily.wish.title', lang))}\n            <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8, marginTop: 10 }}>\n              {window.factTripWish.list().filter(c => (window.CITY_INTROS || {})[c]).map(c => (\n                <button key={c} type=\"button\" onClick={() => openCity(c)} style={{\n                  minHeight: 40, padding: '0 14px', borderRadius: 999, cursor: 'pointer',\n                  background: tok.surface, border: `1.5px solid ${tok.line}`, color: tok.ink,\n                  fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 800, fontSize: 14,\n                }}>♥ {dailyCityName(c, lang)}</button>\n              ))}\n            </div>\n          </div>\n        )}\n        <div style={{ padding: `18px 20px calc(env(safe-area-inset-bottom, 0px) + ${shown ? 104 : 28}px)`, textAlign: 'center', fontFamily: 'DM Sans, system-ui, sans-serif', fontSize: 13, color: tok.ink3 }}>\n          {/* Ende des Vorrats: kein stummes Ende, sondern klare Auskunft und ein Ausgang (Sackgassen-Test 24.10.) */}\n          {shown && !nextStory && (\n            <div style={{ padding: '18px 16px', borderRadius: 16, background: tok.surface2, color: tok.ink, textAlign: 'center' }}>\n              <div style={{ fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 17 }}>{t('daily.feed.end', lang)}</div>\n              <button type=\"button\" onClick={onClose} style={{\n                marginTop: 12, width: '100%', minHeight: 50, borderRadius: 14, border: 'none', cursor: 'pointer',\n                background: '#E8380D', color: '#fff', boxShadow: '0 3px 0 #A82508',\n                fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 16,\n              }}>{t('daily.feed.endCta', lang)}</button>\n            </div>\n          )}\n        </div>\n        </div>\n      </div>\n\n      {/* Weiter: immer erreichbar, sobald die Geschichte aufgelöst ist (Feed, Testrunde 24.10.) */}\n      {shown && nextStory && (\n        <div style={{\n          position: 'absolute', left: 0, right: 0, bottom: 0, zIndex: 1,\n          padding: '14px 20px calc(env(safe-area-inset-bottom, 0px) + 16px)',\n          background: `linear-gradient(180deg, ${dark ? 'rgba(19,16,14,0)' : 'rgba(253,245,232,0)'} 0%, ${tok.bg} 38%)`,\n        }}>\n          <button type=\"button\" onClick={goNext} style={{\n            width: '100%', minHeight: 56, borderRadius: 16, border: 'none', cursor: 'pointer',\n            background: '#E8380D', color: '#fff', boxShadow: '0 3px 0 #A82508',\n            fontFamily: 'Nunito, system-ui, sans-serif', fontWeight: 900, fontSize: 17.5,\n            display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10,\n          }}>\n            {t('daily.next', lang)}\n            <span style={{ fontFamily: 'JetBrains Mono, monospace', fontWeight: 600, fontSize: 11.5, letterSpacing: '0.08em', textTransform: 'uppercase', opacity: 0.85 }}>\n              {dailyHidesCity(nextStory, false) ? t('daily.mystery', lang) : dailyCityName(nextStory.city, lang)}\n            </span>\n            <span aria-hidden=\"true\">→</span>\n          </button>\n        </div>\n      )}\n\n      {toast && (\n        <div role=\"status\" style={{\n          position: 'absolute', left: 20, right: 20, bottom: 'calc(env(safe-area-inset-bottom, 0px) + 24px)', zIndex: 2,\n          padding: '12px 16px', borderRadius: 14, background: dark ? '#F5F0E8' : '#1A1208', color: dark ? '#1A1208' : '#FDF5E8',\n          fontFamily: 'DM Sans, system-ui, sans-serif', fontWeight: 600, fontSize: 14.5, textAlign: 'center',\n          boxShadow: '0 10px 30px rgba(0,0,0,0.25)',\n        }}>{toast}</div>\n      )}\n    </div>\n  );\n};\n"],
  "mappings": "AAaA,MAAM,kBAAqB,qBACrB,iBAAqB,oBACrB,eAAqB,qBACrB,mBAAqB,sBACrB,kBAAqB,qBACrB,gBAAqB,wBACrB,iBAAqB,wBACrB,gBAAqB,wBACrB,kBAAqB,EACrB,oBAAsB,IAEtB,iBAAmB,6BAEzB,SAAS,UAAUA,EAAKC,EAAU,CAChC,GAAI,CAAE,MAAMC,EAAI,aAAa,QAAQF,CAAG,EAAG,OAAOE,EAAI,KAAK,MAAMA,CAAC,EAAID,CAAU,MAAY,CAAE,OAAOA,CAAU,CACjH,CACA,SAAS,WAAWD,EAAKG,EAAK,CAC5B,GAAI,CAAE,aAAa,QAAQH,EAAK,KAAK,UAAUG,CAAG,CAAC,CAAG,MAAY,CAAC,CACrE,CACA,SAAS,WAAWC,EAAI,CACtB,MAAMC,EAAID,EAAK,IAAI,KAAKA,CAAE,EAAI,IAAI,KAClC,OAAO,KAAK,OAAOC,EAAE,QAAQ,EAAIA,EAAE,kBAAkB,EAAI,IAAQ,EAAoB,MAAW,KAAQ,CAC1G,CAEA,SAAS,aAAaC,EAAK,CAAE,QAASA,EAAM,GAAK,EAAI,GAAK,CAAG,CAC7D,SAAS,YAAa,CACpB,GAAI,CAAE,OAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,OAAO,CAAG,MAAY,CAAE,OAAO,IAAM,CAC7F,EAGC,UAAY,CACX,GAAI,CAAE,WAAW,oBAAqB,UAAU,mBAAoB,CAAC,GAAK,GAAK,CAAC,CAAG,MAAY,CAAC,CAClG,GAAG,EAGH,OAAO,iBAAmB,UAA4B,CACpD,MAAMC,EAAM,OAAO,eAAiB,CAAC,EACrC,GAAI,CAACA,EAAI,OAAQ,MAAO,CAAE,MAAO,KAAM,KAAM,CAAC,CAAE,EAChD,MAAMC,EAAID,EAAI,OAAQ,EAAI,WAAW,EAC/BE,EAAU,UAAU,kBAAmB,CAAC,CAAC,EAEzCC,EAAOJ,GAAQ,IAAI,KAAKA,EAAM,KAAQ,EAAE,YAAY,EAAE,MAAM,EAAG,EAAE,EACvE,GAAIC,EAAI,KAAKI,GAAKA,EAAE,IAAI,EAAG,CACzB,MAAMC,EAAUN,GAAQC,EAAI,KAAKI,GAAKA,EAAE,OAASD,EAAIJ,CAAG,CAAC,EACnDO,EAAUN,EAAI,OAAOI,GAAK,CAACA,EAAE,IAAI,EACjCG,EAAOD,EAAQ,OAASA,EAAUN,EAElCQ,EAAUH,EAAO,CAAC,EAClBI,EAASL,GAAM,CAACF,EAAQE,EAAE,EAAE,GAAKF,EAAQE,EAAE,EAAE,EAAE,MAAQ,EACvDM,GAASF,GAAWC,EAAMD,CAAO,EAAIA,EAAU,OAChDD,EAAK,KAAKE,CAAK,GAAKT,EAAI,KAAKI,GAAKK,EAAML,CAAC,IAAM,CAACA,EAAE,MAAQA,EAAE,KAAOD,EAAI,CAAC,EAAE,GAC1EK,GAAWD,GAAO,EAAIA,EAAK,OAAUA,EAAK,QAAUA,EAAK,MAAM,EAC9DI,EAAO,CAAC,EACd,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAAE,MAAMP,EAAIC,EAAO,EAAI,CAAC,EAAOD,GAAKA,IAAMM,GAAOC,EAAK,KAAKP,CAAC,CAAG,CAC3F,MAAO,CAAE,MAAAM,EAAO,KAAAC,CAAK,CACvB,CAGA,IAAIC,EAAM,EACV,KAAOA,EAAMX,GAAG,CAAE,MAAMG,EAAIJ,IAAO,EAAIY,GAAOX,EAAKA,GAAKA,CAAC,EAASY,EAAIX,EAAQE,EAAE,EAAE,EAAG,GAAI,CAACS,GAAKA,EAAE,MAAQ,EAAG,MAAOD,GAAO,CAC1H,MAAMF,EAAQV,IAAO,EAAIY,GAAOX,EAAKA,GAAKA,CAAC,EACrCU,EAAO,CAAC,EACd,QAASG,EAAI,EAAGA,EAAI,KAAK,IAAI,EAAGb,CAAC,EAAGa,IAAK,CAAE,MAAMV,EAAIJ,IAAO,EAAIY,EAAME,GAAKb,EAAKA,GAAKA,CAAC,EAAOG,IAAMM,GAAOC,EAAK,KAAKP,CAAC,CAAG,CACxH,MAAO,CAAE,MAAAM,EAAO,KAAAC,CAAK,CACvB,EAEA,OAAO,iBAAmB,IAAM,CAAE,MAAMI,EAAI,WAAW,EAAG,OAAOA,IAAM,KAAOA,IAAM,MAAQ,EAC5F,OAAO,sBAAwB,IAAM,CAAC,OAAO,iBAAiB,GAAK,UAAU,iBAAkB,IAAI,IAAM,WAAW,EACpH,OAAO,oBAAsB,IAAM,WAAW,iBAAkB,WAAW,CAAC,EAC5E,OAAO,mBAAsBC,GAAO,CAAC,CAAC,UAAU,kBAAmB,CAAC,CAAC,EAAEA,CAAE,EAGzE,OAAO,oBAAsB,IAAM,UAAU,kBAAmB,EAAI,IAAM,GAC1E,OAAO,uBAA0BrB,GAAM,CAAE,WAAW,kBAAmB,CAAC,CAACA,CAAC,EAAG,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,oBAAoB,CAAC,CAAG,MAAY,CAAC,CAAE,EAC/J,OAAO,qBAAwBsB,GAAmB,CAChD,GAAI,OAAO,iBAAiB,EAAG,MAAO,GACtC,GAAI,CAAC,OAAO,oBAAoB,EAAG,MAAO,GAC1C,GAAI,CAAE,GAAI,aAAa,QAAQ,iBAAiB,IAAM,SAAW,UAAU,mBAAoB,CAAC,GAAK,GAAK,EAAG,MAAO,EAAO,MAAY,CAAC,CACxI,OAAQ,UAAU,mBAAoB,CAAC,GAAK,IAAM,IAAMA,GAAkB,GAAK,CACjF,EAGA,OAAO,aAAe,CACpB,KAAM,IAAM,UAAU,eAAgB,CAAC,CAAC,EACxC,IAAOC,GAAS,UAAU,eAAgB,CAAC,CAAC,EAAE,SAASA,CAAI,EAC3D,OAASA,GAAS,CAChB,MAAMC,EAAI,UAAU,eAAgB,CAAC,CAAC,EAChCC,EAAOD,EAAE,SAASD,CAAI,EAAIC,EAAE,OAAOE,GAAKA,IAAMH,CAAI,EAAIC,EAAE,OAAOD,CAAI,EACzE,kBAAW,eAAgBE,CAAI,EACxBA,EAAK,SAASF,CAAI,CAC3B,CACF,EAEA,SAAS,UAAUI,EAAOC,EAAM,CAC9B,OAAKD,IACEA,EAAMC,CAAI,GAAKD,EAAM,KAAM,EACpC,CACA,SAAS,cAAcJ,EAAMK,EAAM,CACjC,MAAMC,IAAM,OAAO,aAAe,CAAC,GAAGN,CAAI,GAAK,CAAC,GAAG,MAC7CG,EAAIG,GAAKA,EAAE,CAAC,EAClB,OAAKH,IACGE,IAAS,MAAQF,EAAE,SAAWA,EAAE,QAAqBH,CAC/D,CACA,MAAM,mBAAqB,CAAC,UAAW,SAAS,EAChD,SAAS,gBAAgBA,EAAM,CAC7B,MAAMM,IAAM,OAAO,aAAe,CAAC,GAAGN,CAAI,GAAK,CAAC,GAAG,MAC7CG,EAAIG,GAAKA,EAAE,CAAC,EACZC,EAAOJ,GAAKA,EAAE,UAAYA,EAAE,SAAS,SAAW,EAAIA,EAAE,SAAW,CAAC,UAAW,SAAS,EAC5F,MAAO,CAAE,IAAKA,GAAKA,EAAE,OAASA,EAAE,MAAM,IAAK,KAAAI,CAAK,CAClD,CACA,SAAS,QAAQ9B,EAAG,CAClB,MAAM+B,EAAI,2BAA2B/B,EAAE,KAAK,CAAC,CAAC,KAAKA,EAAE,KAAK,CAAC,CAAC,IAC5D,OAAOA,EAAE,IAAM,OAAOA,EAAE,GAAG,mBAAmB+B,CAAC,GAAKA,CACtD,CACA,SAAS,YAAY,EAAGH,EAAM,CAC5B,GAAI,CAAE,OAAO,OAAO,CAAC,EAAE,eAAeA,IAAS,KAAO,QAAU,OAAO,CAAG,MAAY,CAAE,OAAO,OAAO,CAAC,CAAG,CAC5G,CAEA,SAAS,eAAeI,EAAOC,EAAU,CAAE,OAAOD,GAASA,EAAM,SAAW,QAAU,CAACC,CAAU,CAGjG,SAAS,aAAaD,EAAO,CAC3B,MAAI,CAACA,GAAU,CAACA,EAAM,QAAU,CAACA,EAAM,OAAgB,MAC/C,OAAO,OAAS,CAAC,GAAG,KAAKE,GAAMF,EAAM,QAAU,OAAOE,EAAE,EAAE,IAAM,OAAOF,EAAM,MAAM,GAAM,OAAOE,EAAE,EAAE,IAAM,OAAOF,EAAM,MAAM,CAAC,GAAK,IAC7I,CAIA,SAAS,cAAcX,EAAIc,EAAK,CAC9B,GAAI,CACF,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,GAAAd,EAAI,IAAAc,CAAI,CAAE,CAAC,CAAC,EACpF,OAAO,cAAc,IAAI,YAAY,oBAAoB,CAAC,CAC5D,MAAY,CAAC,CACf,CAGA,OAAO,kBAAoB,SAA2BC,EAAM,CAC1D,MAAMC,EAAQ,UAAU,kBAAmB,CAAC,CAAC,EACvCC,EAAW,IAAI,KACpBF,GAAQ,CAAC,GAAG,QAAQG,GAAK,CAExB,GADAD,EAAS,IAAIC,EAAE,QAAQ,EACnBF,EAAME,EAAE,QAAQ,EAAG,OACvB,MAAMC,EAAKD,EAAE,QAAU,KAAO,KAAQ,kBAAkB,KAAKA,EAAE,MAAM,EAAI,OAAOA,EAAE,MAAM,EAAIA,EAAE,OAC9FF,EAAME,EAAE,QAAQ,EAAI,CAAE,OAAQC,EAAI,QAASD,EAAE,QAAS,KAAM,CAAC,CAACA,EAAE,UAAW,IAAKA,EAAE,IAAK,GAAI,KAAK,MAAMA,EAAE,WAAW,GAAK,KAAK,IAAI,CAAE,CACrI,CAAC,EACD,WAAW,kBAAmBF,CAAK,EACnC,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,oBAAoB,CAAC,CAAG,MAAY,CAAC,CAChF,OAAO,OAAO,QAAQA,CAAK,EAAE,OAAO,CAAC,CAAChB,CAAE,IAAM,CAACiB,EAAS,IAAIjB,CAAE,CAAC,CACjE,EAIA,SAAS,eAAed,EAASkC,EAASC,EAAU,CAClD,MAAMtC,EAAM,WAAW,EACjBuC,EAAOtB,GAAO,CAAE,IAAIuB,EAAIxC,EAAK,QAASyC,EAAI,EAAGA,EAAIxB,EAAG,OAAQwB,IAAKD,EAAKA,EAAI,GAAKvB,EAAG,WAAWwB,CAAC,IAAO,EAAG,OAAOD,CAAG,EAClHhC,GAAQ,OAAO,eAAiB,CAAC,GAAG,OAAOH,GAAKA,EAAE,KAAOgC,GAAW,CAAClC,EAAQE,EAAE,EAAE,CAAC,EACrF,KAAK,CAACS,EAAG4B,KAAOA,EAAE,QAAU,IAAM5B,EAAE,QAAU,IAAMyB,EAAIzB,EAAE,EAAE,EAAIyB,EAAIG,EAAE,EAAE,CAAC,EACtEC,EAAM,CAAC,EACb,IAAIC,EAAON,EACX,KAAO9B,EAAK,QAAQ,CAClB,IAAIiC,EAAIjC,EAAK,UAAUH,GAAKA,EAAE,OAASuC,CAAI,EACvCH,EAAI,IAAGA,EAAI,GACf,MAAMpC,EAAIG,EAAK,OAAOiC,EAAG,CAAC,EAAE,CAAC,EAC7BE,EAAI,KAAKtC,CAAC,EAAGuC,EAAOvC,EAAE,IACxB,CACA,OAAOsC,CACT,CAIA,OAAO,oBAAsB,SAA6BE,EAAM,CAC9D,GAAI,CAACA,EAAM,MAAO,GAClB,MAAM1C,EAAU,UAAU,kBAAmB,CAAC,CAAC,EACzCyB,GAAS,OAAO,eAAiB,CAAC,GAAG,KAAKvB,IAC5CA,EAAE,QAAU,OAAOA,EAAE,MAAM,IAAM,OAAOwC,EAAK,EAAE,GAAOxC,EAAE,QAAU,OAAOA,EAAE,MAAM,IAAM,OAAOwC,EAAK,EAAE,IACpG1C,EAAQE,EAAE,EAAE,GAAKF,EAAQE,EAAE,EAAE,EAAE,UAAY,IAAI,EACpD,GAAI,CAACuB,EAAO,MAAO,GACnB,MAAMkB,EAAO,UAAU,gBAAiB,CAAC,CAAC,EAC1C,OAAIA,EAAK,SAASlB,EAAM,EAAE,EAAU,IACpC,WAAW,gBAAiBkB,EAAK,OAAOlB,EAAM,EAAE,CAAC,EAC1C,GACT,EAGA,SAAS,WAAWzB,EAAS,CAC3B,MAAM4C,EAAO,OAAO,OAAO5C,GAAW,CAAC,CAAC,EAClC6C,EAAO,IAAI,IAAID,EAAK,IAAIjC,GAAKA,EAAE,GAAG,EAAE,OAAOf,GAAKA,GAAK,IAAI,CAAC,EAC1DY,EAAQ,WAAW,EACnBsC,EAAStC,EAAQ,aAAaA,CAAK,EACnCuC,EAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAE,IAAIT,GAAKO,EAAK,IAAIC,EAASR,CAAC,CAAC,EAC1DU,EAAUJ,EAAK,OAAOjC,GAAKA,EAAE,UAAY,IAAI,EAC7CsC,EAAQD,EAAQ,OAAOrC,GAAKA,EAAE,UAAY,EAAI,EAAE,OACtD,MAAO,CACL,KAAAoC,EAAM,SAAU,aAAavC,CAAK,EAClC,OAAQoC,EAAK,OACb,KAAMI,EAAQ,OAAS,KAAK,MAAMC,EAAQD,EAAQ,OAAS,GAAG,EAAI,KAClE,OAAQ,IAAI,IAAI,OAAO,KAAKhD,GAAW,CAAC,CAAC,EAAE,IAAIc,KAAQ,OAAO,eAAiB,CAAC,GAAG,KAAKZ,GAAKA,EAAE,KAAOY,CAAE,GAAK,CAAC,GAAG,IAAI,EAAE,OAAO,OAAO,CAAC,EAAE,IAC1I,CACF,CAIA,SAAS,UAAUoC,EAAKC,EAAMC,EAAM,CAClC,MAAMC,EAAQ,OAAOF,CAAI,EAAE,MAAM,KAAK,EAAGG,EAAQ,CAAC,EAClD,IAAIC,EAAM,GACV,OAAAF,EAAM,QAAQ/B,GAAK,CACjB,MAAMkC,EAAOD,EAAMA,EAAM,IAAMjC,EAAIA,EAC/B4B,EAAI,YAAYM,CAAI,EAAE,MAAQJ,GAAQG,GAAOD,EAAM,KAAKC,CAAG,EAAGA,EAAMjC,GAAUiC,EAAMC,CAC1F,CAAC,EACGD,GAAKD,EAAM,KAAKC,CAAG,EAChBD,CACT,CACA,eAAe,gBAAgB,CAAE,MAAA7B,EAAO,KAAAJ,EAAM,SAAAoC,EAAU,KAAAC,EAAM,IAAAC,CAAI,EAAG,CACnE,GAAI,CAAM,SAAS,OAAS,SAAS,MAAM,OAAO,MAAM,SAAS,MAAM,KAAO,MAAY,CAAC,CAC3F,MAAMC,EAAI,KAAMC,EAAI,KAAMC,EAAI,GACxBC,EAAK,SAAS,cAAc,QAAQ,EAAGA,EAAG,MAAQH,EAAGG,EAAG,OAASF,EACvE,MAAMX,EAAMa,EAAG,WAAW,IAAI,EACxBxC,EAAOE,EAAM,SAAW,OAAS,mBAAqB,gBAAgBA,EAAM,IAAI,EAAE,KAClF,EAAIyB,EAAI,qBAAqB,EAAG,EAAGU,EAAGC,CAAC,EAC7C,SAAE,aAAa,EAAGtC,EAAK,CAAC,CAAC,EAAG,EAAE,aAAa,EAAGA,EAAK,CAAC,CAAC,EACrD2B,EAAI,UAAY,EAAGA,EAAI,SAAS,EAAG,EAAGU,EAAGC,CAAC,EAC1CX,EAAI,UAAY,qBAAsBA,EAAI,SAAS,EAAG,EAAGU,EAAGC,CAAC,EAC7DX,EAAI,UAAY,UAChBA,EAAI,UAAU,EAAOA,EAAI,UAAWA,EAAI,UAAUY,EAAGA,EAAG,GAAI,GAAI,EAAE,EAAQZ,EAAI,KAAKY,EAAGA,EAAG,GAAI,EAAE,EAAGZ,EAAI,KAAK,EAC3GA,EAAI,UAAY,OAAQA,EAAI,KAAO,8BAA+BA,EAAI,UAAY,SAAUA,EAAI,aAAe,SAC/GA,EAAI,SAAS,IAAKY,EAAI,GAAIA,EAAI,EAAE,EAChCZ,EAAI,UAAY,OAAQA,EAAI,KAAO,8BAA+BA,EAAI,SAAS,OAAQY,EAAI,IAAKA,EAAI,EAAE,EACtGZ,EAAI,aAAe,aACnBA,EAAI,KAAO,uCAAwCA,EAAI,UAAY,yBACnEA,EAAI,SAAS,EAAE,eAAgB7B,CAAI,EAAE,YAAY,EAAGyC,EAAG,GAAG,EAC1DZ,EAAI,KAAO,8BAA+BA,EAAI,UAAY,OAC1DA,EAAI,SAASO,EAAUK,EAAG,GAAG,EAC7BZ,EAAI,KAAO,8BACA,UAAUA,EAAK,UAAUzB,EAAM,SAAUJ,CAAI,EAAGuC,EAAI,EAAIE,CAAC,EAAE,MAAM,EAAG,CAAC,EAC7E,QAAQ,CAAC7C,EAAGqB,IAAMY,EAAI,SAASjC,EAAG6C,EAAG,IAAMxB,EAAI,EAAE,CAAC,EACrDY,EAAI,UAAY,UAAWA,EAAI,KAAO,8BACtC,UAAUA,EAAKQ,EAAME,EAAI,EAAIE,CAAC,EAAE,MAAM,EAAG,CAAC,EAAE,QAAQ,CAAC7C,EAAGqB,IAAMY,EAAI,SAASjC,EAAG6C,EAAGD,EAAI,IAAMvB,EAAI,EAAE,CAAC,EAClGY,EAAI,UAAY,wBAAyBA,EAAI,KAAO,uCACpDA,EAAI,SAASS,EAAKG,EAAGD,EAAIC,CAAC,EACnB,MAAM,IAAI,QAAQ9B,GAAK+B,EAAG,OAAO/B,EAAG,WAAW,CAAC,CACzD,CAKA,IAAI,kBAAoB,CAAE,OAAQ,KAAM,GAAI,KAAM,YAAa,KAAM,OAAQ,KAAM,YAAa,GAAO,OAAQ,EAAM,EAErH,SAAS,iBAAkB,CACzB,MAAMgC,EAAK,kBAAkB,GAC7B,GAAI,CAACA,GAAMA,EAAG,MAAM,UAAY,OAAQ,OACxC,MAAMnD,EAAImD,EAAG,cAAc,SAAS,EACpCnD,EAAE,UAAU,OAAO,YAAY,EAAQA,EAAE,YAAaA,EAAE,UAAU,IAAI,YAAY,CACpF,CAIA,MAAM,mBAAqB,yBACrB,eAAiB,EAAI,KAAO,IAC5B,iBAAmB,IACzB,IAAI,YAAc,KAClB,SAAS,kBAAmB,CAC1B,MAAM4B,EAAO,UAAU,mBAAoB,CAAC,EAAGwB,EAAM,KAAK,IAAI,GAC1D,CAACxB,GAAQwB,EAAMxB,EAAO,gBAAkB,WAAWA,CAAI,IAAM,WAAWwB,CAAG,KAAG,YAAc,CAAE,MAAOA,EAAK,KAAM,IAAK,GACzH,WAAW,mBAAoBA,CAAG,CACpC,CACA,iBAAiB,EACjB,SAAS,iBAAiB,mBAAoB,IAAM,CAC9C,SAAS,kBAAoB,WAAa,iBAAiB,EAAG,WAAW,gBAAiB,GAAG,GAC5F,WAAW,mBAAoB,KAAK,IAAI,CAAC,CAChD,CAAC,EACD,SAAS,mBAAoB,CAC3B,MAAMD,EAAK,SAAS,cAAc,QAAQ,EAC1C,OAAAA,EAAG,KAAO,SACVA,EAAG,UAAY,gBAEfA,EAAG,UAAY,sPACfA,EAAG,iBAAiB,QAAUE,GAAO,CAAEA,EAAG,gBAAgB,EAAG,kBAAkB,QAAU,kBAAkB,OAAO,CAAG,CAAC,EAC/GF,CACT,CACA,SAAS,mBAAmBb,EAAMgB,EAAI,CACpC,MAAMH,EAAK,kBAAkB,GAC7B,GAAI,CAACA,EAAI,OACT,MAAMzB,EAAIyB,EAAG,cAAc,YAAY,EACvCzB,EAAE,YAAcY,EAChBa,EAAG,UAAU,IAAI,SAAS,EAC1B,aAAa,kBAAkB,WAAW,EAC1C,kBAAkB,YAAc,WAAW,IAAMA,EAAG,UAAU,OAAO,SAAS,EAAGG,CAAE,CACrF,CACA,OAAO,iBAAmB,SAA0B,CAAE,IAAAC,EAAK,IAAAC,EAAK,QAAAC,EAAS,KAAAjD,EAAM,OAAAkD,CAAO,EAAG,CACvF,MAAMC,EAAK,kBACXA,EAAG,OAASD,EACZ,MAAME,EAAK,OAAO,YAAc,OAAO,SACvC,GAAI,CAACL,GAAO,CAACK,EAAI,OACjB,KAAM,CAAE,MAAAjE,CAAM,EAAI,OAAO,iBAAiB,EAC1C,GAAI,CAACA,EAAO,OAEZ,GAAIgE,EAAG,QAAUA,EAAG,MAAQJ,EAAK,CAAE,GAAI,CAAEI,EAAG,OAAO,OAAO,CAAG,MAAY,CAAC,CAAEA,EAAG,OAAS,KAAMA,EAAG,OAAS,EAAO,CAEjH,GADAA,EAAG,IAAMJ,EACL,CAACI,EAAG,OAAQ,CACdA,EAAG,GAAK,kBAAkB,EAC1BA,EAAG,OAAS,IAAIC,EAAG,OAAO,CAAE,QAASD,EAAG,GAAI,OAAQ,QAAS,CAAC,EAC9D,MAAMrD,EAAIkD,EAAM,CAACA,EAAI,IAAKA,EAAI,GAAG,GAAK,IAAM,CAAE,MAAMK,EAAIN,EAAI,UAAU,EAAG,MAAO,CAACM,EAAE,IAAKA,EAAE,GAAG,CAAG,GAAG,EACnGF,EAAG,OAAO,UAAUrD,CAAC,EAAE,MAAMiD,CAAG,EAChCI,EAAG,YAAc,CAACH,EAClBG,EAAG,OAAS,IACd,CAGA,GAAIH,EAAK,CAEP,GADY,CAACG,EAAG,QAAU,KAAK,OAAOH,EAAI,IAAMG,EAAG,OAAO,KAAK,KAAO,QAASH,EAAI,IAAMG,EAAG,OAAO,KAAK,KAAO,OAAS,KAAK,IAAIH,EAAI,IAAM,KAAK,GAAK,GAAG,CAAC,EAAI,IACpJ,CACP,MAAMM,EAAK,CAAE,IAAKN,EAAI,IAAM,sBAAa,IAAKA,EAAI,IAAM,IAAM,OAAS,KAAK,IAAIA,EAAI,IAAM,KAAK,GAAK,GAAG,EAAG,EAC1GG,EAAG,OAAS,CAAE,KAAM,CAAE,IAAKH,EAAI,IAAK,IAAKA,EAAI,GAAI,EAAG,GAAAM,CAAG,EACvDH,EAAG,OAAO,UAAU,CAACG,EAAG,IAAKA,EAAG,GAAG,CAAC,CACtC,CACAH,EAAG,YAAc,EACnB,SAAWA,EAAG,YAAa,CAAE,MAAMrD,EAAIiD,EAAI,UAAU,EAAGI,EAAG,OAAO,UAAU,CAACrD,EAAE,IAAKA,EAAE,GAAG,CAAC,CAAG,CAG7F,MAAMnB,EAAU,UAAU,kBAAmB,CAAC,CAAC,EACzC4E,EAAO,CAAC,CAAC5E,EAAQQ,EAAM,EAAE,EACzBqE,EAAUD,GAAQ,EAAE,OAAO,eAAiB,CAAC,GAAG,KAAK1E,GAAK,CAACF,EAAQE,EAAE,EAAE,CAAC,EAC9EsE,EAAG,GAAG,UAAU,OAAO,UAAWK,CAAO,EACzCL,EAAG,GAAG,cAAc,SAAS,EAAE,YAAc,EAAEI,EAAO,qBAAuB,cAAevD,CAAI,EAChG,MAAMyD,EAAYN,EAAG,GAAG,MAAM,UAAY,QAAU,CAACA,EAAG,OAWxD,GATA,WAAW,mBAAoB,KAAK,IAAI,CAAC,EACrC,aAAeH,IACZ,YAAY,KACR,KAAK,OAAOA,EAAI,IAAM,YAAY,KAAK,KAAO,QAASA,EAAI,IAAM,YAAY,KAAK,KAAO,OAAS,KAAK,IAAIA,EAAI,IAAM,KAAK,GAAK,GAAG,CAAC,EAAI,mBAAkB,YAAc,MADzJ,YAAY,KAAO,CAAE,IAAKA,EAAI,IAAK,IAAKA,EAAI,GAAI,GAGzEC,EAAUA,IAAY,CAAC,CAAC,aAAe,OAAO,iBAAiB,GAC/DE,EAAG,GAAG,MAAM,QAAUF,EAAU,GAAK,OACjCA,GAAWQ,IAAaN,EAAG,OAAS,GAAWK,GAAS,WAAW,gBAAiB,GAAG,GAC3FL,EAAG,GAAG,aAAa,aAAc,EAAEK,EAAU,yBAA2BD,EAAO,yBAA2B,qBAAsBvD,CAAI,CAAC,EACjI,CAACiD,GAAWM,EAAM,OAEtB,MAAM/E,EAAM,WAAW,EACvB,GAAI,CAAC,UAAU,gBAAiB,EAAK,EACnC,WAAW,gBAAiB,EAAI,EAChC,WAAW,iBAAkBA,CAAG,EAChC,WAAW,IAAM,mBAAmB,EAAE,sBAAuBwB,CAAI,EAAG,IAAI,EAAG,IAAI,UACtE,UAAU,iBAAkB,IAAI,IAAMxB,EAAK,CACpD,WAAW,iBAAkBA,CAAG,EAChC,MAAMkF,EAAOvE,EAAM,SAAW,OAAS,EAAE,gBAAiBa,CAAI,EAAI,cAAcb,EAAM,KAAMa,CAAI,EAChG,WAAW,IAAM,mBAAmB,EAAE,sBAAuBA,CAAI,EAAE,QAAQ,SAAU0D,CAAI,EAAG,IAAI,EAAG,IAAI,CACzG,CACF,EAGA,OAAO,eAAiB,SAAwB,CAAE,KAAA1D,EAAM,KAAA2D,EAAM,OAAAT,EAAQ,OAAAU,CAAO,EAAG,CAC9E,KAAM,CAAE,MAAAzE,CAAM,EAAI,OAAO,iBAAiB,EAC1C,GAAI,CAACA,EAAO,OAAO,KACnB,MAAMkB,EAAW,OAAO,mBAAmBlB,EAAM,EAAE,EAC7C0E,EAAO,eAAe1E,EAAOkB,CAAQ,EACrCjC,EAAIyF,EAAO,CAAE,IAAK,KAAM,KAAM,kBAAmB,EAAI,gBAAgB1E,EAAM,IAAI,EAC/E2E,EAASD,EAAO,EAAE,wBAAyB7D,CAAI,EAAI,EAAE,oBAAqBA,CAAI,EAAE,QAAQ,SAAU,cAAcb,EAAM,KAAMa,CAAI,CAAC,EACjI+D,EAAMJ,EAAO,UAAY,UACzBK,EAAOL,EAAO,UAAY,UAEhC,OACE,oBAAC,OAAI,UAAU,gBAAgB,MAAO,CACpC,SAAU,WAAY,OAAQ,2DAA4D,KAAM,GAAI,MAAO,GAAI,OAAQ,EACzH,GACE,oBAAC,OAAI,MAAO,CACV,QAAS,OAAQ,WAAY,UAAW,aAAc,GAAI,SAAU,SACpE,WAAYA,EAAO,sBAAwB,yBAC3C,UAAW,+DACX,eAAgB,aAAc,qBAAsB,YACtD,GACE,oBAAC,UAAO,KAAK,SAAS,QAAST,EAAQ,MAAO,CAC5C,KAAM,EAAG,SAAU,EAAG,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,QAAS,GAC/E,WAAY,cAAe,OAAQ,OAAQ,UAAW,OAAQ,OAAQ,UAAW,MAAOa,CAC1F,GACE,oBAAC,QAAK,cAAY,OAAO,MAAO,CAC9B,KAAM,WAAY,MAAO,GAAI,OAAQ,GAAI,aAAc,GAAI,WAAY,QAAQ3F,CAAC,EAChF,UAAW,mCAAoC,QAAS,OAAQ,WAAY,SAAU,eAAgB,SACtG,MAAO,UAAW,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAC5F,GAAIyF,EAAO,IAAM,EAAG,EACpB,oBAAC,QAAK,MAAO,CAAE,SAAU,EAAG,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,GAC3E,oBAAC,QAAK,MAAO,CACX,WAAY,0CAA2C,WAAY,IAAK,SAAU,GAClF,cAAe,SAAU,cAAe,YAAa,MAAO,SAC9D,GAAIC,CAAO,EACX,oBAAC,QAAK,MAAO,CACX,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,IACxF,QAAS,cAAe,gBAAiB,EAAG,gBAAiB,WAAY,SAAU,QACrF,GAAe,UAAXzD,EAAqBlB,EAAM,MAAyBA,EAAM,OAAxBa,CAAI,CAAkC,EAC3EK,GACC,oBAAC,QAAK,MAAO,CAAE,WAAY,iCAAkC,SAAU,KAAM,MAAO2D,CAAK,GACtF,EAAE,kBAAmBhE,CAAI,CAC5B,CAEJ,CACF,EACA,oBAAC,UAAO,KAAK,SAAS,QAAS4D,EAAQ,aAAY,EAAE,kBAAmB5D,CAAI,EAAG,MAAO,CACpF,KAAM,WAAY,MAAO,GAAI,OAAQ,OAAQ,WAAY,cAAe,OAAQ,UAChF,MAAOgE,EAAM,SAAU,GAAI,WAAY,CACzC,GAAG,GAAC,CACN,CACF,CAEJ,EAMA,OAAO,cAAgB,SAAuB,CAAE,KAAAhE,EAAM,KAAAL,EAAM,OAAAuD,CAAO,EAAG,CACpE,KAAM,CAACe,EAAMC,CAAO,EAAI,MAAM,SAAS,EAAK,EACtCvF,EAAU,UAAU,kBAAmB,CAAC,CAAC,EACzC4C,GAAQ,OAAO,eAAiB,CAAC,GAAG,OAAO1C,GAAKA,EAAE,OAASc,GAAQhB,EAAQE,EAAE,EAAE,CAAC,EACnF,KAAK,CAACS,EAAG4B,KAAOvC,EAAQuC,EAAE,EAAE,EAAE,IAAM,IAAMvC,EAAQW,EAAE,EAAE,EAAE,IAAM,EAAE,EACnE,GAAI,CAACiC,EAAK,OAAQ,OAAO,KACzB,MAAM4C,EAAQF,EAAO1C,EAAOA,EAAK,MAAM,EAAG,CAAC,EAC3C,OACE,oBAAC,OAAI,MAAO,CAAE,UAAW,EAAG,QAAS,YAAa,aAAc,GAAI,WAAY,yBAA0B,OAAQ,mCAAoC,UAAW,MAAO,GACtK,oBAAC,OAAI,MAAO,CAAE,WAAY,4BAA6B,WAAY,IAAK,SAAU,GAAI,cAAe,SAAU,cAAe,YAAa,MAAO,uBAAwB,GACvK,EAAE,uBAAwBvB,CAAI,EAAE,MAAIuB,EAAK,MAC5C,EACA,oBAAC,OAAI,MAAO,CAAE,WAAY,iCAAkC,SAAU,KAAM,MAAO,wBAAyB,UAAW,CAAE,GACtH,EAAE,qBAAsBvB,CAAI,CAC/B,EACA,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,UAAW,CAAE,GAClEmE,EAAM,IAAItF,GACT,oBAAC,UAAO,IAAKA,EAAE,GAAI,KAAK,SAAS,QAAS,IAAMqE,GAAUA,EAAOrE,EAAE,EAAE,EAAG,MAAO,CAC7E,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,UAAW,GAAI,QAAS,QAAS,OAAQ,OACzF,UAAW,mCAAoC,WAAY,cAAe,OAAQ,UAAW,UAAW,OACxG,MAAO,yBAA0B,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,IAC3H,GACE,oBAAC,QAAK,MAAO,CAAE,KAAM,CAAE,GAAI,UAAUA,EAAE,MAAOmB,CAAI,CAAE,EACpD,oBAAC,QAAK,cAAY,OAAO,MAAO,CAAE,QAAS,EAAI,GAAG,GAAC,CACrD,CACD,CACH,EACCuB,EAAK,OAAS,GACb,oBAAC,UAAO,KAAK,SAAS,QAAS,IAAM2C,EAAQ,CAACD,CAAI,EAAG,MAAO,CAC1D,UAAW,EAAG,UAAW,GAAI,QAAS,EAAG,OAAQ,OAAQ,WAAY,cAAe,OAAQ,UAC5F,MAAO,yBAA0B,WAAY,iCAAkC,WAAY,IAAK,SAAU,KAC1G,eAAgB,YAAa,oBAAqB,CACpD,GAAIA,EAAO,EAAE,sBAAuBjE,CAAI,EAAI,EAAE,qBAAsBA,CAAI,EAAE,QAAQ,MAAOuB,EAAK,MAAM,CAAE,CAE1G,CAEJ,EAEA,OAAO,cAAgB,SAAuB,CAAE,KAAAvB,EAAM,MAAAoE,EAAO,OAAAlB,CAAO,EAAG,CACrE,KAAM,CAAE,MAAA/D,CAAM,EAAI,OAAO,iBAAiB,EAC1C,GAAI,CAACA,EAAO,OAAO,KACnB,MAAMwE,EAAOS,IAAU,OACjB/D,EAAW,OAAO,mBAAmBlB,EAAM,EAAE,EAC7C0E,EAAO,eAAe1E,EAAOkB,CAAQ,EACrCjC,EAAIyF,EAAO,CAAE,IAAK,KAAM,KAAM,kBAAmB,EAAI,gBAAgB1E,EAAM,IAAI,EACrF,OACE,oBAAC,OAAI,MAAO,CAAE,QAAS,aAAc,GACnC,oBAAC,UAAO,KAAK,SAAS,QAAS+D,EAAQ,MAAO,CAC5C,MAAO,OAAQ,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,QAAS,GAAI,aAAc,GAAI,OAAQ,UAAW,UAAW,OAC5H,WAAYS,EAAO,UAAY,UAAW,OAAQ,eAAeA,EAAO,wBAA0B,uBAAuB,GACzH,MAAOA,EAAO,UAAY,SAC5B,GACE,oBAAC,QAAK,cAAY,OAAO,MAAO,CAC9B,KAAM,WAAY,MAAO,GAAI,OAAQ,GAAI,aAAc,GAAI,WAAY,QAAQvF,CAAC,EAAG,SAAU,WAC7F,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,MAAO,UAAW,WAAY,qBAAsB,WAAY,IAAK,SAAU,EAClJ,GAAIyF,EAAO,IAAM,EAAG,EACpB,oBAAC,QAAK,MAAO,CAAE,KAAM,EAAG,SAAU,CAAE,GAClC,oBAAC,QAAK,MAAO,CAAE,QAAS,QAAS,WAAY,4BAA6B,WAAY,IAAK,SAAU,GAAI,cAAe,SAAU,cAAe,YAAa,MAAO,SAAU,GAC5K,EAAE,eAAgB7D,CAAI,EAAGK,EAAW,KAAO,EAC9C,EACA,oBAAC,QAAK,MAAO,CAAE,QAAS,cAAe,gBAAiB,EAAG,gBAAiB,WAAY,SAAU,SAAU,UAAW,EAAG,WAAY,qBAAsB,WAAY,IAAK,SAAU,GAAI,WAAY,IAAK,GAC9L,UAAXA,EAAqBlB,EAAM,MAAyBA,EAAM,OAAxBa,CAAI,CACzC,CACF,EACA,oBAAC,QAAK,cAAY,OAAO,MAAO,CAAE,WAAY,qBAAsB,WAAY,IAAK,SAAU,GAAI,QAAS,EAAI,GAAG,GAAC,CACtH,CACF,CAEJ,EAIA,IAAI,aAAe,IAAM,CAAE,GAAI,CAAE,OAAO,KAAK,MAAM,eAAe,QAAQ,mBAAmB,GAAK,MAAM,CAAG,MAAY,CAAE,OAAO,IAAM,CAAE,GAAG,EAE3I,MAAM,gBAAkB,GAAK,GAAK,IAClC,SAAS,gBAAgBW,EAAG,CAC1B,YAAcA,EACd,GAAI,CAAE,eAAe,QAAQ,oBAAqB,KAAK,UAAUA,CAAC,CAAC,CAAG,MAAY,CAAC,CACrF,CAEA,MAAM,iBAAmB,EAEzB,OAAO,gBAAkB,SAAyB,CAAE,KAAAX,EAAM,KAAA2D,EAAM,QAAAU,EAAS,eAAAC,EAAgB,QAAAC,CAAQ,EAAG,CAClG,MAAMC,EAAS,OAAO,iBAAiB,EACjCC,EAAO,OAAO,eAAiB,CAAC,EAGhC,CAACC,CAAK,EAAI,MAAM,SAAS,IAAM,CACnC,MAAMvF,EAAQqF,EAAO,MAErB,GAAID,GAAWE,EAAK,KAAK5F,GAAKA,EAAE,KAAO0F,CAAO,EAAG,MAAO,CAAE,GAAIA,EAAS,KAAM,SAAU,WAAY,KAAM,UAAW,CAAE,EACtH,MAAMI,EAAK,YAELC,EAAYzF,GAAS,CAAC,OAAO,mBAAmBA,EAAM,EAAE,EAC9D,GAAIwF,GAAMA,EAAG,IAAM,KAAK,IAAI,EAAIA,EAAG,GAAK,iBAAmBA,EAAG,MAAQ,WAAW,GAAKF,EAAK,KAAK5F,GAAKA,EAAE,KAAO8F,EAAG,EAAE,IAC7G,CAACC,GAAaD,EAAG,KAAOxF,EAAM,IAAK,MAAO,CAAE,GAAGwF,CAAG,EACxD,GAAI,CAACxF,GAAS,CAAC,OAAO,mBAAmBA,EAAM,EAAE,EAAG,MAAO,CAAE,GAAIA,GAASA,EAAM,GAAI,KAAM,QAAS,WAAY,KAAM,UAAW,CAAE,EAClI,MAAMwB,EAAI,aAAe,YAAY,MAAQ,WAAW,EAAI,YAAc,KACpEkE,EAAQ,eAAe,UAAU,kBAAmB,CAAC,CAAC,EAAG1F,EAAM,GAAIwB,IAAM8D,EAAK,KAAK5F,GAAKA,EAAE,KAAO8B,EAAE,EAAE,GAAK,CAAC,GAAG,IAAI,EAClHmE,EAASnE,GAAKA,EAAE,WAAakE,EAAM,OAAOhG,GAAKA,EAAE,OAAS8B,EAAE,YAAc9B,EAAE,SAAW,MAAM,EAAI,CAAC,EAClGkG,EAAOD,EAAO,CAAC,GAAKD,EAAM,CAAC,EACjC,OAAKE,EACE,CAAE,GAAIA,EAAK,GAAI,KAAMD,EAAO,CAAC,EAAI,OAAS,OAAQ,WAAYA,EAAO,CAAC,EAAInE,EAAE,WAAa,KAAM,WAAYA,EAAIA,EAAE,UAAY,GAAK,CAAE,EADzH,CAAE,GAAIxB,EAAM,GAAI,KAAM,QAAS,WAAY,KAAM,UAAW,CAAE,CAElF,CAAC,EACK,CAAC6F,EAASC,CAAU,EAAI,MAAM,SAASP,EAAM,EAAE,EAC/C,CAACQ,EAAMC,CAAO,EAAI,MAAM,SAAST,EAAM,IAAI,EAC3C,CAACU,EAAYC,CAAa,EAAI,MAAM,SAASX,EAAM,UAAU,EAC7D,CAACY,EAAWC,CAAY,EAAI,MAAM,SAASb,EAAM,SAAS,EAC1Dc,EAAWN,IAAS,SAAWI,EAAY,mBAAqB,iBAAmB,EACnF,CAAC3G,EAAS8G,CAAU,EAAI,MAAM,SAAS,IAAM,UAAU,kBAAmB,CAAC,CAAC,CAAC,EAC7E,CAACC,EAAOC,CAAQ,EAAI,MAAM,SAAS,IAAI,EACvC,CAACC,EAAOC,CAAQ,EAAI,MAAM,SAAS,IAAI,EACvC,CAACC,EAAUC,CAAW,EAAI,MAAM,SAAS,IAAI,EAC7C,CAAC,CAAEC,EAAW,EAAI,MAAM,SAAS,CAAC,EAClCC,EAAY,MAAM,OAAO,IAAI,EAC7BC,GAAY,MAAM,OAAO,IAAI,EAC7BC,EAAQ,MAAM,OAAO,IAAI,EAGzB/F,GADM,OAAO,eAAiB,CAAC,GACnB,KAAKvB,GAAKA,EAAE,KAAOmG,CAAO,GAAKR,EAAO,MAClD4B,EAAMhG,EAAQzB,EAAQyB,EAAM,EAAE,EAAI,KAClCiG,GAAU7B,EAAO,OAASpE,GAASA,EAAM,KAAOoE,EAAO,MAAM,GAE7D8B,EAAW,MAAM,OAAO,IAAI,EAkClC,GAjCA,MAAM,UAAU,IAAM,CACpB,GAAI,CAAEA,EAAS,SAAWA,EAAS,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,CAAG,MAAY,CAAC,CACxF,MAAMC,EAASC,GAAM,CAAMA,EAAE,MAAQ,UAAUnC,EAAQ,CAAG,EAC1D,cAAO,iBAAiB,UAAWkC,CAAK,EACjC,IAAM,OAAO,oBAAoB,UAAWA,CAAK,CAC1D,EAAG,CAAC,CAAC,EACL,MAAM,UAAU,IAAM,CACfnG,IAELuF,EAAS,IAAI,EACbI,EAAY,IAAI,EACZE,EAAU,UAASA,EAAU,QAAQ,UAAY,GACvD,EAAG,CAACjB,CAAO,CAAC,EACZ,MAAM,UAAU,IAAM,CACpB,GAAI,CAACY,EAAO,OACZ,MAAMnG,EAAK,WAAW,IAAMoG,EAAS,IAAI,EAAG,IAAI,EAChD,MAAO,IAAM,aAAapG,CAAE,CAC9B,EAAG,CAACmG,CAAK,CAAC,EACV,MAAM,UAAU,IAAM,CACpB,gBAAgB,CAAE,GAAIZ,EAAS,KAAAE,EAAM,WAAAE,EAAY,UAAAE,EAAW,IAAK,WAAW,EAAG,GAAI,KAAK,IAAI,CAAE,CAAC,CACjG,EAAG,CAACN,EAASE,EAAME,EAAYE,CAAS,CAAC,EAEzC,MAAM,UAAU,IAAM,IAAM,CAAM,aAAa,gBAAgB,CAAE,GAAG,YAAa,GAAI,KAAK,IAAI,CAAE,CAAC,CAAG,EAAG,CAAC,CAAC,EAEzG,MAAM,UAAU,IAAM,CACpB,GAAI,CAAClF,GAAS,CAACoF,GAAY7G,EAAQyB,EAAM,EAAE,EAAG,OAC9C,MAAMG,EAAM,CAAE,OAAQ,OAAQ,QAAS,KAAM,KAAM,GAAM,GAAI,KAAK,IAAI,EAAG,IAAK,WAAW,CAAE,EACrFV,EAAO,CAAE,GAAGlB,EAAS,CAACyB,EAAM,EAAE,EAAGG,CAAI,EAC3CkF,EAAW5F,CAAI,EACf,WAAW,kBAAmBA,CAAI,EAClC,cAAcO,EAAM,GAAIG,CAAG,CAC7B,EAAG,CAACyE,EAASQ,CAAQ,CAAC,EAElB,CAACpF,EAAO,OAAO,KAEnB,MAAMqG,EAAM9C,EAAO,CACjB,GAAI,UAAW,QAAS,UAAW,SAAU,UAAW,IAAK,UAAW,KAAM,UAAW,KAAM,UAAW,KAAM,wBAClH,EAAI,CACF,GAAI,UAAW,QAAS,UAAW,SAAU,UAAW,IAAK,UAAW,KAAM,UAAW,KAAM,UAAW,KAAM,oBAClH,EACM+C,EAAQ,UACRrG,EAAW,CAAC,CAAC+F,EACbjC,EAAQ9D,GAAYmF,EACpBmB,EAAW,eAAevG,EAAO+D,CAAK,EACtCyC,GAAa,gBAAgBxG,EAAM,IAAI,EACvCgC,EAAW,cAAchC,EAAM,KAAMJ,CAAI,EACzC6G,GAAYF,EAAW,EAAE,gBAAiB3G,CAAI,EAAIoC,EAClD0E,EAAQ,OAAO,aAAa,IAAI1G,EAAM,IAAI,EAC1CiB,GAAO,aAAajB,CAAK,EACzB2G,GAAgB1F,KAASiD,GAAkB,CAAC,GAAG,KAAK7E,GAAM,OAAOA,CAAE,IAAM,OAAO4B,GAAK,EAAE,CAAC,EACxF2F,GAAW,CAAC,EAAE,OAAO,aAAe,CAAC,GAAG5G,EAAM,IAAI,EAElD6G,EAAO,eAAetI,EAAS6F,EAAO,OAASA,EAAO,MAAM,GAAIpE,EAAM,IAAI,EAAE,OAAOvB,GAAKA,EAAE,KAAOuB,EAAM,EAAE,EAEzG0E,GAAUhF,GAAMmH,EAAK,OAAOpI,GAAKA,EAAE,OAASiB,GAAKjB,EAAE,SAAW,MAAM,EACpEqI,EAAW9B,EAAaN,GAAOM,CAAU,EAAI,CAAC,EAE9CR,GAAYJ,EAAO,OAAS,CAAC7F,EAAQ6F,EAAO,MAAM,EAAE,GAAKA,EAAO,MAAM,KAAOpE,EAAM,GAAKoE,EAAO,MAAQ,KACvG2C,EAAYhD,IAAS+C,EAAS,CAAC,GAAKD,EAAK,CAAC,GAAKrC,KAAa,KAC5DwC,GAAS,IAAM,CACdD,IACD/B,GAAc,CAAC8B,EAAS,QAAQ7B,EAAc,IAAI,EACtDF,EAAQgC,IAAcvC,GAAY,QAAUQ,GAAc8B,EAAS,OAAS,OAAS,MAAM,EAC3F3B,EAAa7G,GAAKA,EAAI,CAAC,EACvBuG,EAAWkC,EAAU,EAAE,EACzB,EACME,GAAYvH,GAAM,CAAE,MAAMjB,EAAIiG,GAAOhF,CAAC,EAAE,CAAC,EAAGuF,EAAcvF,CAAC,EAAOjB,IAAKsG,EAAQ,MAAM,EAAGI,EAAa7G,GAAKA,EAAI,CAAC,EAAGuG,EAAWpG,EAAE,EAAE,EAAK,EACtIyI,GAAc,OAAO,QAAQL,EAAK,OAAOpI,GAAKA,EAAE,SAAW,MAAM,EAAE,OAAO,CAACwE,EAAGxE,KAAQwE,EAAExE,EAAE,IAAI,GAAKwE,EAAExE,EAAE,IAAI,GAAK,GAAK,EAAUwE,GAAM,CAAC,CAAC,CAAC,EAC3I,KAAK,CAACkE,EAAGC,IAAMA,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,EAEvBE,EAAUC,GAAW,CACzB,GAAI/I,EAAQyB,EAAM,EAAE,EAAG,OACvB,IAAIuH,EAAU,GAAOC,EAAO,GAC5B,GAAIF,IAAW,OAAQC,EAAU,aACxBvH,EAAM,SAAW,WAAY,CACpC,MAAMyH,EAAO,KAAK,IAAIH,EAAStH,EAAM,MAAM,EAC3CuH,EAAUE,GAAQzH,EAAM,KAAO,EAC/BwH,EAAO,CAACD,GAAWE,GAAQzH,EAAM,KAAO,GAC1C,MAAOuH,EAAUD,IAAWtH,EAAM,OAElC,MAAMG,EAAM,CAAE,OAAAmH,EAAQ,QAAAC,EAAS,KAAAC,EAAM,GAAI,KAAK,IAAI,EAAG,IAAK,WAAW,CAAE,EACjE/H,EAAO,CAAE,GAAGlB,EAAS,CAACyB,EAAM,EAAE,EAAGG,CAAI,EAC3CkF,EAAW5F,CAAI,EACf,WAAW,kBAAmBA,CAAI,EAClCkG,EAAY3F,EAAM,EAAE,EACpB,GAAI,CAAE,UAAU,SAAW,UAAU,QAAQuH,EAAU,CAAC,GAAI,GAAI,EAAE,EAAI,EAAE,CAAG,MAAY,CAAC,CACxF,cAAcvH,EAAM,GAAIG,CAAG,EAG3B,WAAW,IAAM,CACf,MAAMuH,EAAK7B,EAAU,QAAStD,EAAKuD,GAAU,QAC7C,GAAI,CAAC4B,GAAM,CAACnF,EAAI,OAChB,MAAMoF,EAASpF,EAAG,UAAYmF,EAAG,aAAe,IAChD,GAAIC,EAASD,EAAG,UAAa,GAAI,CAAEA,EAAG,SAAS,CAAE,IAAKC,EAAQ,SAAU,QAAS,CAAC,CAAG,MAAY,CAAED,EAAG,UAAYC,CAAQ,CAC5H,EAAG,GAAG,CACR,EAGMC,GAAQ,SAAY,CACxB,MAAM1F,EAAM,iBACZ,IAAID,EACA,CAAC+D,GAAOA,EAAI,UAAY,KAAM/D,EAAO,EAAE,iBAAkBrC,CAAI,EACxDI,EAAM,SAAW,WAAYiC,EAAO,EAAE,qBAAsBrC,CAAI,EAAE,QAAQ,MAAO,YAAY,KAAK,IAAIoG,EAAI,OAAShG,EAAM,MAAM,EAAGJ,CAAI,CAAC,EAAE,QAAQ,SAAU,UAAUI,EAAM,KAAMJ,CAAI,CAAC,EAC1LqC,EAAO,EAAE+D,EAAI,QAAU,kBAAoB,kBAAmBpG,CAAI,EACvE,MAAMiI,EAAU7H,EAAM,SAAW,OAAS,EAAE,gBAAiBJ,CAAI,EAAIoC,EACrE,IAAI8F,EAAO,KACX,GAAI,CAAEA,EAAO,MAAM,gBAAgB,CAAE,MAAA9H,EAAO,KAAAJ,EAAM,SAAUiI,EAAS,KAAA5F,EAAM,IAAAC,CAAI,CAAC,CAAG,MAAY,CAAC,CAChG,MAAMR,EAAO,EAAE,kBAAmB9B,CAAI,EAAE,QAAQ,UAAW,UAAUI,EAAM,OAAQJ,CAAI,CAAC,EAAI,YAAc,iBAC1G,GAAI,CACF,GAAIkI,EAAM,CACR,MAAMC,EAAO,IAAI,KAAK,CAACD,CAAI,EAAG,QAAU9H,EAAM,GAAK,OAAQ,CAAE,KAAM,WAAY,CAAC,EAChF,GAAI,UAAU,UAAY,UAAU,SAAS,CAAE,MAAO,CAAC+H,CAAI,CAAE,CAAC,EAAG,CAAE,MAAM,UAAU,MAAM,CAAE,MAAO,CAACA,CAAI,EAAG,KAAArG,CAAK,CAAC,EAAG,MAAQ,CAC3H,MAAMxC,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAO,IAAI,gBAAgB4I,CAAI,EAAG5I,EAAE,SAAW6I,EAAK,KAAM7I,EAAE,MAAM,EACpE,WAAW,IAAM,IAAI,gBAAgBA,EAAE,IAAI,EAAG,GAAI,EAClDuG,EAAS,EAAE,kBAAmB7F,CAAI,CAAC,EACnC,MACF,CACA,GAAI,UAAU,MAAO,CAAE,MAAM,UAAU,MAAM,CAAE,KAAA8B,CAAK,CAAC,EAAG,MAAQ,CAChE,MAAM,UAAU,UAAU,UAAUA,CAAI,EAAG+D,EAAS,EAAE,eAAgB7F,CAAI,CAAC,CAC7E,MAAY,CAAC,CACf,EACMoI,GAAa,IAAM,CACvB,MAAMC,EAAK,OAAO,aAAa,OAAOjI,EAAM,IAAI,EAChD4F,GAAYuB,GAAKA,EAAI,CAAC,EACtB1B,EAAS,EAAEwC,EAAK,mBAAqB,qBAAsBrI,CAAI,EAAE,QAAQ,SAAUoC,CAAQ,CAAC,CAC9F,EACMkG,GAAYxI,GAAM,CACtBuE,EAAQ,EACR,WAAW,IAAM,CACf,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,uBAAwB,CAAE,OAAQ,CAAE,KAAMvE,GAAKM,EAAM,KAAM,OAAQ,OAAQ,CAAE,CAAC,CAAC,CAAG,MAAY,CAAC,CAC5I,EAAG,GAAG,CACR,EAEMmI,GAAgB/B,GAAM,CAC1B,MAAMgC,EAAMhC,EAAE,OACd,GAAI,CAACrC,GAAUqE,EAAI,UAAYA,EAAI,QAAQ,cAAc,GAAKA,EAAI,QAAQ,OAAO,GAAK,CAAErC,EAAM,QAAU,KAAM,MAAQ,CACtHA,EAAM,QAAU,CAAE,EAAGK,EAAE,QAAQ,CAAC,EAAE,QAAS,EAAGA,EAAE,QAAQ,CAAC,EAAE,OAAQ,CACrE,EACMiC,GAAcjC,GAAM,CACxB,MAAMkC,EAAKvC,EAAM,QACjB,GAD0BA,EAAM,QAAU,KACtC,CAACuC,EAAI,OACT,MAAMC,EAAKnC,EAAE,eAAe,CAAC,EAAE,QAAUkC,EAAG,EAAGE,EAAKpC,EAAE,eAAe,CAAC,EAAE,QAAUkC,EAAG,EACjFC,EAAK,KAAO,KAAK,IAAIC,CAAE,EAAI,IAAIxB,GAAO,CAC5C,EAGMyB,EACA,CAACzC,GAAOA,EAAI,MAAQlB,IAAS,SAAWA,IAAS,SAAiB,KAClEkB,EAAI,UAAY,KAAa,CAAE,KAAM,EAAE,mBAAoBpG,CAAI,EAAG,MAAO,SAAU,EACnFoG,EAAI,QAAgB,CAAE,KAAM,EAAE,oBAAqBpG,CAAI,EAAG,MAAO0G,CAAM,EACvEN,EAAI,KAAa,CAAE,KAAM,EAAE,mBAAoBpG,CAAI,EAAG,MAAO,SAAU,EACvEI,EAAM,SAAW,MAAc,CAAE,KAAM,EAAE,qBAAsBJ,CAAI,EAAG,MAAO,SAAU,EACpF,CAAE,KAAM,EAAE,oBAAqBA,CAAI,EAAG,MAAO,SAAU,EAE1D8I,GAAS,aAAe1I,EAAM,OAC9B2I,EAAQ1I,EAAW,WAAW1B,CAAO,EAAI,KACzCqK,GAAc,EAAE,qBAAsBhJ,CAAI,EAAE,MAAM,GAAG,EACrDiJ,GAAYC,GAAQ,CACxB,MAAMC,EAAOzD,GAAgB,KAAK,OAAOtF,EAAM,IAAMA,EAAM,KAAO,EAAIA,EAAM,IAAI,EAAIA,EAAM,KAAOA,EAAM,KAAO,EAC9GuF,EAAS,KAAK,IAAIvF,EAAM,IAAK,KAAK,IAAIA,EAAM,IAAK+I,EAAOD,EAAM9I,EAAM,IAAI,CAAC,CAAC,CAC5E,EAGMgJ,GAAgB,IAEpB,oBAAC,OAAI,IAAKhJ,EAAM,GAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,GAAI,UAAW,EAAG,GAC3FA,EAAM,QAAQ,IAAI,CAACiJ,EAAGpI,IAAM,CAC3B,MAAMqI,EAAQrI,IAAMb,EAAM,OACpBmJ,EAASnD,GAAOA,EAAI,SAAWnF,EACrC,IAAIuI,EAAS/C,EAAI,KAAMgD,EAAKhD,EAAI,QAASiD,EAAQ,KACjD,OAAIrJ,IACEiJ,GACFE,EAASpJ,EAAM,SAAW,MAAQ,UAAYsG,EAC9C+C,EAAKrJ,EAAM,SAAW,MAAQ,uBAAyB,uBACvDsJ,EAAQtJ,EAAM,SAAW,MAAQ,EAAE,mBAAoBJ,CAAI,EAAI,KACtDuJ,IACTC,EAAS/C,EAAI,KACbiD,EAAQ,EAAE,mBAAoB1J,CAAI,IAIpC,oBAAC,UAAO,IAAKiB,EAAG,KAAK,SAAS,SAAUZ,EAAU,QAAS,IAAMoH,EAAOxG,CAAC,EAAG,MAAO,CACjF,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,MAAO,OAAQ,UAAW,GAAI,QAAS,YACvF,UAAW,OAAQ,aAAc,GAAI,OAAQZ,EAAW,UAAY,UACpE,WAAYoJ,EAAI,OAAQ,eAAeD,CAAM,GAAI,MAAO/C,EAAI,IAC5D,WAAY,iCAAkC,WAAY,IAAK,SAAU,KAAM,WAAY,KAC3F,UAAWpG,GAAqBsD,EAAV,OAA0B,6BAChD,QAAStD,GAAY,CAACiJ,GAAS,CAACC,EAAS,IAAO,EAChD,WAAY,+CACd,GACE,oBAAC,QAAK,MAAO,CAAE,KAAM,CAAE,GAAI,UAAUF,EAAGrJ,CAAI,CAAE,EAC7C0J,GACC,oBAAC,QAAK,MAAO,CACX,KAAM,WAAY,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAC1F,cAAe,GAAK,MAAOJ,EAASlJ,EAAM,SAAW,MAAQ,UAAYsG,EAASD,EAAI,IACxF,GAAIiD,CAAM,CAEd,CAEJ,CAAC,CACH,EAGIC,GAAU,CAACT,EAAKU,IACpB,oBAAC,UAAO,KAAK,SAAS,QAAS,IAAMX,GAASC,CAAG,EAAG,aAAYU,EAAO,MAAO,CAC5E,KAAM,WAAY,MAAO,GAAI,OAAQ,GAAI,aAAc,GAAI,OAAQ,UACnE,WAAYnD,EAAI,QAAS,OAAQ,eAAeA,EAAI,IAAI,GAAI,MAAOA,EAAI,IACvE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,CAC1F,GAAIyC,EAAM,EAAI,IAAM,GAAI,EAEpBW,GAAiB,IAAM,CAC3B,MAAMxL,EAAMgC,EAAY+F,EAAI,SAAW,OAAS,KAAOA,EAAI,OAAUV,EAC/DoE,EAAOvC,IAAQA,EAAInH,EAAM,MAAQA,EAAM,IAAMA,EAAM,KAAQ,IACjE,OACE,oBAAC,OAAI,MAAO,CAAE,UAAW,EAAG,GAC1B,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,IAAK,EAAG,GACpF,CAACC,GAAYsJ,GAAQ,GAAI,EAAE,sBAAuB3J,CAAI,CAAC,EACxD,oBAAC,OAAI,MAAO,CAAE,UAAW,SAAU,SAAU,GAAI,GAC/C,oBAAC,QAAK,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,MAAOyG,EAAI,IAAK,cAAe,SAAU,GACjIpI,GAAO,KAAO,IAAM,YAAYA,EAAK2B,CAAI,CAC5C,EACA,oBAAC,QAAK,MAAO,CAAE,QAAS,QAAS,WAAY,iCAAkC,SAAU,GAAI,MAAOyG,EAAI,KAAM,UAAW,EAAG,GAAI,UAAUrG,EAAM,KAAMJ,CAAI,CAAE,CAC9J,EACC,CAACK,GAAYsJ,GAAQ,EAAG,EAAE,sBAAuB3J,CAAI,CAAC,CACzD,EACA,oBAAC,OAAI,MAAO,CAAE,SAAU,WAAY,UAAW,GAAI,QAAS,OAAQ,GAClE,oBAAC,SAAM,KAAK,QAAQ,IAAKI,EAAM,IAAK,IAAKA,EAAM,IAAK,KAAMA,EAAM,KAC9D,MAAO/B,GAAc+B,EAAM,IAAW,SAAUC,EAChD,SAAWmG,GAAMb,EAAS,OAAOa,EAAE,OAAO,KAAK,CAAC,EAChD,aAAY,UAAUpG,EAAM,SAAUJ,CAAI,EAAI,KAAO,UAAUI,EAAM,KAAMJ,CAAI,EAAI,IACnF,UAAU,cACV,MAAO,CAAE,MAAO,OAAQ,YAAa,UAAW,OAAQ,GAAI,QAASK,EAAW,GAAOhC,GAAO,KAAO,IAAO,CAAG,EAAG,EACnHgC,GACC,oBAAC,OAAI,cAAY,OAAO,MAAO,CAC7B,SAAU,WAAY,IAAK,GAAI,OAAQ,GAAI,KAAM,QAAQyJ,EAAI1J,EAAM,MAAM,CAAC,MAAO,MAAO,EAAG,WAAY,KACvG,WAAYsG,EAAO,aAAc,CACnC,EAAG,EAEL,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,eAAgB,gBAAiB,WAAY,4BAA6B,SAAU,GAAI,MAAOD,EAAI,IAAK,GACrI,oBAAC,YAAM,YAAYrG,EAAM,IAAKJ,CAAI,CAAE,EAAO,oBAAC,YAAM,YAAYI,EAAM,IAAKJ,CAAI,CAAE,CACjF,CACF,EACC,CAACK,GAAYqF,GAAS,MACrB,oBAAC,OAAI,MAAO,CAAE,UAAW,EAAG,UAAW,SAAU,WAAY,iCAAkC,SAAU,GAAI,MAAOe,EAAI,IAAK,GAAI,EAAE,sBAAuBzG,CAAI,CAAE,EAEjK,CAACK,GACA,oBAAC,UAAO,KAAK,SAAS,SAAUqF,GAAS,KAAM,QAAS,IAAM+B,EAAO/B,CAAK,EAAG,MAAO,CAClF,UAAW,GAAI,MAAO,OAAQ,UAAW,GAAI,aAAc,GAAI,OAAQ,OAAQ,OAAQA,GAAS,KAAO,cAAgB,UACvH,WAAY,UAAW,MAAO,OAAQ,UAAWA,GAAS,KAAO,OAAS,kBAAmB,QAASA,GAAS,KAAO,GAAM,EAC5H,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAC1E,GAAI,EAAE,qBAAsB1F,CAAI,CAAE,CAEtC,CAEJ,EAEM+J,GAAa,IAAM,CACvB,GAAI,CAAC3D,GAAOA,EAAI,MAAQZ,EAAU,OAAO,KACzC,IAAIwE,EAAM,KACV,OAAI5J,EAAM,SAAW,WACnB4J,EAAM5D,EAAI,SAAW,OACjB,EAAE,mBAAoBpG,CAAI,EAAE,QAAQ,MAAO,UAAUI,EAAM,YAAaJ,CAAI,CAAC,EAC7E,EAAE,qBAAsBA,CAAI,EAAE,QAAQ,QAAS,YAAYoG,EAAI,OAAQpG,CAAI,CAAC,EAAE,QAAQ,SAAU,UAAUI,EAAM,YAAaJ,CAAI,CAAC,EAC7HI,EAAM,SAAW,MAC1B4J,EAAM5D,EAAI,QAAU,KAAO,EAAE,gBAAiBpG,CAAI,EAAE,QAAQ,MAAO,UAAUI,EAAM,QAAQA,EAAM,MAAM,EAAGJ,CAAI,CAAC,EACtGI,EAAM,SAAW,SAC1B4J,EAAM5D,EAAI,QAAU,KAAO,EAAE,mBAAoBpG,CAAI,EAAE,QAAQ,MAAOoC,CAAQ,GAEzE4H,EAAM,oBAAC,OAAI,MAAO,CAAE,WAAY,iCAAkC,SAAU,GAAI,MAAOvD,EAAI,KAAM,aAAc,CAAE,GAAIuD,CAAI,EAAS,IAC3I,EAEMC,EAAe,CAACC,EAAKC,IACzB,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,cAAe,IAAK,cAAe,YAAa,MAAO1D,EAAI,KAAM,GAAG0D,CAAM,GAAID,CAAI,EAG9K,OACE,oBAAC,OAAI,KAAK,SAAS,aAAW,OAAO,aAAY,EAAE,eAAgBlK,CAAI,EAAG,UAAU,iBAClF,aAAcuI,GAAc,WAAYE,GAAY,MAAO,CAC3D,SAAU,WAAY,MAAO,EAAG,OAAQ,KAAM,WAAYhC,EAAI,GAAI,MAAOA,EAAI,IAC7E,QAAS,OAAQ,cAAe,QAClC,GACE,oBAAC,OAAI,IAAKR,EAAW,MAAO,CAAE,KAAM,EAAG,UAAW,OAAQ,wBAAyB,QAAS,mBAAoB,SAAU,GACxH,oBAAC,OAAI,IAAK7F,EAAM,GAAI,UAAW8E,IAAS,OAAS,gBAAkB,QAEnE,oBAAC,OAAI,MAAO,CAAE,SAAU,WAAY,OAAQ,IAAK,KAAM,WAAY,WAAY,QAAQ,CAAE,IAAK,KAAM,KAAM,kBAAmB,CAAC,EAAG,SAAU,QAAS,GAClJ,oBAAC,OAAI,cAAY,OAAO,MAAO,CAAE,SAAU,WAAY,MAAO,EAAG,WAAY,QAAQ0B,EAAU,EAAG,QAASD,EAAW,EAAI,EAAG,WAAY,kBAAmB,EAAG,EAC9JA,GACC,oBAAC,OAAI,cAAY,OAAO,MAAO,CAAE,SAAU,WAAY,MAAO,EAAG,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,MAAO,uBAAwB,WAAY,qBAAsB,WAAY,IAAK,SAAU,EAAG,GAAG,GAAC,EAEvO,oBAAC,OAAI,cAAY,OAAO,MAAO,CAAE,SAAU,WAAY,MAAO,EAAG,WAAY,8FAA+F,EAAG,EAC/K,oBAAC,UAAO,IAAKL,EAAU,KAAK,SAAS,QAASjC,EAAS,aAAY,EAAE,cAAerE,CAAI,EAAG,MAAO,CAChG,SAAU,WAAY,IAAK,6CAA8C,MAAO,GAAI,MAAO,GAAI,OAAQ,GAAI,aAAc,MACzH,OAAQ,OAAQ,WAAY,qBAAsB,MAAO,OAAQ,SAAU,GAAI,WAAY,EAAG,OAAQ,UACtG,eAAgB,YAAa,qBAAsB,WACrD,GAAG,GAAC,EACJ,oBAAC,OAAI,MAAO,CAAE,SAAU,WAAY,KAAM,GAAI,MAAO,GAAI,OAAQ,GAAI,MAAO,MAAO,GACjF,oBAAC,OAAI,MAAO,CAAE,WAAY,0CAA2C,WAAY,IAAK,SAAU,GAAI,cAAe,QAAS,cAAe,YAAa,QAAS,EAAI,GAClKkF,IAAS,SAAW,EAAE,uBAAwBlF,CAAI,EAAIqG,IAAWnB,IAAS,QAAU,EAAE,eAAgBlF,CAAI,EAAIkF,IAAS,OAAS,EAAE,sBAAuBlF,CAAI,EAAI,EAAE,oBAAqBA,CAAI,CAC/L,EACA,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,KAAM,cAAe,UAAW,UAAW,CAAE,GAChJ6G,EACH,CACF,EACCgC,GACC,oBAAC,OAAI,UAAW/C,IAAa1F,EAAM,GAAK,iBAAmB,OAAW,MAAO,CAC3E,SAAU,WAAY,MAAO,GAAI,OAAQ,GAAI,UAAW,gBACxD,QAAS,eAAgB,aAAc,GAAI,OAAQ,eAAeyI,EAAM,KAAK,GAAI,MAAOA,EAAM,MAC9F,WAAY,yBAA0B,UAAW,8BAA+B,UAAW,QAC7F,GACE,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,cAAe,IAAK,cAAe,YAAa,WAAY,CAAE,GAAIA,EAAM,IAAK,CACzK,CAEJ,EAEA,oBAAC,OAAI,YAAU,SAAS,MAAO,CAAE,SAAU,WAAY,MAAO,EAAG,OAAQ,EAAG,SAAU,SAAU,KAAM,eAAgB,GACnHA,GAAS/C,IAAa1F,EAAM,GAAKyI,EAAM,KAAO,EACjD,EAEA,oBAAC,OAAI,MAAO,CAAE,QAAS,eAAgB,GAEpC,CAACrD,GAAa,wCACf,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,cAAe,IAAK,cAAe,YAAa,MAAO,SAAU,GACxJ,EAAEsD,GAAQ9I,CAAI,CACjB,EACA,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,IAAK,UAAW,CAAE,GACrH,UAAUI,EAAM,SAAUJ,CAAI,CACjC,EACCI,EAAM,SAAW,WAAayJ,GAAe,EAAIT,GAAc,CAChE,EACC,CAAC/I,GAAY,CAACmF,GACb,oBAAC,UAAO,KAAK,SAAS,QAAS,IAAMiC,EAAO,MAAM,EAAG,MAAO,CAC1D,QAAS,QAAS,OAAQ,cAAe,UAAW,GAAI,QAAS,SAAU,OAAQ,OAAQ,WAAY,cACvG,MAAOhB,EAAI,KAAM,OAAQ,UAAW,WAAY,iCAAkC,WAAY,IAAK,SAAU,GAC7G,eAAgB,YAAa,oBAAqB,CACpD,GAAI,EAAE,aAAczG,CAAI,CAAE,EAI3BmE,GAASe,IAAS,SACjB,oBAAC,OAAI,IAAKgB,GAAW,UAAWV,EAAW,OAAY,kBAAmB,MAAO,CAAE,UAAWA,EAAW,EAAI,GAAI,gBAAiB,EAAG,GAClIuE,GAAW,EACZ,oBAAC,MAAG,MAAO,CAAE,OAAQ,UAAW,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,KAAM,cAAe,SAAU,GACpJ,UAAU3J,EAAM,MAAOJ,CAAI,CAC9B,EACA,oBAAC,KAAE,KAAMA,EAAM,MAAO,CACpB,OAAQ,WAAY,WAAY,iCAAkC,WAAY,IAAK,SAAU,GAAI,WAAY,IAAK,MAAOyG,EAAI,IAC7H,UAAW,UAAW,QAAS,OAAQ,cAAe,MACxD,GAAI,UAAUrG,EAAM,KAAMJ,CAAI,CAAE,EAC/BI,EAAM,QACL,oBAAC,OAAI,MAAO,CAAE,UAAW,EAAG,WAAY,0CAA2C,SAAU,GAAI,cAAe,SAAU,MAAOqG,EAAI,IAAK,GACvI,EAAE,eAAgBzG,CAAI,EAAE,KAAGI,EAAM,MACpC,EAED2G,IACC,oBAAC,OAAI,MAAO,CAAE,UAAW,GAAI,WAAY,iCAAkC,WAAY,IAAK,SAAU,GAAI,MAAOL,CAAM,GAAI,EAAE,kBAAmB1G,CAAI,CAAE,EAGxJ,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,GAAI,UAAW,EAAG,GACpD,oBAAC,UAAO,KAAK,SAAS,QAASoI,GAAY,eAActB,EAAO,MAAO,CACrE,KAAM,EAAG,UAAW,GAAI,aAAc,GAAI,OAAQ,UAClD,WAAYA,EAAQ,uBAAyB,cAAe,OAAQ,eAAeA,EAAQ,UAAYL,EAAI,IAAI,GAC/G,MAAOK,EAAQ,UAAYL,EAAI,IAAK,WAAY,gCAAiC,WAAY,IAAK,SAAU,IAC9G,GAAIK,EAAQ,KAAO,EAAE,cAAe9G,CAAI,EAAI,KAAO,EAAE,aAAcA,CAAI,CAAE,EACzE,oBAAC,UAAO,KAAK,SAAS,QAASgI,GAAO,MAAO,CAC3C,KAAM,WAAY,UAAW,GAAI,QAAS,SAAU,aAAc,GAAI,OAAQ,UAC9E,WAAY,cAAe,OAAQ,eAAevB,EAAI,IAAI,GAAI,MAAOA,EAAI,IACzE,WAAY,gCAAiC,WAAY,IAAK,SAAU,IAC1E,GAAI,EAAE,cAAezG,CAAI,CAAE,CAC7B,EAECgH,IACC,oBAAC,UAAO,KAAK,SAAS,QAAS,IAAMsB,GAAS,EAAG,MAAO,CACtD,UAAW,GAAI,MAAO,OAAQ,UAAW,GAAI,aAAc,GAAI,OAAQ,UACvE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,IAAK,GACtE,WAAY7B,EAAI,QAAS,OAAQ,oBAAqB,MAAO,UAC7D,WAAY,gCAAiC,WAAY,IAAK,SAAU,IAC1E,GACE,oBAAC,QAAK,cAAY,OAAO,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,aAAc,EAAG,KAAM,WAAY,WAAY,QAAQG,EAAU,CAAE,EAAG,EAC9H,EAAE,aAAc5G,CAAI,EAAE,QAAQ,SAAUoC,CAAQ,EAAE,IACrD,EAID2G,GACC,oBAAC,OAAI,MAAO,CAAE,UAAW,GAAI,QAAS,YAAa,aAAc,GAAI,WAAYtC,EAAI,QAAS,GAC3FwD,EAAa,EAAE,mBAAoBjK,CAAI,CAAC,EACzC,oBAAC,OAAI,KAAK,MAAM,aAAY,EAAE,kBAAmBA,CAAI,EAAE,QAAQ,MAAO+I,EAAM,KAAK,OAAO,OAAO,EAAE,MAAM,EAAG,MAAO,CAAE,QAAS,OAAQ,eAAgB,gBAAiB,UAAW,EAAG,GAChLA,EAAM,KAAK,IAAI,CAACV,EAAIpH,IACnB,oBAAC,OAAI,IAAKA,EAAG,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,WAAY,SAAU,IAAK,CAAE,GAC3F,oBAAC,QAAK,cAAY,OAAO,MAAO,CAC9B,MAAO,GAAI,OAAQ,GAAI,aAAc,MACrC,WAAYoH,EAAK,UAAY,cAC7B,OAAQA,EAAK,OAAS,OAAOpH,EAAI8H,EAAM,SAAW,SAAW,OAAO,IAAItC,EAAI,IAAI,GAChF,UAAW4B,EAAK,kBAAoB,OACpC,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,MAAO,UAAW,WAAY,IAAK,SAAU,EAChH,GAAIA,EAAK,IAAM,EAAG,EAClB,oBAAC,QAAK,MAAO,CAAE,WAAY,4BAA6B,SAAU,KAAM,MAAOpH,IAAM8H,EAAM,SAAWtC,EAAI,IAAMA,EAAI,KAAM,WAAYxF,IAAM8H,EAAM,SAAW,IAAM,GAAI,GAAIC,GAAY/H,CAAC,CAAE,CAC5L,CACD,CACH,EACA,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,EAAG,UAAW,EAAG,GAClD,CACC,CAAC8H,EAAM,OAAQ,EAAE,qBAAsB/I,CAAI,CAAC,EAC5C,CAAC+I,EAAM,MAAQ,KAAO,IAAMA,EAAM,KAAO,KAAM,EAAE,mBAAoB/I,CAAI,CAAC,EAC1E,CAAC+I,EAAM,OAAQ,EAAE,qBAAsB/I,CAAI,CAAC,CAC9C,EAAE,IAAI,CAAC,CAACtB,EAAG,CAAC,IACV,oBAAC,OAAI,IAAK,EAAG,MAAO,CAAE,KAAM,EAAG,UAAW,QAAS,GACjD,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAAG,GAAIA,CAAE,EAC/F,oBAAC,OAAI,MAAO,CAAE,WAAY,iCAAkC,SAAU,GAAI,MAAO+H,EAAI,KAAM,UAAW,CAAE,GAAI,CAAE,CAChH,CACD,CACH,CACF,CAEJ,CAGJ,EAECa,GAAY,OAAS,GACpB,oBAAC,OAAI,MAAO,CAAE,QAAS,UAAW,GAChC,oBAAC,OAAI,MAAO,CAAE,QAAS,QAAS,GAAI2C,EAAa,EAAE,qBAAsBjK,CAAI,CAAC,CAAE,EAChF,oBAAC,OAAI,UAAU,cAAc,MAAO,CAAE,QAAS,OAAQ,IAAK,EAAG,UAAW,OAAQ,QAAS,gBAAiB,eAAgB,MAAO,GAChIoF,GACC,oBAAC,UAAO,KAAK,SAAS,QAAS,IAAMC,EAAc,IAAI,EAAG,MAAO,CAC/D,KAAM,WAAY,UAAW,GAAI,QAAS,SAAU,aAAc,IAAK,OAAQ,UAC/E,WAAY,cAAe,OAAQ,eAAeoB,EAAI,IAAI,GAAI,MAAOA,EAAI,KACzE,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAC1E,GAAI,EAAE,mBAAoBzG,CAAI,CAAE,EAEjCsH,GAAY,IAAI,CAAC,CAACxH,EAAGpB,CAAC,IAAM,CAC3B,MAAM2J,EAAKjD,IAAetF,EAC1B,OACE,oBAAC,UAAO,IAAKA,EAAG,KAAK,SAAS,eAAcuI,EAAI,QAAS,IAAMhB,GAASvH,CAAC,EAAG,MAAO,CACjF,KAAM,WAAY,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,UAAW,GAAI,QAAS,mBAAoB,aAAc,IAAK,OAAQ,UACxI,WAAYuI,EAAK,uBAAyB5B,EAAI,QAAS,OAAQ,eAAe4B,EAAK,UAAY5B,EAAI,IAAI,GAAI,MAAO4B,EAAK,UAAY5B,EAAI,IACvI,WAAY,gCAAiC,WAAY,IAAK,SAAU,GAAI,WAAY,QAC1F,GACE,oBAAC,QAAK,cAAY,OAAO,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,aAAc,MAAO,WAAY,QAAQ,gBAAgB3G,CAAC,CAAC,EAAG,KAAM,UAAW,EAAG,EAC1I,cAAcA,EAAGE,CAAI,EACtB,oBAAC,QAAK,MAAO,CAAE,WAAY,4BAA6B,SAAU,GAAI,WAAY,IAAK,MAAOqI,EAAK,UAAY5B,EAAI,IAAK,GAAI/H,CAAE,CAChI,CAEJ,CAAC,CACH,CACF,EAED,OAAO,aAAa,KAAK,EAAE,OAAS,GACnC,oBAAC,OAAI,MAAO,CAAE,QAAS,aAAc,GAClCuL,EAAa,EAAE,mBAAoBjK,CAAI,CAAC,EACzC,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,EAAG,UAAW,EAAG,GACpE,OAAO,aAAa,KAAK,EAAE,OAAOF,IAAM,OAAO,aAAe,CAAC,GAAGA,CAAC,CAAC,EAAE,IAAIA,GACzE,oBAAC,UAAO,IAAKA,EAAG,KAAK,SAAS,QAAS,IAAMwI,GAASxI,CAAC,EAAG,MAAO,CAC/D,UAAW,GAAI,QAAS,SAAU,aAAc,IAAK,OAAQ,UAC7D,WAAY2G,EAAI,QAAS,OAAQ,eAAeA,EAAI,IAAI,GAAI,MAAOA,EAAI,IACvE,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAC1E,GAAG,KAAG,cAAc3G,EAAGE,CAAI,CAAE,CAC9B,CACH,CACF,EAEF,oBAAC,OAAI,MAAO,CAAE,QAAS,qDAAqDmE,EAAQ,IAAM,EAAE,MAAO,UAAW,SAAU,WAAY,iCAAkC,SAAU,GAAI,MAAOsC,EAAI,IAAK,GAEjMtC,GAAS,CAACgD,GACT,oBAAC,OAAI,MAAO,CAAE,QAAS,YAAa,aAAc,GAAI,WAAYV,EAAI,SAAU,MAAOA,EAAI,IAAK,UAAW,QAAS,GAClH,oBAAC,OAAI,MAAO,CAAE,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAAG,GAAI,EAAE,iBAAkBzG,CAAI,CAAE,EACvH,oBAAC,UAAO,KAAK,SAAS,QAASqE,EAAS,MAAO,CAC7C,UAAW,GAAI,MAAO,OAAQ,UAAW,GAAI,aAAc,GAAI,OAAQ,OAAQ,OAAQ,UACvF,WAAY,UAAW,MAAO,OAAQ,UAAW,kBACjD,WAAY,gCAAiC,WAAY,IAAK,SAAU,EAC1E,GAAI,EAAE,oBAAqBrE,CAAI,CAAE,CACnC,CAEJ,CACA,CACF,EAGCmE,GAASgD,GACR,oBAAC,OAAI,MAAO,CACV,SAAU,WAAY,KAAM,EAAG,MAAO,EAAG,OAAQ,EAAG,OAAQ,EAC5D,QAAS,0DACT,WAAY,2BAA2BxD,EAAO,mBAAqB,qBAAqB,QAAQ8C,EAAI,EAAE,OACxG,GACE,oBAAC,UAAO,KAAK,SAAS,QAASW,GAAQ,MAAO,CAC5C,MAAO,OAAQ,UAAW,GAAI,aAAc,GAAI,OAAQ,OAAQ,OAAQ,UACxE,WAAY,UAAW,MAAO,OAAQ,UAAW,kBACjD,WAAY,gCAAiC,WAAY,IAAK,SAAU,KACxE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,IAAK,EACxE,GACG,EAAE,aAAcpH,CAAI,EACrB,oBAAC,QAAK,MAAO,CAAE,WAAY,4BAA6B,WAAY,IAAK,SAAU,KAAM,cAAe,SAAU,cAAe,YAAa,QAAS,GAAK,GACzJ,eAAemH,EAAW,EAAK,EAAI,EAAE,gBAAiBnH,CAAI,EAAI,cAAcmH,EAAU,KAAMnH,CAAI,CACnG,EACA,oBAAC,QAAK,cAAY,QAAO,GAAC,CAC5B,CACF,EAGD4F,GACC,oBAAC,OAAI,KAAK,SAAS,MAAO,CACxB,SAAU,WAAY,KAAM,GAAI,MAAO,GAAI,OAAQ,gDAAiD,OAAQ,EAC5G,QAAS,YAAa,aAAc,GAAI,WAAYjC,EAAO,UAAY,UAAW,MAAOA,EAAO,UAAY,UAC5G,WAAY,iCAAkC,WAAY,IAAK,SAAU,KAAM,UAAW,SAC1F,UAAW,8BACb,GAAIiC,CAAM,CAEd,CAEJ",
  "names": ["key", "fallback", "v", "val", "ts", "d", "day", "all", "n", "answers", "iso", "s", "byDate", "reserve", "pool", "planned", "fresh", "today", "past", "off", "a", "k", "p", "id", "collectedCount", "city", "l", "next", "c", "field", "lang", "w", "grad", "g", "story", "answered", "f", "rec", "rows", "local", "onServer", "r", "ch", "todayId", "lastCity", "mix", "h", "i", "b", "out", "last", "fact", "paid", "list", "days", "monday", "week", "guessed", "right", "ctx", "text", "maxW", "words", "lines", "cur", "test", "cityName", "line", "url", "W", "H", "P", "cv", "el", "now", "ev", "ms", "map", "pos", "visible", "onOpen", "st", "ML", "m", "at", "done", "allRead", "wasHidden", "name", "dark", "onHide", "hide", "kicker", "ink", "ink3", "open", "setOpen", "shown", "theme", "onClose", "collectedFacts", "startId", "lineup", "all0", "start", "r0", "todayOpen", "order", "inCity", "pick", "storyId", "setStoryId", "mode", "setMode", "cityFilter", "setCityFilter", "feedCount", "setFeedCount", "readMode", "setAnswers", "guess", "setGuess", "toast", "setToast", "stampFor", "setStampFor", "setWishTick", "scrollRef", "resultRef", "swipe", "res", "isToday", "closeRef", "onKey", "e", "tok", "GREEN", "hideCity", "realVisual", "shownCity", "saved", "factCollected", "hasIntro", "feed", "cityPool", "nextStory", "goNext", "pickCity", "cityChoices", "x", "y", "commit", "choice", "correct", "near", "diff", "sc", "target", "share", "imgCity", "blob", "file", "toggleWish", "on", "openCity", "onTouchStart", "tgt", "onTouchEnd", "s0", "dx", "dy", "stamp", "fmtKey", "stats", "weekLetters", "fineStep", "dir", "base", "renderOptions", "o", "isAns", "isMine", "border", "bg", "badge", "stepBtn", "label", "renderEstimate", "pct", "resultLine", "sub", "sectionLabel", "txt", "extra"]
}
