{
  "version": 3,
  "sources": ["/cdn/shop/t/91/assets/florame-home-address-controller.js?florame_home=20260820-delivery-refresh-v411"],
  "sourcesContent": ["/**\n * Florame CAP & Stock System - INLINE MODULE v31.0\n * Based on UNIFIED CAP LOGIC provided.\n * Features: Session Tokens, Robust Autocomplete, Backend Validation.\n */\n(function () {\n    const CONFIG = {\n        stockEndpoint: \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/getStockByCap\",\n        addressAutocomplete: \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/addressAutocomplete\",\n        addressResolve: \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/addressResolve\",\n        partnerDirectoryEndpoint: \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/portalPublicPartnerDirectoryV1\",\n        coverageWaitlistEndpoint: \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/collectCoverageWaitlist\",\n        privacyUrl: \"/policies/privacy-policy\",\n        capValidityMs: 2 * 60 * 60 * 1000 // 2 hours\n    };\n    \n    const STORAGE_KEY = 'florame_cap_state';\n    const ADDR_CACHE_KEY = 'florame_last_address';\n    const $ = (id) => document.getElementById(id);\n\n    function __partnerSlug(value) {\n        return String(value || '')\n            .trim()\n            .toLowerCase()\n            .normalize('NFD')\n            .replace(/[\\u0300-\\u036f]/g, '')\n            .replace(/[^a-z0-9]+/g, '-')\n            .replace(/^-+|-+$/g, '');\n    }\n\n    function __requestedPartnerSlug() {\n        try {\n            const params = new URLSearchParams(window.location.search || '');\n            const explicit = __partnerSlug(params.get('partner') || params.get('partnerSlug') || '');\n            if (explicit) return explicit;\n        } catch (_) {}\n        try {\n            const contextual = __partnerSlug(window.FloramePartner?.getAttributionMeta?.()?.partnerSlug || '');\n            if (contextual) return contextual;\n        } catch (_) {}\n        try {\n            const partner = window.__floramePartner || {};\n            const resolved = __partnerSlug(partner.portal?.partnerSlug || partner.partnerSlug || partner.slug || partner.partnerId || '');\n            if (resolved) return resolved;\n        } catch (_) {}\n        try {\n            return __partnerSlug(JSON.parse(sessionStorage.getItem('florame_partner_context_v2') || 'null')?.slug || '');\n        } catch (_) {\n            return '';\n        }\n    }\n\n    function __stockEndpointUrl(cap, meta = {}) {\n        const url = new URL(CONFIG.stockEndpoint, window.location.origin);\n        url.searchParams.set('cap', String(cap || ''));\n        const lat = Number(meta.lat);\n        const lng = Number(meta.lng);\n        if (Number.isFinite(lat) && Number.isFinite(lng)) {\n            url.searchParams.set('lat', String(lat));\n            url.searchParams.set('lng', String(lng));\n        }\n        const requestedPartner = __requestedPartnerSlug();\n        if (requestedPartner) url.searchParams.set('partnerSlug', requestedPartner);\n        return url.toString();\n    }\n\n    function __partnerAssignmentFromResponse(data) {\n        const requestedPartner = __requestedPartnerSlug();\n        const partner = data && data.partner && typeof data.partner === 'object' ? data.partner : null;\n        const matchedPartner = __partnerSlug(partner?.partnerSlug || partner?.partnerId || '');\n        const assignmentSource = String(partner?.source || (requestedPartner && matchedPartner === requestedPartner ? 'partner_slug' : '')).trim();\n        const currentPartner = window.__floramePartner || {};\n        const requestedAliases = new Set([\n            requestedPartner,\n            __partnerSlug(currentPartner.portal?.partnerSlug || ''),\n            __partnerSlug(currentPartner.partnerSlug || ''),\n            __partnerSlug(currentPartner.slug || ''),\n            __partnerSlug(currentPartner.partnerId || ''),\n            __partnerSlug(currentPartner.id || '')\n        ].filter(Boolean));\n        const matchedAliases = [\n            matchedPartner,\n            __partnerSlug(partner?.partnerId || ''),\n            __partnerSlug(partner?.id || '')\n        ].filter(Boolean);\n        const isRequestedPartner = matchedAliases.some((alias) => requestedAliases.has(alias));\n        const partnerCoverage = !requestedPartner\n            ? (data?.covered !== false)\n            : !!(\n                data?.covered !== false\n                && (assignmentSource === 'partner_slug' || isRequestedPartner)\n                && assignmentSource !== 'cap_fallback'\n            );\n        return {\n            requestedPartner: requestedPartner || '',\n            requestedPartnerSlug: requestedPartner || '',\n            matchedPartner: matchedPartner || '',\n            matchedPartnerSlug: matchedPartner || '',\n            matchedPartnerName: String(partner?.name || '').trim(),\n            assignedPartnerSlug: partnerCoverage ? (matchedPartner || '') : '',\n            assignmentSource,\n            partnerCoverage,\n            selectedPartnerCovered: partnerCoverage,\n            coverageState: requestedPartner\n                ? (partnerCoverage ? 'covered' : 'uncovered')\n                : 'covered',\n            globalCovered: data?.covered !== false\n        };\n    }\n\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // \uD83D\uDCCD address_attempts logging (parit\u00E0 con AWI/Home Init)\n    // Cloud Function: logAddressAttempt -> Firestore collection: address_attempts\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const LOG_ATTEMPT_ENDPOINT = \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/logAddressAttempt\";\n    const SESSION_ID_KEY = 'florame_cap_session_id';\n\n    function __getSessionId() {\n        try {\n            const existing = localStorage.getItem(SESSION_ID_KEY);\n            if (existing) return existing;\n            const sid = (window.crypto && typeof window.crypto.randomUUID === 'function')\n                ? window.crypto.randomUUID()\n                : ('sid_' + Math.random().toString(16).slice(2) + Date.now().toString(16));\n            localStorage.setItem(SESSION_ID_KEY, sid);\n            return sid;\n        } catch (_) {\n            return 'sid_' + Math.random().toString(16).slice(2);\n        }\n    }\n\n    function __newAddressAttemptId(prefix) {\n        try {\n            const id = (window.crypto && typeof window.crypto.randomUUID === 'function')\n                ? window.crypto.randomUUID()\n                : (Date.now().toString(36) + '_' + Math.random().toString(36).slice(2));\n            return String(prefix || 'address_attempt') + '_' + id;\n        } catch (_) {\n            return String(prefix || 'address_attempt') + '_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2);\n        }\n    }\n\n    function __addressAttemptPageMeta() {\n        try {\n            let tz = '';\n            try { tz = Intl.DateTimeFormat().resolvedOptions().timeZone || ''; } catch (_) {}\n            return {\n                page: String((window.location && window.location.href) || '').slice(0, 1000),\n                referrer: String(document.referrer || '').slice(0, 1000),\n                locale: String((document.documentElement && document.documentElement.lang) || navigator.language || '').slice(0, 32),\n                tz: String(tz || '').slice(0, 64)\n            };\n        } catch (_) { return {}; }\n    }\n\n    function __normalizeAttemptPayload(p) {\n        try {\n            const payload = p || {};\n            const status = String(payload.status || '').trim();\n            const q = String(payload.query ?? payload.input ?? payload.display ?? payload.resolvedDisplay ?? '').trim();\n            const d = String(payload.display ?? payload.resolvedDisplay ?? payload.query ?? payload.input ?? '').trim();\n\n            let isAddr = payload.isAddress;\n            if (typeof isAddr !== 'boolean') {\n                if (status === 'success' || status === 'not_served' || status === 'start') isAddr = true;\n                else if (status === 'invalid_address' || status === 'missing_selection' || status === 'resolve_error') isAddr = false;\n            }\n\n            const out = { ...(payload || {}) };\n            if (!out.query && q) out.query = q;\n            if (!out.display && d) out.display = d;\n            if (typeof out.isAddress !== 'boolean' && typeof isAddr === 'boolean') out.isAddress = isAddr;\n            return out;\n        } catch (_) { return p || {}; }\n    }\n\n    function __logAddressAttempt(payload) {\n        if (window.FlorameAddressTracking) { window.FlorameAddressTracking.send(payload); return; }\n        try {\n            const customerEmail = String(\n                (payload && (payload.customerEmail || payload.email)) ||\n                (() => {\n                    try {\n                        return window.AWI_CUSTOMER_EMAIL || window.__AWI_CUSTOMER_EMAIL || window.customerEmail || localStorage.getItem('florame_customer_email') || '';\n                    } catch (_) { return ''; }\n                })() ||\n                ''\n            ).trim().toLowerCase();\n            const body = { ...__addressAttemptPageMeta(), ...__normalizeAttemptPayload(payload), sessionId: __getSessionId(), customerEmail };\n            fetch(LOG_ATTEMPT_ENDPOINT, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/json' },\n                body: JSON.stringify(body),\n                keepalive: true\n            }).catch(() => {});\n        } catch (_) {}\n    }\n\n    // --- HELPERS (Ported from Unified Logic) ---\n\n    function __uuidv4() {\n        try { if (window.crypto && typeof window.crypto.randomUUID === 'function') return window.crypto.randomUUID(); } catch (_) {}\n        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n            const r = (Math.random() * 16) | 0;\n            return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n        });\n    }\n\n    function ensureSessionToken(input) {\n        if (!input.dataset.sessionToken) input.dataset.sessionToken = __uuidv4();\n        return input.dataset.sessionToken;\n    }\n\n    function resetSessionToken(input) { delete input.dataset.sessionToken; }\n\n    function __addressComponentValue(components, wantedType) {\n        const list = Array.isArray(components) ? components : [];\n        for (const component of list) {\n            const types = Array.isArray(component?.types) ? component.types : [component?.type].filter(Boolean);\n            if (!types.includes(wantedType)) continue;\n            return String(component?.longText || component?.longName || component?.text || component?.shortText || component?.shortName || '').trim();\n        }\n        return '';\n    }\n\n    function __canonicalItalianAddress(raw, components) {\n        const route = __addressComponentValue(components, 'route');\n        const streetNumber = __addressComponentValue(components, 'street_number');\n        const postcode = __addressComponentValue(components, 'postal_code');\n        const city = __addressComponentValue(components, 'locality') || __addressComponentValue(components, 'postal_town');\n        const province = __addressComponentValue(components, 'administrative_area_level_2') || __addressComponentValue(components, 'administrative_area_level_3');\n        if (route && streetNumber) {\n            const locality = [postcode, city, province].filter(Boolean).join(' ');\n            return [`${route} ${streetNumber}`, locality].filter(Boolean).join(', ');\n        }\n\n        const parts = String(raw || '').split(',').map((part) => part.trim()).filter(Boolean);\n        if (!parts.length) return '';\n        const civicPattern = '(\\\\d+[A-Za-z]?(?:\\\\s*(?:\\\\/|-)\\\\s*[A-Za-z0-9]+)?(?:\\\\s*(?:bis|ter|quater))?)';\n        const numberFirst = parts[0].match(new RegExp(`^${civicPattern}\\\\s+(.+)$`, 'i'));\n        if (numberFirst && /[A-Za-z\u00C0-\u00FF]/.test(numberFirst[2] || '')) parts[0] = `${numberFirst[2].trim()} ${numberFirst[1].trim()}`;\n        if (parts.length > 1 && new RegExp(`^${civicPattern}$`, 'i').test(parts[1]) && /[A-Za-z\u00C0-\u00FF]/.test(parts[0])) {\n            parts[0] = `${parts[0]} ${parts[1]}`;\n            parts.splice(1, 1);\n        }\n        return parts.filter((part) => !/^italia$/i.test(part)).join(', ');\n    }\n\n    function __formatAddrSuggestion(s) {\n        const text = __canonicalItalianAddress(s.text || s.display || s.label || '', s.addressComponents || s.components || []);\n        const main = s.mainText || (s.structuredFormat && s.structuredFormat.mainText && s.structuredFormat.mainText.text) || '';\n        const secondary = s.secondaryText || (s.structuredFormat && s.structuredFormat.secondaryText && s.structuredFormat.secondaryText.text) || '';\n        const pcHint = s.postcodeHint || s.postcode || s.postalCode || '';\n        \n        const mainShort = (main || (text.split(',')[0] || text)).trim();\n        const subNoCap = String(secondary || '').trim();\n        const sub = [pcHint, subNoCap].filter(Boolean).join(' \u00B7 ');\n\n        return {\n            ...s,\n            display: text || [mainShort, subNoCap].filter(Boolean).join(', '),\n            __mainShort: mainShort || text,\n            __sub: sub,\n            __subNoCap: subNoCap,\n            __postcode: pcHint || ''\n        };\n    }\n\n\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Address Book (Recenti + Salvati) \u2014 shared with Florame App\n    // Storage: localStorage['florame_address_book_v1']\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const __ADDR_BOOK_KEY = 'florame_address_book_v1';\n    const __ADDR_BOOK_MAX_RECENT = 10;\n    const __ADDR_BOOK_MAX_SAVED = 20;\n\n    function __addrBookSafeParse(raw) {\n        try { return raw ? JSON.parse(raw) : null; } catch (_) { return null; }\n    }\n    function __addrBookLoad() {\n        const base = { v: 1, recent: [], saved: [] };\n        try {\n            const data = __addrBookSafeParse(localStorage.getItem(__ADDR_BOOK_KEY));\n            if (!data || typeof data !== 'object') return base;\n            return {\n                v: 1,\n                recent: Array.isArray(data.recent) ? data.recent : [],\n                saved: Array.isArray(data.saved) ? data.saved : []\n            };\n        } catch (_) { return base; }\n    }\n    function __addrBookSave(book) {\n        try { localStorage.setItem(__ADDR_BOOK_KEY, JSON.stringify(book)); } catch (_) {}\n    }\n    function __addrBookNormalize(entry) {\n        const placeId = String(entry?.placeId || entry?.place_id || '').trim();\n        if (!placeId) return null;\n        const display = String(entry?.display || entry?.text || entry?.label || '').trim();\n        const postcode = String(entry?.postcode || entry?.postalCode || entry?.__postcode || '').trim();\n        const name = String(entry?.name || '').trim();\n        return {\n            placeId,\n            display,\n            postcode: (/^\\d{5}$/.test(postcode) ? postcode : ''),\n            name,\n            tsUsed: Number(entry?.tsUsed || entry?.ts || 0) || 0,\n            tsSaved: Number(entry?.tsSaved || 0) || 0\n        };\n    }\n    function __addrBookIsSaved(placeId) {\n        const pid = String(placeId || '').trim();\n        if (!pid) return false;\n        try { return (__addrBookLoad().saved || []).some(x => String(x?.placeId || '') === pid); } catch (_) { return false; }\n    }\n    function __addrBookUpsertRecent(entry) {\n        const e = __addrBookNormalize(entry);\n        if (!e || !e.display) return;\n        const book = __addrBookLoad();\n        const now = Date.now();\n\n        // Update saved record if present\n        const sIdx = (book.saved || []).findIndex(x => String(x?.placeId || '') === e.placeId);\n        if (sIdx >= 0) {\n            const cur = __addrBookNormalize(book.saved[sIdx]) || {};\n            book.saved[sIdx] = { ...cur, placeId: e.placeId, display: e.display || cur.display || '', postcode: e.postcode || cur.postcode || '', name: cur.name || '', tsSaved: Number(cur.tsSaved || now) || now, tsUsed: now };\n        }\n\n        book.recent = (book.recent || []).filter(x => String(x?.placeId || '') !== e.placeId);\n        book.recent.unshift({ placeId: e.placeId, display: e.display, postcode: e.postcode, tsUsed: now });\n        book.recent = (book.recent || []).slice(0, __ADDR_BOOK_MAX_RECENT);\n        __addrBookSave(book);\n    }\n    function __addrBookUpsertSaved(entry, name) {\n        const e = __addrBookNormalize(entry);\n        const n = String(name || '').trim();\n        if (!e || !e.display || !n) return;\n\n        const book = __addrBookLoad();\n        const now = Date.now();\n        const idx = (book.saved || []).findIndex(x => String(x?.placeId || '') === e.placeId);\n        if (idx >= 0) {\n            const cur = __addrBookNormalize(book.saved[idx]) || {};\n            book.saved[idx] = { ...cur, placeId: e.placeId, display: e.display || cur.display || '', postcode: e.postcode || cur.postcode || '', name: n, tsSaved: Number(cur.tsSaved || now) || now, tsUsed: now };\n        } else {\n            book.saved = Array.isArray(book.saved) ? book.saved : [];\n            book.saved.unshift({ placeId: e.placeId, display: e.display, postcode: e.postcode, name: n, tsSaved: now, tsUsed: now });\n        }\n        book.saved = (book.saved || []).filter(x => x && x.placeId && x.display);\n        book.saved.sort((a, b) => Number(b.tsSaved || 0) - Number(a.tsSaved || 0));\n        book.saved = book.saved.slice(0, __ADDR_BOOK_MAX_SAVED);\n\n        __addrBookSave(book);\n        __addrBookUpsertRecent(e);\n    }\n    function __addrBookRemove(placeId) {\n        const pid = String(placeId || '').trim();\n        if (!pid) return;\n        const book = __addrBookLoad();\n        book.saved = (book.saved || []).filter(x => String(x?.placeId || '') !== pid);\n        book.recent = (book.recent || []).filter(x => String(x?.placeId || '') !== pid);\n        __addrBookSave(book);\n    }\n    function __addrBookSections() {\n        const book = __addrBookLoad();\n        const saved = (book.saved || []).map(__addrBookNormalize).filter(Boolean);\n        const savedIds = new Set(saved.map(x => x.placeId));\n        const recent = (book.recent || []).map(__addrBookNormalize).filter(x => x && !savedIds.has(x.placeId));\n        saved.sort((a, b) => Number(b.tsSaved || 0) - Number(a.tsSaved || 0));\n        recent.sort((a, b) => Number(b.tsUsed || 0) - Number(a.tsUsed || 0));\n        return { saved, recent };\n    }\n\n\n    function __addrBookSavedName(placeId) {\n        const pid = String(placeId || '').trim();\n        if (!pid) return '';\n        try {\n            const { saved } = __addrBookSections();\n            const hit = (saved || []).find(x => String(x?.placeId || '').trim() === pid);\n            return String(hit?.name || '').trim();\n        } catch (_) { return ''; }\n    }\n    function __addrKey(str) {\n        return String(str || '')\n            .toLowerCase()\n            .replace(/\\s+/g, ' ')\n            .replace(/\\u00A0/g, ' ')\n            .replace(/[\u2019']/g, \"'\")\n            .trim();\n    }\n\n\nfunction __addrKeyLoose(str) {\n  return __addrKey(str)\n    .replace(/[.,;:()\\[\\]{}]/g, ' ')\n    .replace(/[\\/\\\\\\-]/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n// Best match from Address Book for pinning (exact or \"similar\" while typing)\nfunction __addrBookBestMatch(typed) {\n  const raw = String(typed || '').trim();\n  if (!raw) return null;\n\n  const t = __addrKeyLoose(__cleanAddress(raw));\n  const tCompactLen = t.replace(/\\s/g, '').length;\n  if (!t) return null;\n\n  const { saved, recent } = __addrBookSections();\n\n  const scoreOf = (entry) => {\n    const cand = __addrKeyLoose(__cleanAddress(String(entry?.display || '')));\n    if (!cand) return 0;\n\n    // Exact match\n    if (cand === t) return 100;\n\n    // only allow fuzzy when user typed enough (>= 3 non-space chars)\n    if (tCompactLen < 3) return 0;\n\n    // Strong prefix relationships feel the most natural while typing\n    if (cand.startsWith(t)) return 92;\n    if (t.startsWith(cand)) return 88;\n\n    // Contains is still a good signal\n    if (cand.includes(t)) return 82;\n\n    // Token overlap (handles reorderings)\n    const toks = t.split(' ').filter(Boolean).filter(x => x.length >= 2);\n    if (!toks.length) return 0;\n\n    let hit = 0;\n    for (const tok of toks) {\n      if (cand.includes(tok)) hit++;\n    }\n    const ratio = hit / toks.length;\n\n    if (ratio >= 0.8) return 78;\n    if (ratio >= 0.6) return 72;\n    if (ratio >= 0.5 && toks.length >= 3) return 70;\n\n    return 0;\n  };\n\n  let best = null;\n  let bestScope = '';\n  let bestScore = 0;\n\n  const scan = (arr, scope) => {\n    for (const e of (arr || [])) {\n      const sc = scoreOf(e);\n      if (sc > bestScore || (sc === bestScore && best && bestScope === 'recent' && scope === 'saved')) {\n        best = e; bestScope = scope; bestScore = sc;\n      }\n    }\n  };\n\n  scan(saved, 'saved');\n  scan(recent, 'recent');\n\n  if (!best || !best?.placeId) return null;\n\n  // Threshold: always allow exact; otherwise require decent score (prefix/contains)\n  if (bestScore < 70 && bestScore !== 100) return null;\n\n  return { entry: best, scope: bestScope, score: bestScore };\n}\n\n            // SVG icons (inline, scalable, theme-friendly)\n            const __SVG_STAR_OUTLINE = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 17.27l-5.18 3.05 1.4-5.98L3 9.24l6.07-.52L12 3l2.93 5.72 6.07.52-5.22 5.1 1.4 5.98z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>`;\n            const __SVG_STAR_FILLED  = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 17.27l-5.18 3.05 1.4-5.98L3 9.24l6.07-.52L12 3l2.93 5.72 6.07.52-5.22 5.1 1.4 5.98z\" fill=\"currentColor\"/></svg>`;\n            const __SVG_TRASH = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g><g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g><g id=\"SVGRepo_iconCarrier\"> <path d=\"M4 6H20M16 6L15.7294 5.18807C15.4671 4.40125 15.3359 4.00784 15.0927 3.71698C14.8779 3.46013 14.6021 3.26132 14.2905 3.13878C13.9376 3 13.523 3 12.6936 3H11.3064C10.477 3 10.0624 3 9.70951 3.13878C9.39792 3.26132 9.12208 3.46013 8.90729 3.71698C8.66405 4.00784 8.53292 4.40125 8.27064 5.18807L8 6M18 6V16.2C18 17.8802 18 18.7202 17.673 19.362C17.3854 19.9265 16.9265 20.3854 16.362 20.673C15.7202 21 14.8802 21 13.2 21H10.8C9.11984 21 8.27976 21 7.63803 20.673C7.07354 20.3854 6.6146 19.9265 6.32698 19.362C6 18.7202 6 17.8802 6 16.2V6M14 10V17M10 10V17\" stroke=\"#000000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path> </g></svg>`;\n  \n    function __ensureAddrNameModal() {\n        if (window.__homeAddrNameModal) return window.__homeAddrNameModal;\n\n        const overlay = document.createElement('div');\n        overlay.className = 'addr-modal-overlay';\n        overlay.innerHTML = `\n          <div class=\"addr-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"addrHomeModalTitle\">\n            <div class=\"addr-modal-head\" id=\"addrHomeModalTitle\">Salva indirizzo</div>\n            <div class=\"addr-modal-body\">\n              <label class=\"addr-modal-label\" for=\"addrHomeModalInput\">Nome</label>\n              <input id=\"addrHomeModalInput\" class=\"addr-modal-input\" type=\"text\" inputmode=\"text\" autocomplete=\"off\" autocapitalize=\"words\" />\n            </div>\n            <div class=\"addr-modal-foot\">\n              <button type=\"button\" class=\"addr-modal-btn cancel\">Annulla</button>\n              <button type=\"button\" class=\"addr-modal-btn confirm\">Salva</button>\n            </div>\n          </div>\n        `;\n        document.body.appendChild(overlay);\n\n        const titleEl = overlay.querySelector('#addrHomeModalTitle');\n        const inputEl = overlay.querySelector('#addrHomeModalInput');\n        const btnCancel = overlay.querySelector('.addr-modal-btn.cancel');\n        const btnOk = overlay.querySelector('.addr-modal-btn.confirm');\n\n        let __resolve = null;\n        let __prevOverflow = '';\n        let __scrollY = 0;\n        let __prevBody = null;\n        let __vvCleanup = null;\n\n        const __lockScroll = () => {\n          try {\n            __prevOverflow = document.documentElement.style.overflow || '';\n            document.documentElement.style.overflow = 'hidden';\n          } catch (_) { }\n          // iOS-friendly: lock body scroll without layout jump\n          try {\n            __scrollY = window.scrollY || window.pageYOffset || 0;\n            __prevBody = {\n                position: document.body.style.position,\n                top: document.body.style.top,\n                left: document.body.style.left,\n                right: document.body.style.right,\n                width: document.body.style.width\n            };\n            document.body.style.position = 'fixed';\n            document.body.style.top = (-__scrollY) + 'px';\n            document.body.style.left = '0';\n            document.body.style.right = '0';\n            document.body.style.width = '100%';\n          } catch (_) { }\n        };\n\n        const __unlockScroll = () => {\n          try { document.documentElement.style.overflow = __prevOverflow || ''; } catch (_) { }\n          try {\n            if (__prevBody) {\n                document.body.style.position = __prevBody.position || '';\n                document.body.style.top = __prevBody.top || '';\n                document.body.style.left = __prevBody.left || '';\n                document.body.style.right = __prevBody.right || '';\n                document.body.style.width = __prevBody.width || '';\n            }\n            window.scrollTo(0, __scrollY || 0);\n          } catch (_) { }\n          __prevBody = null;\n        };\n\n        const __syncVV = () => {\n          try {\n            const vv = window.visualViewport;\n            const vvH = (vv && vv.height) ? vv.height : window.innerHeight;\n            overlay.style.setProperty('--addrVVH', vvH + 'px');\n\n            // Move modal up when the virtual keyboard reduces the visual viewport\n            const layoutH = window.innerHeight || vvH;\n            const centerVV = (vv && typeof vv.offsetTop === 'number') ? (vv.offsetTop + vvH / 2) : (vvH / 2);\n            const centerLayout = layoutH / 2;\n            let shift = centerVV - centerLayout; // negative => move up\n            // Only allow upward shift, cap to avoid going off-screen\n            if (shift > 0) shift = 0;\n            if (shift < -260) shift = -260;\n            overlay.style.setProperty('--addrModalShift', shift + 'px');\n          } catch (_) { }\n        };\n\n        const __attachVV = () => {\n          if (__vvCleanup) return;\n          let raf = 0;\n          const onVV = () => {\n            try { if (raf) cancelAnimationFrame(raf); } catch (_) { }\n            raf = requestAnimationFrame(() => { __syncVV(); });\n          };\n\n          const vv = window.visualViewport;\n          try { window.addEventListener('resize', onVV, { passive: true }); } catch (_) { }\n          try { window.addEventListener('orientationchange', onVV, { passive: true }); } catch (_) { }\n\n          if (vv && vv.addEventListener) {\n            try { vv.addEventListener('resize', onVV, { passive: true }); } catch (_) { }\n            try { vv.addEventListener('scroll', onVV, { passive: true }); } catch (_) { }\n          }\n\n          __vvCleanup = () => {\n            try { window.removeEventListener('resize', onVV); } catch (_) { }\n            try { window.removeEventListener('orientationchange', onVV); } catch (_) { }\n            if (vv && vv.removeEventListener) {\n                try { vv.removeEventListener('resize', onVV); } catch (_) { }\n                try { vv.removeEventListener('scroll', onVV); } catch (_) { }\n            }\n            try { if (raf) cancelAnimationFrame(raf); } catch (_) { }\n            raf = 0;\n            __vvCleanup = null;\n          };\n\n          // initial\n          setTimeout(__syncVV, 0);\n          setTimeout(__syncVV, 80);\n        };\n\n        const __detachVV = () => {\n          try { if (__vvCleanup) __vvCleanup(); } catch (_) { }\n          __vvCleanup = null;\n          try { overlay.style.removeProperty('--addrModalShift'); } catch (_) { }\n          try { overlay.style.removeProperty('--addrVVH'); } catch (_) { }\n        };\n\n        \n        const close = (val) => {\n            try { overlay.style.display = 'none'; } catch (_) { }\n            try { __detachVV(); } catch (_) { }\n            try { __unlockScroll(); } catch (_) { }\n            const r = __resolve;\n            __resolve = null;\n            if (typeof r === 'function') r(val);\n        };\n\n        const syncBtn = () => { btnOk.disabled = !String(inputEl.value || '').trim(); };\n\n        overlay.addEventListener('click', (ev) => { if (ev.target === overlay) close(null); });\n        btnCancel.addEventListener('click', () => close(null));\n        btnOk.addEventListener('click', () => { const v = String(inputEl.value || '').trim(); if (!v) return; close(v); });\n        inputEl.addEventListener('input', syncBtn);\n        inputEl.addEventListener('keydown', (ev) => {\n            if (ev.key === 'Escape') { ev.preventDefault(); close(null); return; }\n            if (ev.key === 'Enter') { ev.preventDefault(); const v = String(inputEl.value || '').trim(); if (!v) return; close(v); }\n        });\n\n        window.__homeAddrNameModal = {\n            open: ({ title, initialValue, confirmText } = {}) => new Promise((resolve) => {\n                __resolve = resolve;\n                try { __lockScroll(); } catch (_) { }\n                try { titleEl.textContent = String(title || 'Salva indirizzo'); } catch (_) { }\n                try { btnOk.textContent = String(confirmText || 'Salva'); } catch (_) { }\n                try { inputEl.value = String(initialValue || ''); } catch (_) { }\n                syncBtn();\n                try { overlay.style.display = 'flex'; } catch (_) { }\n                try { __attachVV(); } catch (_) { }\n                setTimeout(() => { try { __syncVV(); } catch (_) { } }, 0);\n                setTimeout(() => { try { inputEl.focus(); inputEl.select(); } catch (_) { } }, 60);\n            })\n        };\n        return window.__homeAddrNameModal;\n    }\n\n    function __ensureAddrQuickStyles() {\n        if (document.getElementById('addr-quick-style')) return;\n        const style = document.createElement('style');\n        style.id = 'addr-quick-style';\n        style.textContent = `\n          .addr-quick{padding:10px 10px}\n          .addr-quick-section{margin-top:6px}\n          .addr-quick-head{display:flex;align-items:center;justify-content:space-between;font-size:11px;letter-spacing:.08em;text-transform:uppercase;opacity:.7;padding:6px 4px}\n          .addr-quick-empty{padding:12px 14px;font-size:13px;opacity:.7}\n          .addr-quick-item{display:flex;align-items:center;gap:10px}\n          .addr-actions{margin-left:auto;display:flex;gap:8px;flex:0 0 auto}\n          .addr-act{width:32px;height:32px;border-radius:999px;border:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;background:rgba(17,24,39,0.06);color:rgba(17,24,39,0.85)}\n          .addr-act svg{width:18px;height:18px;display:block}\n          .addr-act:hover{background:rgba(17,24,39,0.10)}\n          .addr-act:active{transform:scale(0.96)}\n          .addr-act.addr-del{background:rgba(255,77,117,0.12);color:#ff4d75}\n        \n\n          .addr-saved-chip{display:inline-flex;align-items:center;justify-content:center;max-width:140px;overflow:hidden;text-overflow:ellipsis;padding:6px 10px;border-radius:999px;background:rgba(255,77,117,0.14);color:#ff4d75;font-weight:900;font-size:12px;line-height:1;white-space:nowrap}\n          .addr-item.is-pinned{outline:2px solid rgba(255,77,117,0.22);outline-offset:2px}\n\n          .addr-modal-overlay{position:fixed;inset:0;z-index:2147483000;display:none;align-items:stretch;justify-content:stretch;padding:calc(16px + env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom));background:rgba(17,24,39,0.52);backdrop-filter:saturate(120%) blur(6px);overflow:auto;-webkit-overflow-scrolling:touch}\n          .addr-modal{width:min(440px,100%);border-radius:18px;background:#fff;box-shadow:0 28px 80px rgba(0,0,0,0.30);overflow:hidden;display:flex;flex-direction:column;margin:auto;max-height:calc(var(--addrVVH, 100vh) - 32px);transform:translateY(var(--addrModalShift, 0px));transition:transform .18s ease, box-shadow .18s ease}\n          [data-theme=\"dark\"] .addr-modal{background:rgba(17,24,39,0.96);box-shadow:0 28px 90px rgba(0,0,0,0.55)}\n          .addr-modal-head{padding:14px 16px 10px;font-weight:900;font-size:16px;line-height:1.2;color:#111827}\n          [data-theme=\"dark\"] .addr-modal-head{color:#fff}\n          .addr-modal-body{padding:0 16px 14px;overflow:auto}\n          .addr-modal-label{display:block;font-size:12px;opacity:.75;margin:0 0 8px}\n          .addr-modal-input{width:100%;border-radius:14px;border:1px solid rgba(17,24,39,0.14);padding:12px 14px;font-size:16px;line-height:1.2;outline:none}\n          .addr-modal-input:focus{border-color:rgba(255,77,117,0.65);box-shadow:0 0 0 4px rgba(255,77,117,0.18)}\n          [data-theme=\"dark\"] .addr-modal-input{background:rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.16);color:#fff}\n          [data-theme=\"dark\"] .addr-modal-input:focus{border-color:rgba(255,77,117,0.75);box-shadow:0 0 0 4px rgba(255,77,117,0.22)}\n          .addr-modal-foot{display:flex;gap:10px;justify-content:flex-end;padding:0 16px 16px}\n          .addr-modal-btn{border-radius:999px;border:0;cursor:pointer;font-weight:900;font-size:14px;line-height:1;padding:12px 16px}\n          .addr-modal-btn:active{transform:translateY(1px)}\n          .addr-modal-btn.cancel{background:rgba(17,24,39,0.08);color:rgba(17,24,39,0.86)}\n          [data-theme=\"dark\"] .addr-modal-btn.cancel{background:rgba(255,255,255,0.10);color:rgba(255,255,255,0.92)}\n          .addr-modal-btn.confirm{background:var(--ds-gradient);color:#fff;box-shadow:0 14px 34px rgba(255,77,117,0.22)}\n          .addr-modal-btn.confirm[disabled]{opacity:.55;cursor:not-allowed;box-shadow:none}\n          @media (max-width:520px){.addr-modal-overlay{padding:calc(14px + env(safe-area-inset-top)) 14px calc(14px + env(safe-area-inset-bottom))}.addr-modal{width:100%;max-width:420px;border-radius:18px}}\n          .addr-cap-chip{display:none !important}\n`;\n        document.head.appendChild(style);\n    }\n\n    function __renderAddressQuickList(container, input, { onPick } = {}) {\n        if (!container) return false;\n        __ensureAddrQuickStyles();\n\n        let { saved, recent } = __addrBookSections();\n\n        // Pin best match (exact or \"similar\" while typing) at top until it changes\nconst m = __addrBookBestMatch(String(input && input.value || ''));\nlet pinned = null;\nlet pinnedScope = '';\nif (m && m.entry) {\n    pinned = m.entry;\n    pinnedScope = m.scope || '';\n    if (pinnedScope === 'saved') {\n        saved = (saved || []).filter(x => String(x && x.placeId || '') !== String(pinned.placeId || ''));\n    } else if (pinnedScope === 'recent') {\n        recent = (recent || []).filter(x => String(x && x.placeId || '') !== String(pinned.placeId || ''));\n    }\n}\nif ((saved.length + recent.length) === 0) {\n            container.style.display = 'none';\n            container.innerHTML = '';\n            return false;\n        }\n\n        const itemHtml = (e, scope) => {\n            const s = __formatAddrSuggestion(e || {});\n            const placeId = String(e.placeId || '').trim();\n            const display = String(e.display || s.display || '').trim();\n            const main = String(s.__mainShort || display.split(',')[0] || display).trim();\n            const sub = String(s.__subNoCap || '').trim();\n            const cap = String(e.postcode || s.__postcode || '').trim();\n            const name = String(e.name || '').trim();\n            const hasCap = /^\\d{5}$/.test(cap);\n\n            const mainLine = escapeHtml(main);\n            const subText = escapeHtml(sub || display);\n            const nameChip = (scope === 'saved' && name) ? `<span class=\"addr-saved-chip\" title=\"${escapeHtml(name)}\">${escapeHtml(name)}</span>` : ``;\n            const fullSpan = display ? `<span class=\"addr-subtext\">${escapeHtml(display)}</span>` : (subText ? `<span class=\"addr-subtext\">${subText}</span>` : ``);\n\n            return `\n              <div class=\"addr-item addr-quick-item\" data-placeid=\"${escapeHtml(placeId)}\" data-scope=\"${escapeHtml(scope)}\">\n                <div class=\"addr-lines\">\n                  <div class=\"addr-sub\">${fullSpan}</div>\n                </div>\n                <div class=\"addr-actions\">\n                  ${nameChip}\n                  <button type=\"button\" class=\"addr-act addr-save\" data-act=\"save\" title=\"${__addrBookIsSaved(placeId) ? 'Rinomina' : 'Salva'}\" aria-label=\"${__addrBookIsSaved(placeId) ? 'Rinomina' : 'Salva'}\">${__addrBookIsSaved(placeId) ? __SVG_STAR_FILLED : __SVG_STAR_OUTLINE}</button>\n                  <button type=\"button\" class=\"addr-act addr-del\" data-act=\"del\" title=\"Elimina\" aria-label=\"Elimina\">${__SVG_TRASH}</button>\n                </div>\n              </div>\n            `;\n        };\n\n        const htmlSaved = saved.length ? saved.map(e => itemHtml(e, 'saved')).join('') : `<div class=\"addr-quick-empty\">Nessun indirizzo salvato.</div>`;\n        const htmlRecent = recent.length ? recent.map(e => itemHtml(e, 'recent')).join('') : `<div class=\"addr-quick-empty\">Nessun indirizzo recente.</div>`;\n\n        const htmlPinned = pinned\n            ? `<div class=\"addr-quick-section\">\n                 <div class=\"addr-quick-head\">Gi\u00E0 presente</div>\n                 ${itemHtml(pinned, pinnedScope).replace('class=\"addr-item', 'class=\"addr-item is-pinned')}\n               </div>`\n            : ``;\n\n        container.style.display = 'block';\n        container.innerHTML = `\n          <div class=\"addr-quick\">\n            ${htmlPinned}\n            <div class=\"addr-quick-section\">\n              <div class=\"addr-quick-head\">Salvati</div>\n              ${htmlSaved}\n            </div>\n            <div class=\"addr-quick-section\">\n              <div class=\"addr-quick-head\">Recenti</div>\n              ${htmlRecent}\n            </div>\n          </div>\n        `;\n\n        container.querySelectorAll('.addr-quick-item').forEach((row) => {\n            const placeId = String(row.getAttribute('data-placeid') || '').trim();\n            const scope = String(row.getAttribute('data-scope') || '').trim();\n            const entry = (() => {\n          const { saved, recent } = __addrBookSections();\n          const all = (saved || []).concat(recent || []);\n          return all.find(x => String(x?.placeId || '') === placeId) || null;\n        })();\n\n            row.addEventListener('click', (ev) => {\n                const t = ev && ev.target;\n                if (t && t.closest && t.closest('button.addr-act')) return;\n                if (!entry) return;\n\n                const picked = { placeId: entry.placeId, display: entry.display, __postcode: entry.postcode || '' };\n                try { input.dataset.selected = JSON.stringify(picked); } catch (_) {}\n                try { input.dataset.cap = String(entry.postcode || ''); } catch (_) {}\n                input.value = String(entry.display || '');\n\n                try { __addrBookUpsertRecent(entry); } catch (_) {}\n                try { onPick && onPick(picked); } catch (_) {}\n            }, { passive: false });\n\n            const saveBtn = row.querySelector('button.addr-save');\n            if (saveBtn) saveBtn.addEventListener('click', async (ev) => {\n                ev.preventDefault(); ev.stopPropagation();\n                if (!entry) return;\n                const isSaved = __addrBookIsSaved(entry.placeId);\n                const cur = (__addrBookSections().saved || []).find(x => x.placeId === entry.placeId) || entry;\n                const modal = __ensureAddrNameModal();\n                const name = await modal.open({\n                    title: (isSaved ? 'Rinomina indirizzo' : 'Salva indirizzo'),\n                    initialValue: String(cur.name || ''),\n                    confirmText: (isSaved ? 'Rinomina' : 'Salva')\n                });\n                if (name == null) return;\n                const n = String(name || '').trim();\n                if (!n) return;\n                __addrBookUpsertSaved(entry, n);\n                __renderAddressQuickList(container, input, { onPick });\n            }, { passive: false });\n\n            const delBtn = row.querySelector('button.addr-del');\n            if (delBtn) delBtn.addEventListener('click', (ev) => {\n                ev.preventDefault(); ev.stopPropagation();\n                __addrBookRemove(placeId);\n                __renderAddressQuickList(container, input, { onPick });\n            }, { passive: false });\n        });\n\n        return true;\n    }\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Address suggestions: preserve Google's relevance order. Civic validation is\n// performed only after selection by addressResolve, not by UI heuristics.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\nfunction __filterAndSortSuggestions(list) {\n    const arr = Array.isArray(list) ? list : [];\n    return arr.filter((item, index) => {\n        const placeId = String(item?.placeId || item?.place_id || '').trim();\n        return !!placeId && arr.findIndex((candidate) => String(candidate?.placeId || candidate?.place_id || '').trim() === placeId) === index;\n    });\n}\n\n    function getCapState() {\n        try {\n            if (window.FlorameHomeAddress && typeof window.FlorameHomeAddress.readState === 'function') {\n                return window.FlorameHomeAddress.readState();\n            }\n            const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || 'null');\n            if (!saved || !saved.cap) return { verified: false };\n            const isFresh = (Date.now() - (saved.ts || 0)) < CONFIG.capValidityMs;\n            return { ...saved, fresh: isFresh };\n        } catch { return { verified: false }; }\n    }\n\n    // --- MAIN INITIALIZATION ---\n    function initInlineModule() {\n        const input = $('capAddressInput');\n        if (!input) return;\n\n        if($('capUseLocationBtn')) $('capUseLocationBtn').onclick = useCurrentLocation;\n        \n        setupAutocomplete('capAddressInput', 'capAddrSuggest');\n        syncUI();\n                // \u2705 HOME: mostra subito la quicklist (Salvati/Recenti) senza aspettare il focus\n        try {\n          const st = getCapState();\n          if (!st || !st.verified || !st.fresh) {\n            if (typeof input.__addrShowQuick === 'function') input.__addrShowQuick({ force: true });\n          }\n        } catch (_) {}\n// \u2705 Auto-refresh: se l'indirizzo \u00E8 stato ripristinato, rilancia la verifica stock\n        setTimeout(autoReverifyAfterRestore, 0);\n    }\n\n    async function useCurrentLocation() {\n        const button = $('capUseLocationBtn');\n        const input = $('capAddressInput');\n        const label = button?.querySelector('span');\n        const idleLabel = label?.textContent || 'Usa la mia posizione';\n        if (!navigator.geolocation) {\n            showError('La posizione non \u00E8 disponibile su questo dispositivo. Inserisci l\u2019indirizzo.');\n            return;\n        }\n        if (button) {\n            button.disabled = true;\n            button.setAttribute('aria-busy', 'true');\n        }\n        if (label) label.textContent = 'Trovo l\u2019indirizzo\u2026';\n        showError(null);\n        try {\n            const position = await new Promise((resolve, reject) => {\n                navigator.geolocation.getCurrentPosition(resolve, reject, {\n                    enableHighAccuracy: true,\n                    timeout: 10000,\n                    maximumAge: 60000\n                });\n            });\n            const lat = Number(position.coords.latitude);\n            const lng = Number(position.coords.longitude);\n            const url = new URL(CONFIG.addressResolve, window.location.origin);\n            url.searchParams.set('lat', String(lat));\n            url.searchParams.set('lng', String(lng));\n            const response = await fetch(url.toString(), { headers: { Accept: 'application/json' } });\n            const data = await response.json().catch(() => ({}));\n            const location = data?.place || {};\n            const cap = String(location.postcode || location.postalCode || '').trim();\n            const display = __canonicalItalianAddress(location.display || location.formattedAddress || '', location.addressComponents || []);\n            if (!response.ok || !/^\\d{5}$/.test(cap) || !display) throw new Error('gps_address_unresolved');\n            const hasCivic = location.isAddress === true && Boolean(String(location.houseNumber || __addressComponentValue(location.addressComponents || [], 'street_number')).trim());\n            if (!hasCivic) {\n                if (input) input.value = display;\n                showError('Ho trovato la via, ma non il civico. Aggiungilo e scegli l\u2019indirizzo completo.');\n                input?.focus();\n                return;\n            }\n            if (input) {\n                input.value = display;\n                input.dataset.cap = cap;\n            }\n            try {\n                localStorage.setItem(ADDR_CACHE_KEY, JSON.stringify({ display, postcode: cap, lat, lng, source: 'gps', ts: Date.now() }));\n            } catch (_) {}\n            await verifyStock(cap, display, {\n                userInitiated: true,\n                context: 'home_florame',\n                source: 'precise_location',\n                query: 'gps',\n                display,\n                resolvedDisplay: display,\n                 formattedAddress: display,\n                 addressComponents: location.addressComponents || [],\n                 placeId: location.placeId || '',\n                 street: location.street || '',\n                 houseNumber: location.houseNumber || '',\n                 city: location.city || '',\n                 province: location.province || '',\n                lat,\n                lng,\n                isAddress: true\n            });\n        } catch (error) {\n            const denied = Number(error?.code || 0) === 1;\n            showError(denied\n                ? 'Permesso posizione negato. Puoi inserire l\u2019indirizzo manualmente.'\n                : 'Non riesco a ricavare l\u2019indirizzo esatto. Inseriscilo manualmente.');\n        } finally {\n            if (button) {\n                button.disabled = false;\n                button.removeAttribute('aria-busy');\n            }\n            if (label) label.textContent = idleLabel;\n        }\n    }\n\n    // --- AUTOCOMPLETE LOGIC (Unified Style) ---\n    function setupAutocomplete(inputId, suggestId) {\n        const input = $(inputId);\n        const suggest = $(suggestId);\n        if (!input || !suggest) return;\n        if (input.__addrWired) return;\n        input.__addrWired = true;\n\n        let debounceTimer;\n        let autocompleteController = null;\n        let autocompleteSequence = 0;\n        const autocompleteCache = new Map();\n        let __suppressQuickReopenUntil = 0;\n\n        const suppressQuickReopenOnce = () => {\n            __suppressQuickReopenUntil = Date.now() + 400;\n        };\n\n        try { suggest.addEventListener('pointerdown', suppressQuickReopenOnce, { passive: true, capture: true }); } catch (_) {}\n        try { suggest.addEventListener('touchstart', suppressQuickReopenOnce, { passive: true, capture: true }); } catch (_) {}\n        try { suggest.addEventListener('mousedown', suppressQuickReopenOnce, { passive: true, capture: true }); } catch (_) {}\n\n        // 1. Clear Button Logic (X)\n        const wrapper = input.closest('.cap-input-row') || input.parentElement;\n        let clearBtn = wrapper.querySelector('.cap-clear-btn');\n        if (!clearBtn) {\n            clearBtn = document.createElement('button');\n            clearBtn.className = 'cap-clear-btn';\n            clearBtn.innerHTML = '&times;';\n            wrapper.appendChild(clearBtn);\n            \n            const toggleClear = () => { clearBtn.style.display = input.value ? 'flex' : 'none'; };\n            input.addEventListener('input', toggleClear);\n            clearBtn.addEventListener('click', () => {\n                autocompleteSequence += 1;\n                try { autocompleteController?.abort?.(); } catch (_) {}\n                input.value = '';\n                try { delete input.dataset.selected; } catch(e) {}\n                try { delete input.dataset.cap; } catch(e) {}\n                clearBtn.style.display = 'none';\n                suggest.style.display = 'none';\n                showError(null);\n                input.focus();\n                resetSessionToken(input);\n                try {\n                    if (typeof input.__addrShowQuick === 'function') {\n                        input.__addrShowQuick({ force: true });\n                    }\n                } catch (_) {}\n            });\n        }\n\n        \n        // Tap-to-see: mostra lista rapida Recenti + Salvati solo a campo vuoto.\n        // Con { force:true } la apre anche se il campo ha gi\u00E0 testo (utile all'avvio, prima del focus).\n        let __quickOpenGuardTs = 0;\n        const showQuickIfNeeded = (opts = {}) => {\n            try {\n                const skipGuard = !!(opts && opts.skipGuard);\n                const now = Date.now();\n                if (!skipGuard) {\n                    if (now - __quickOpenGuardTs < 160) return false;\n                    __quickOpenGuardTs = now;\n                }\n\n                const force = !!(opts && opts.force);\n                const qt = String(input.value || '').trim();\n\n                if (!force && qt) return false;\n\n                const rendered = __renderAddressQuickList(suggest, input, {\n                    onPick: (picked) => {\n                        suggest.style.display = 'none';\n                        suggest.innerHTML = '';\n                        try { resolveAddress(String(picked?.placeId || ''), input, picked || {}); } catch (_) {}\n                    }\n                });\n                return !!rendered;\n            } catch (_) {}\n            return false;\n        };\n\n        const shouldKeepQuickListVisible = () => {\n            try {\n                if (!input || !suggest || input.disabled) return false;\n                if (!input.isConnected || !suggest.isConnected) return false;\n                if (String(input.value || '').trim()) return false;\n                if (typeof input.getClientRects === 'function' && input.getClientRects().length === 0) return false;\n                return true;\n            } catch (_) {}\n            return false;\n        };\n\n        const syncQuickListWhenEmpty = () => {\n            try {\n                if (Date.now() < __suppressQuickReopenUntil) return false;\n                if (!shouldKeepQuickListVisible()) return false;\n                return !!showQuickIfNeeded({ force: true, skipGuard: true });\n            } catch (_) {}\n            return false;\n        };\n\n        const scheduleQuickListSync = () => {\n            setTimeout(() => {\n                try { syncQuickListWhenEmpty(); } catch (_) {}\n            }, 0);\n        };\n\n        try { input.__addrShowQuick = showQuickIfNeeded; } catch (_) {}\n\n        const openQuickListAfterNativeFocus = () => {\n            requestAnimationFrame(() => {\n                try {\n                    if (document.activeElement === input) showQuickIfNeeded();\n                } catch (_) {}\n            });\n        };\n\n        input.addEventListener('focus', openQuickListAfterNativeFocus, { passive: true });\n        input.addEventListener('blur', () => {\n            const query = String(input.value || '').trim();\n            if (query) return;\n\n            scheduleQuickListSync();\n        }, { passive: true });\n\n        document.addEventListener('click', scheduleQuickListSync, true);\n\n// 2. Input Event\n        input.addEventListener('input', () => {\n            clearTimeout(debounceTimer);\n            autocompleteSequence += 1;\n            const sequence = autocompleteSequence;\n            try { autocompleteController?.abort?.(); } catch (_) {}\n            showError(null);\n            const query = input.value.trim();\n            \n            if (!query.length) {\n                // Campo vuoto: ripristina Recenti + Salvati, se esistono.\n                try {\n                    __renderAddressQuickList(suggest, input, {\n                        onPick: (picked) => {\n                            suggest.style.display = 'none';\n                            suggest.innerHTML = '';\n                            try { resolveAddress(String(picked?.placeId || ''), input, picked || {}); } catch (_) {}\n                        }\n                    });\n                } catch (_) { suggest.style.display = 'none'; }\n                return;\n            }\n\n            if (query.length < 3) {\n                try { suggest.style.display = 'none'; suggest.innerHTML = ''; } catch (_) {}\n                return;\n            }\n\n            const cacheKey = query.toLocaleLowerCase('it-IT').replace(/\\s+/g, ' ');\n            const cached = autocompleteCache.get(cacheKey);\n            if (cached && Date.now() - cached.savedAt < 90 * 1000) {\n                renderSuggestions(cached.list, suggest, input);\n                clearBtn.style.display = 'flex';\n                return;\n            }\n\n            // UI: Show loading inside suggestion box\n            __renderAddressPinnedLoading(suggest, input);\n\n            debounceTimer = setTimeout(async () => {\n                const token = ensureSessionToken(input);\n                autocompleteController = typeof AbortController === 'function' ? new AbortController() : null;\n                try {\n                    // Unified Endpoint URL format\n                    const url = `${CONFIG.addressAutocomplete}?q=${encodeURIComponent(query)}&limit=5&country=IT&sessionToken=${encodeURIComponent(token)}`;\n                    const res = await fetch(url, {\n                        signal: autocompleteController?.signal,\n                        headers: { Accept: 'application/json' }\n                    });\n                    if (!res.ok) throw new Error(`Autocomplete HTTP ${res.status}`);\n                    const data = await res.json();\n                    if (sequence !== autocompleteSequence || String(input.value || '').trim() !== query) return;\n                    const list = Array.isArray(data?.suggestions) ? data.suggestions : (Array.isArray(data?.predictions) ? data.predictions : []);\n                    autocompleteCache.set(cacheKey, { list, savedAt: Date.now() });\n                    if (autocompleteCache.size > 24) autocompleteCache.delete(autocompleteCache.keys().next().value);\n                    renderSuggestions(list, suggest, input);\n                } catch (e) { \n                    if (e?.name !== 'AbortError') {\n                        console.error(\"Autocomplete error\", e);\n                        if (sequence === autocompleteSequence) suggest.style.display = 'none';\n                    }\n                } finally {\n                    if (sequence === autocompleteSequence) clearBtn.style.display = 'flex';\n                }\n            }, 90);\n        });\n    }\n\n\n    function __syncAddrSuggestMetrics(suggestEl) {\n      if (!suggestEl) return;\n      try {\n        const probe = document.createElement('div');\n        probe.className = 'addr-item';\n        probe.style.position = 'fixed';\n        probe.style.left = '-9999px';\n        probe.style.top = '0';\n        probe.style.visibility = 'hidden';\n        probe.style.pointerEvents = 'none';\n        probe.innerHTML = `\n          <div class=\"addr-lines\">\n            <div class=\"addr-sub\"><span class=\"addr-subtext\">Via Alessandro Manzoni 123, 00100 Roma RM, Italia</span></div>\n          </div>\n          <div class=\"addr-right\"><span class=\"addr-saved-chip\">Casa</span></div>\n        `;\n        document.body.appendChild(probe);\n        const h = Math.round((probe.getBoundingClientRect && probe.getBoundingClientRect().height) ? probe.getBoundingClientRect().height : (probe.offsetHeight || 0));\n        probe.remove();\n        if (h && h > 0) suggestEl.style.setProperty('--addrItemH', h + 'px');\n      } catch(_) {}\n    }\n\n    function __renderAddressSuggestionsLoading(suggestEl) {\n      if (!suggestEl) return;\n      suggestEl.style.display = '';\n      suggestEl.setAttribute('role', 'listbox');\n      try { __syncAddrSuggestMetrics(suggestEl); } catch(_) {}\n      try { suggestEl.setAttribute('data-skel','1'); } catch(_) {}\n      // Skeleton (4 rows) to keep dropdown height stable inside modals/cards\n      suggestEl.innerHTML = `\n        <div class=\"addr-skel\" role=\"option\" aria-disabled=\"true\">\n          ${Array.from({ length: 4 }).map(() => `\n            <div class=\"addr-skel-item\">\n              <div class=\"addr-skel-lines\">\n                <div class=\"addr-skel-line\"></div>\n                <div class=\"addr-skel-line small\"></div>\n              </div>\n            </div>\n          `).join('')}\n        </div>\n      `;\n    }\n\n\n    function __renderAddressPinnedLoading(suggestEl, input) {\n      if (!suggestEl) return;\n      const q = String(input && input.value || '').trim();\n      let m = null;\n      try { m = __addrBookBestMatch(q); } catch(_) {}\n      if (!m || !m.entry || !m.entry.placeId) { __renderAddressSuggestionsLoading(suggestEl); return; }\n\n      // keep dropdown stable: 1 pinned row + 3 skeleton rows = 4 rows total\n      suggestEl.style.display = '';\n      suggestEl.setAttribute('role', 'listbox');\n      try { __syncAddrSuggestMetrics(suggestEl); } catch(_) {}\n      try { suggestEl.setAttribute('data-skel','1'); } catch(_) {}\n\n      const entry = m.entry;\n      const pid = String(entry.placeId || '').trim();\n      const full = String(entry.display || '').trim();\n      const name = (m.scope === 'saved') ? String(entry.name || '').trim() : '';\n      const chip = (m.scope === 'saved' && name) ? `<div class=\"addr-right\"><span class=\"addr-saved-chip\" title=\"${escapeHtml(name)}\">${escapeHtml(name)}</span></div>` : '';\n      const fullSpan = full ? `<span class=\"addr-subtext\">${escapeHtml(full)}</span>` : '';\n\n      suggestEl.innerHTML = `\n        <div class=\"addr-item is-pinned\" data-placeid=\"${escapeHtml(pid)}\">\n          <div class=\"addr-lines\">\n            <div class=\"addr-sub\">${fullSpan}</div>\n          </div>\n          ${chip}\n        </div>\n        <div class=\"addr-skel\" aria-hidden=\"true\">\n          ${Array.from({ length: 3 }).map(() => `\n            <div class=\"addr-skel-item\">\n              <div class=\"addr-skel-lines\">\n                <div class=\"addr-skel-line\"></div>\n                <div class=\"addr-skel-line small\"></div>\n              </div>\n            </div>\n          `).join('')}\n        </div>\n      `;\n\n      const row = suggestEl.querySelector('.addr-item.is-pinned');\n      if (row) row.addEventListener('click', async () => {\n        try { input.value = full; } catch(_) {}\n        try { suggestEl.style.display = 'none'; } catch(_) {}\n        try { await resolveAddress(pid, input, { placeId: pid, display: full }); } catch(_) {}\n      });\n    }\n\n\nfunction renderSuggestions(list, container, input) {\n    // 1. Filtra risultati API (Google)\n    let filtered = __filterAndSortSuggestions(list);\n    const q = String(input && input.value || '').trim();\n\n    // 2. RECUPERA MATCH LOCALE (Salvati/Recenti)\n    // Usiamo la funzione fixata sopra\n    try {\n        const m = __addrBookBestMatch(q);\n        \n        if (m && m.entry && m.entry.placeId) {\n            const match = m.entry;\n            const scope = m.scope || '';\n            const pid = String(match.placeId || '').trim();\n            const savedName = match.name || __addrBookSavedName(pid);\n\n            if (pid) {\n                // Rimuovi dai risultati API se \u00E8 gi\u00E0 presente (evita duplicati)\n                filtered = filtered.filter(x => String(x.placeId || x.place_id || '').trim() !== pid);\n                \n                // Crea l'oggetto \"Pinned\"\n                const pinned = {\n                    placeId: pid,\n                    display: match.display,\n                    text: match.display, // Fallback per formattazione\n                    // Campi speciali per il render\n                    __postcode: match.postcode || '',\n                    __fromBook: true,\n                    __bookScope: scope,\n                    __bookName: savedName\n                };\n\n                // METTI IN CIMA ALLA LISTA\n                filtered.unshift(pinned);\n            }\n        }\n    } catch (e) { console.warn(\"Local match error\", e); }\n\n    // 3. Se la lista combinata \u00E8 vuota, mostra messaggio\n    if (!filtered || filtered.length === 0) {\n        try { container.removeAttribute('data-skel'); } catch(_) {}\n        container.style.display = 'block';\n        container.innerHTML = `<div class=\"addr-loading\" style=\"padding:12px; font-size:13px; color:#999;\">Nessun risultato. Prova a scrivere <b>via</b> + <b>numero civico</b>.</div>`;\n        return;\n    }\n    \n    // 4. Render HTML\n    container.innerHTML = filtered.map((item, idx) => {\n        const s = __formatAddrSuggestion(item);\n        \n        // Logica Chips (CAP o Civico)\n        const hasCap = !!(s.__postcode && /^\\d{5}$/.test(String(s.__postcode)));\n        const hasNumber = (item.hasNumber === true || item.hasNumber === false) \n            ? item.hasNumber \n            : /\\d/.test(s.__mainShort || s.display || '');\n\n        // Chip destro (Nome salvato es. \"Casa\" o Taglio Preferiti)\n        const isPinned = !!item.__fromBook;\n        const bookName = (item.__bookName) ? String(item.__bookName) : '';\n        \n        let rightChip = '';\n        if (bookName) {\n            rightChip = `<div class=\"addr-right\"><span class=\"addr-saved-chip\" title=\"${escapeHtml(bookName)}\">${escapeHtml(bookName)}</span></div>`;\n        } else if (isPinned && item.__bookScope === 'recent') {\n             // Opzionale: icona orologio per recenti\n             // rightChip = `<div class=\"addr-right\" style=\"opacity:0.5\">\u21BA</div>`;\n        }\n\n        const extraClass = isPinned ? ' is-pinned' : '';\n        const secondary = Array.from(new Set(String(s.__subNoCap || '')\n            .split(',')\n            .map(part => part.trim().replace(/^Citt\u00E0 metropolitana di Roma Capitale$/i, 'Roma'))\n            .filter(part => part && !/^Italia$/i.test(part))))\n            .slice(0, 3)\n            .join(', ');\n\n        return `\n          <div class=\"addr-item${extraClass}\" data-idx=\"${idx}\">\n            <div class=\"addr-lines\">\n              <div class=\"addr-main\">${escapeHtml(String(s.__mainShort || s.display || '').trim())}</div>\n              ${secondary ? `<div class=\"addr-sub\"><span class=\"addr-subtext\">${escapeHtml(secondary)}</span></div>` : ''}\n            </div>\n            ${rightChip}\n          </div>`;\n    }).join('');\n\n    try { container.removeAttribute('data-skel'); } catch(_) {}\n    container.style.display = 'block';\n\n    // 5. Gestione Click\n    container.querySelectorAll('.addr-item').forEach(el => {\n        el.addEventListener('click', async () => {\n            const item = filtered[el.dataset.idx];\n            // Se \u00E8 pinned, usiamo i suoi dati puliti\n            const s = __formatAddrSuggestion(item);\n            \n            input.value = s.display;\n            container.style.display = 'none';\n            \n            await resolveAddress(item.placeId, input, s);\n        });\n    });\n}\n\n\n\n    // --- RESOLVE LOGIC (The Fix) ---\n    async function resolveAddress(placeId, input, suggestionObj) {\n        setLoading(true);\n\n        const queryNow = String((input && input.value) || (suggestionObj && suggestionObj.display) || '').trim();\n        const pid = String(placeId || '').trim();\n        const attemptId = __newAddressAttemptId('home_florame');\n\n        try {\n            const token = ensureSessionToken(input);\n            const url = `${CONFIG.addressResolve}?placeId=${encodeURIComponent(pid)}&sessionToken=${encodeURIComponent(token)}`;\n            \n            const res = await fetch(url);\n            const data = await res.json();\n            const place = data.place || data || {};\n\n            // 1. Extract CAP (robusto: backend + parsing testo)\n            const resolvedCapRaw = String(place.postalCode || place.postcode || '').trim();\n            const isAddress = !!place.isAddress; // Backend logic\n\n            const addressComponents = Array.isArray(place.addressComponents) ? place.addressComponents : [];\n            let resolvedDisplay = __canonicalItalianAddress(place.display || place.formattedAddress || suggestionObj.display || input.value, addressComponents);\n\n            const guessedCap =\n                (resolvedDisplay.match(/\\b(\\d{5})\\b/) || [])[1] ||\n                (String(suggestionObj && suggestionObj.display || '').match(/\\b(\\d{5})\\b/) || [])[1] ||\n                (String(input && input.value || '').match(/\\b(\\d{5})\\b/) || [])[1] ||\n                '';\n\n            const resolvedCap = (/^\\d{5}$/.test(resolvedCapRaw) ? resolvedCapRaw : (guessedCap || ''));\n            const formattedAddress = String(place.formattedAddress || place.display || resolvedDisplay || '').trim();\n\n            // Assicura che il CAP sia presente nel testo mostrato\n            if (resolvedCap && !new RegExp(`\\\\b${resolvedCap}\\\\b`).test(resolvedDisplay)) {\n                resolvedDisplay = (resolvedDisplay ? `${resolvedDisplay}, ${resolvedCap}` : resolvedCap);\n            }\n\n            // 2. UNIFIED VALIDATION:\n            // Trust the backend 'isAddress' flag OR a valid CAP.\n            // Do NOT parse address_components manually for 'street_number' here.\n            if (!isAddress || !/^\\d{5}$/.test(resolvedCap)) {\n                showError(\"Indirizzo incompleto: scegli una via + numero civico dai suggerimenti (es. \u201CVia \u2026 12, Roma\u201D).\");\n                try {\n                    __logAddressAttempt({\n                        context: 'home_florame',\n                        source: 'cap_modal',\n                        status: 'invalid_address',\n                        attemptId,\n                        query: queryNow,\n                        display: String(resolvedDisplay || (input && input.value) || ''),\n                        resolvedDisplay: String(resolvedDisplay || ''),\n                        formattedAddress,\n                        addressComponents,\n                        placeId: pid,\n                        cap: resolvedCap || '',\n                        isAddress: false,\n                        reason: 'INVALID_OR_MISSING_CAP'\n                    });\n                } catch (_) {}\n                setLoading(false);\n                return;\n            }\n\n            // 3. Save Last Address (Unified Style)\n            try { \n                localStorage.setItem(ADDR_CACHE_KEY, JSON.stringify({ \n                    display: resolvedDisplay, \n                    postcode: resolvedCap, \n                    placeId: placeId, \n                    ts: Date.now() \n                }));\n                try { __addrBookUpsertRecent({ placeId: placeId, display: resolvedDisplay, postcode: String(resolvedCap || '') }); } catch (_) {}\n \n            } catch (_) {}\n\n            // 4. Verify Stock\n            await verifyStock(resolvedCap, resolvedDisplay, {\n                userInitiated: true,\n                context: 'home_florame',\n                source: 'cap_modal',\n                attemptId,\n                query: queryNow,\n                placeId: pid,\n                display: resolvedDisplay,\n                resolvedDisplay,\n                formattedAddress,\n                addressComponents,\n                lat: Number.isFinite(Number(place.lat)) ? Number(place.lat) : null,\n                lng: Number.isFinite(Number(place.lng)) ? Number(place.lng) : null,\n                street: String(place.street || __addressComponentValue(addressComponents, 'route') || '').trim(),\n                houseNumber: String(place.houseNumber || __addressComponentValue(addressComponents, 'street_number') || '').trim(),\n                city: String(place.city || __addressComponentValue(addressComponents, 'locality') || __addressComponentValue(addressComponents, 'postal_town') || '').trim(),\n                province: String(place.province || __addressComponentValue(addressComponents, 'administrative_area_level_2') || '').trim(),\n                isAddress: true\n            });\n\n        } catch (e) {\n            console.error(e);\n            try {\n                __logAddressAttempt({\n                    context: 'home_florame',\n                    source: 'cap_modal',\n                    status: 'resolve_error',\n                    attemptId,\n                    query: queryNow,\n                    display: String((input && input.value) || ''),\n                    placeId: pid,\n                    reason: String(e && e.message || e || 'resolve_error')\n                });\n            } catch (_) {}\n            showError(\"Errore nel recupero dell'indirizzo. Riprova.\");\n            setLoading(false);\n        }\n        resetSessionToken(input);\n    }\n\n    async function verifyStock(cap, displayAddr, meta = {}) {\n\n        const ctx = String((meta && meta.context) || 'home_florame');\n        const userInitiated = !!(meta && meta.userInitiated);\n        const placeId = String((meta && (meta.placeId || meta.selectedPlaceId)) || '').trim();\n        const query = String((meta && meta.query) || '').trim();\n        const attemptId = String((meta && meta.attemptId) || __newAddressAttemptId(ctx)).trim();\n        const resolvedDisplay = String((meta && (meta.resolvedDisplay || meta.display)) || displayAddr || '').trim();\n        const formattedAddress = String((meta && meta.formattedAddress) || resolvedDisplay || displayAddr || '').trim();\n        const addressComponents = Array.isArray(meta && meta.addressComponents) ? meta.addressComponents : [];\n\n        try {\n\n            if (userInitiated) {\n                try {\n                    __logAddressAttempt({\n                        context: ctx,\n                        source: String((meta && meta.source) || 'cap'),\n                        status: 'start',\n                        attemptId,\n                        cap: String(cap || ''),\n                        display: String(displayAddr || ''),\n                        resolvedDisplay,\n                        formattedAddress,\n                        addressComponents,\n                        placeId,\n                        query,\n                        isAddress: (meta && typeof meta.isAddress === 'boolean') ? meta.isAddress : undefined\n                    });\n                } catch (_) {}\n            }\n\n            const res = await (window.FlorameReadCache?.fetch || window.fetch)(__stockEndpointUrl(cap, meta));\n\n            let data = null;\n            try { data = await res.json(); } catch(_) {}\n\n            if (!res.ok) throw new Error(data?.message || \"Errore server\");\n\n            if (data && data.covered === false) {\n                const assignment = __partnerAssignmentFromResponse(data);\n                const uncoveredState = {\n                    cap: String(cap || ''),\n                    display: String(displayAddr || ''),\n                    verified: false,\n                    addressVerified: true,\n                    covered: false,\n                    ts: Date.now(),\n                    pairs: [],\n                    cameraId: '',\n                    partner: data.partner || null,\n                     lat: Number.isFinite(Number(meta.lat)) ? Number(meta.lat) : null,\n                     lng: Number.isFinite(Number(meta.lng)) ? Number(meta.lng) : null,\n                     deliveryLat: Number.isFinite(Number(meta.lat)) ? Number(meta.lat) : null,\n                     deliveryLng: Number.isFinite(Number(meta.lng)) ? Number(meta.lng) : null,\n                     placeId,\n                     street: String(meta.street || '').trim(),\n                     houseNumber: String(meta.houseNumber || '').trim(),\n                     city: String(meta.city || '').trim(),\n                     province: String(meta.province || '').trim(),\n                     civicVerified: !!String(meta.houseNumber || '').trim(),\n                     ...assignment\n                };\n                try { localStorage.setItem(STORAGE_KEY, JSON.stringify(uncoveredState)); } catch (_) {}\n                try {\n                    document.dispatchEvent(new CustomEvent('stock-updated'));\n                    document.dispatchEvent(new CustomEvent('cap-check-finish', { detail: uncoveredState }));\n                } catch (_) {}\n                showError(buildNotServedHtml(data, cap, { address: displayAddr, placeId, context: ctx, query }), { html: true });\n\n                if (userInitiated) {\n                    try {\n                        __logAddressAttempt({\n                            context: ctx,\n                            source: String((meta && meta.source) || 'cap'),\n                            status: 'not_served',\n                            attemptId,\n                            cap: String(cap || ''),\n                            display: String(displayAddr || ''),\n                            resolvedDisplay,\n                            formattedAddress,\n                            addressComponents,\n                            placeId,\n                            query,\n                            isAddress: (meta && typeof meta.isAddress === 'boolean') ? meta.isAddress : undefined,\n                            covered: false,\n                            reason: data.errorCode || 'OUT_OF_COVERAGE'\n                        });\n                    } catch (_) {}\n                }\n\n                return;\n            }\n\n            if (!data || !data.success) throw new Error(data?.message || \"Errore sconosciuto\");\n\n            // Success\n            const pairs = data.pairs || [];\n            const assignment = __partnerAssignmentFromResponse(data);\n            const state = { \n                cap: cap, \n                display: displayAddr, \n                verified: true, \n                addressVerified: true,\n                covered: data.covered !== false,\n                ts: Date.now(), \n                pairs: pairs,\n                cameraId: (data && (data.cameraId || data.camera_id) ? String(data.cameraId || data.camera_id) : (Array.isArray(pairs) && pairs[0] ? String((pairs[0].cameraId || pairs[0].camera_id || pairs[0].id || pairs[0].camera || pairs[0].cam || (Array.isArray(pairs[0]) ? pairs[0][0] : '')) || '') : '')),\n                partner: data.partner || null,\n                 lat: Number.isFinite(Number(meta.lat)) ? Number(meta.lat) : null,\n                 lng: Number.isFinite(Number(meta.lng)) ? Number(meta.lng) : null,\n                 deliveryLat: Number.isFinite(Number(meta.lat)) ? Number(meta.lat) : null,\n                 deliveryLng: Number.isFinite(Number(meta.lng)) ? Number(meta.lng) : null,\n                 placeId,\n                 street: String(meta.street || '').trim(),\n                 houseNumber: String(meta.houseNumber || '').trim(),\n                 city: String(meta.city || '').trim(),\n                 province: String(meta.province || '').trim(),\n                 civicVerified: !!String(meta.houseNumber || '').trim(),\n                 ...assignment\n            };\n\n            // Persist\n            localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n\n            // Global Events\n            document.dispatchEvent(new CustomEvent('stock-updated'));\n            document.dispatchEvent(new CustomEvent('cap-check-finish', { detail: state }));\n\n            syncUI();\n\n            if (userInitiated) {\n                try {\n                    __logAddressAttempt({\n                        context: ctx,\n                        source: String((meta && meta.source) || 'cap'),\n                        status: 'success',\n                        attemptId,\n                        cap: String(cap || ''),\n                        display: String(displayAddr || ''),\n                        resolvedDisplay,\n                        formattedAddress,\n                        addressComponents,\n                        placeId,\n                        query,\n                        isAddress: (meta && typeof meta.isAddress === 'boolean') ? meta.isAddress : undefined,\n                        covered: true\n                    });\n                } catch (_) {}\n            }\n\n        } catch (e) {\n\n            const msg = e && e.message ? e.message : \"Errore connessione.\";\n            showError(msg);\n\n            if (userInitiated) {\n                try {\n                    __logAddressAttempt({\n                        context: ctx,\n                        source: String((meta && meta.source) || 'cap'),\n                        status: 'error',\n                        attemptId,\n                        cap: String(cap || ''),\n                        display: String(displayAddr || ''),\n                        resolvedDisplay,\n                        formattedAddress,\n                        addressComponents,\n                        placeId,\n                        query,\n                        isAddress: (meta && typeof meta.isAddress === 'boolean') ? meta.isAddress : undefined,\n                        reason: String(msg || 'error')\n                    });\n                } catch (_) {}\n            }\n\n        } finally {\n            setLoading(false);\n        }\n    }\n\n\n    // --- AUTO RE-VERIFY AFTER RESTORE (Home) ---\n    // Se abbiamo un indirizzo/CAP verificato in cache, al reload rilanciamo la verifica\n    // per riallineare lo stock \"live\" senza richiedere click.\n    let __autoReverifyDone = false;\n\n    function autoReverifyAfterRestore() {\n        try {\n            if (__autoReverifyDone) return;\n            // evita collisioni con altre verifiche globali (se presenti)\n            if (window.__capCheckInProgress) return;\n\n            const st = getCapState();\n            if (!st || !st.cap || !st.verified || !st.fresh) return;\n\n            // Una verifica fresca contiene gia la decisione autorevole ottenuta con\n            // indirizzo preciso, coordinate e partner. Rifarla usando il solo CAP\n            // perderebbe quei vincoli e potrebbe revocare una copertura valida.\n            // Il normale TTL di getCapState() decide quando una nuova verifica e\n            // davvero necessaria; fino ad allora ripristiniamo soltanto la UI.\n            if (Array.isArray(st.pairs)) {\n                __autoReverifyDone = true;\n                syncUI();\n                return;\n            }\n\n            let displayTxt = st.display || st.cap;\n            let last = null;\n            try { last = JSON.parse(localStorage.getItem(ADDR_CACHE_KEY) || 'null'); } catch(_) { last = null; }\n            const lastMatchesCap = !!(last && last.display && (!last.postcode || String(last.postcode) === String(st.cap || '')));\n\n            // prefill input + dataset (utile se l'utente fa \"Cambia\" subito)\n            const addrInput = $('capAddressInput');\n            if (addrInput) {\n                addrInput.value = String(displayTxt || '');\n                addrInput.dataset.cap = String(st.cap || '');\n                if (lastMatchesCap && last.placeId) {\n                    const selected = { placeId: String(last.placeId), display: String(displayTxt || ''), __postcode: String(st.cap || last.postcode || '') };\n                    addrInput.dataset.selected = JSON.stringify(selected);\n                }\n            }\n\n            __autoReverifyDone = true;\n            setLoading(true);\n            Promise.resolve(verifyStock(String(st.cap), String(displayTxt), {\n                userInitiated: false,\n                context: 'home_restore',\n                source: 'auto_restore',\n                placeId: String(st.placeId || last?.placeId || ''),\n                lat: Number.isFinite(Number(st.deliveryLat ?? st.lat)) ? Number(st.deliveryLat ?? st.lat) : null,\n                lng: Number.isFinite(Number(st.deliveryLng ?? st.lng)) ? Number(st.deliveryLng ?? st.lng) : null,\n                street: String(st.street || ''),\n                houseNumber: String(st.houseNumber || ''),\n                city: String(st.city || ''),\n                province: String(st.province || ''),\n                isAddress: st.addressVerified === true\n            })).catch(() => {}).finally(() => {});\n        } catch (e) {\n            console.warn('autoReverifyAfterRestore failed', e);\n        }\n    }\n\n    // --- UI HELPERS ---\n    function setLoading(isLoading) {\n        const loader = $('capLoader'); \n        if (loader) loader.style.display = isLoading ? 'flex' : 'none';\n\n        // \u2705 HOME: nasconde la barra input durante la verifica disponibilit\u00E0\n        const inputView = $('capViewInput');\n        if (inputView) inputView.classList.toggle('cap-is-loading', !!isLoading);\n        const addrInput = $('capAddressInput');\n        if (addrInput) addrInput.disabled = !!isLoading;\n        if(isLoading) showError(null);\n    }\n    \n    \n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Friendly CAP/Address error copy + Not-served CTA (unified)\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    function normalizeCapErrorMsg(msg) {\n      try {\n        let m = String(msg || '').trim();\n        if (!m) return '';\n        const ml = m.toLowerCase();\n\n        // Do not touch rich HTML notices\n        if (m.includes('<div') || m.includes('<a') || m.includes('<span')) return m;\n\n        // Coverage / not served\n        if (ml.includes('non \u00E8 servita') || ml.includes('non \u00E8 ancora servita')) return m;\n\n        // Street number / civic number\n        if (ml.includes('numero civico') || ml.includes('civico') || ml.includes('street_number') || ml.includes('street number')) {\n          return \"Non risulta il numero civico indicato per questa via. Controlla il numero oppure scegli un civico vicino (es. \u201CVia \u2026 12, Roma\u201D) dai suggerimenti.\";\n        }\n\n        // Incomplete / not an address\n        if (ml.includes('indirizzo incompleto') || ml.includes('indirizzo completo') || ml.includes('seleziona un indirizzo') || ml.includes('scegli una via') || ml.includes('no_place_id')) {\n          return \"Indirizzo incompleto: scegli una via + numero civico dai suggerimenti (es. \u201CVia \u2026 12, Roma\u201D).\";\n        }\n\n        // Timeout / slow\n        if (ml.includes('timeout') || (ml.includes('riprova') && ml.includes('secondo')) || ml.includes('ci stiamo mettendo')) {\n          return \"Ci stiamo mettendo un attimo\u2026 riprova tra qualche secondo.\";\n        }\n\n        // Connection\n        if (ml.includes('connessione') || ml.includes('network') || ml.includes('failed to fetch')) {\n          return \"Connessione instabile. Riprova tra qualche secondo.\";\n        }\n\n        // Generic server\n        if (ml.includes('errore server') || ml.startsWith('http ')) {\n          return \"Ops, c\u2019\u00E8 stato un problema tecnico. Riprova tra poco.\";\n        }\n\n        return m;\n      } catch (_) {\n        return String(msg || '');\n      }\n    }\n\n    \n    function escapeHtml(str) {\n      return String(str || '')\n        .replaceAll('&', '&amp;')\n        .replaceAll('<', '&lt;')\n        .replaceAll('>', '&gt;')\n        .replaceAll('\"', '&quot;')\n        .replaceAll(\"'\", '&#39;');\n    }\n\nfunction buildNotServedHtml(data, cap, meta) {\n      const msg = (data && data.message) ? String(data.message) : \"Ci dispiace \uD83D\uDC94: la zona selezionata non \u00E8 servita dal servizio.\";\n      const details = (data && data.details) ? String(data.details) : \"Vuoi che ti avvisiamo appena iniziamo a consegnare l\u00EC? Ci aiuti tantissimo a scegliere le prossime zone da raggiungere.\";\n      const address = meta && meta.address ? String(meta.address) : \"\";\n      const placeId = meta && meta.placeId ? String(meta.placeId) : \"\";\n      const context = meta && meta.context ? String(meta.context) : \"cap\";\n      const prefillEmail = (() => {\n        try {\n          const direct = (window.AWI_CUSTOMER_EMAIL || window.__AWI_CUSTOMER_EMAIL || window.customerEmail || '') || '';\n          if (direct && /.+@.+\\..+/.test(String(direct))) return String(direct).trim();\n        } catch (_) {}\n        try {\n          const ls = localStorage.getItem('florame_customer_email') || '';\n          if (ls && /.+@.+\\..+/.test(String(ls))) return String(ls).trim();\n        } catch (_) {}\n        return '';\n      })();\n\n      const privacyUrl = (CONFIG && CONFIG.privacyUrl) ? String(CONFIG.privacyUrl) : \"/policies/privacy-policy\";\n\n      return `\n        <div class=\"cap-not-served\" data-cap=\"${escapeHtml(cap || '')}\" data-address=\"${escapeHtml(address)}\" data-place-id=\"${escapeHtml(placeId)}\" data-context=\"${escapeHtml(context)}\">\n          <div class=\"cap-not-served-title\">${escapeHtml(msg)}</div>\n          <div class=\"cap-not-served-body\">${escapeHtml(details)}</div>\n\n          <form class=\"cap-wl-form\" novalidate>\n            <input class=\"cap-wl-input\" type=\"email\" inputmode=\"email\" autocomplete=\"email\"\n              placeholder=\"Inserisci la tua email\" value=\"${escapeHtml(prefillEmail)}\" />\n            <button class=\"cap-wl-btn\" type=\"submit\">Invia</button>\n          </form>\n\n          <div class=\"cap-wl-msg\" aria-live=\"polite\"></div>\n\n          <div class=\"cap-not-served-foot\">Ci aiuti a scegliere le prossime zone: \u00E8 una metrica fondamentale per la nostra espansione \u2728</div>\n          <a class=\"cap-wl-privacy\" href=\"${escapeHtml(privacyUrl)}\" target=\"_blank\" rel=\"noopener\">Privacy</a>\n        </div>\n      `;\n    }\n\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // \uD83D\uDCE9 Coverage Waitlist (CAP non servito) \u2014 raccolta email\n    // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const __COV_WL_SENT_PREFIX = 'florame_covwl_sent_v1::';\n    const __COV_WL_SESSION_KEY = 'florame_covwl_session_v1';\n\n    function __covWlGetEndpoint() {\n      return (CONFIG && CONFIG.coverageWaitlistEndpoint)\n        ? String(CONFIG.coverageWaitlistEndpoint)\n        : \"https://us-central1-flower-ai-2d7aa.cloudfunctions.net/collectCoverageWaitlist\";\n    }\n\n    function __covWlGetUtm() {\n      try {\n        const sp = new URLSearchParams(window.location.search || '');\n        const keys = ['utm_source','utm_medium','utm_campaign','utm_term','utm_content'];\n        const out = {};\n        keys.forEach(k => { const v = sp.get(k); if (v) out[k] = v; });\n        return Object.keys(out).length ? out : null;\n      } catch (_) { return null; }\n    }\n\n    function __covWlGetSessionId() {\n      try {\n        const existing = sessionStorage.getItem(__COV_WL_SESSION_KEY);\n        if (existing) return existing;\n      } catch (_) {}\n      const sid = (Math.random().toString(16).slice(2) + Date.now().toString(16)).slice(0, 32);\n      try { sessionStorage.setItem(__COV_WL_SESSION_KEY, sid); } catch (_) {}\n      return sid;\n    }\n\n    function __covWlIsValidEmail(email) {\n      const e = String(email || '').trim();\n      return /.+@.+\\..+/.test(e);\n    }\n\n    function __covWlAlreadySent(cap) {\n      try { return !!localStorage.getItem(__COV_WL_SENT_PREFIX + String(cap || '')); } catch (_) { return false; }\n    }\n\n    function __covWlMarkSent(cap) {\n      try { localStorage.setItem(__COV_WL_SENT_PREFIX + String(cap || ''), String(Date.now())); } catch (_) {}\n    }\n\n    function __ensureCoverageWaitlistHandlers() {\n      if (window.__florameCoverageWaitlistBound) return;\n      window.__florameCoverageWaitlistBound = true;\n\n      document.addEventListener('submit', async (e) => {\n        const form = e.target && e.target.closest ? e.target.closest('.cap-wl-form') : null;\n        if (!form) return;\n\n        e.preventDefault();\n\n        const wrap = form.closest('.cap-not-served');\n        const input = form.querySelector('.cap-wl-input');\n        const btn = form.querySelector('.cap-wl-btn');\n        const msgEl = wrap ? wrap.querySelector('.cap-wl-msg') : null;\n\n        const cap = wrap ? String(wrap.dataset.cap || '').trim() : '';\n        const address = wrap ? String(wrap.dataset.address || '').trim() : '';\n        const placeId = wrap ? String(wrap.dataset.placeId || '').trim() : '';\n        const context = wrap ? String(wrap.dataset.context || 'cap').trim() : 'cap';\n\n        const email = input ? String(input.value || '').trim().toLowerCase() : '';\n\n        const setMsg = (t, ok) => {\n          if (!msgEl) return;\n          msgEl.textContent = t || '';\n          msgEl.classList.toggle('ok', !!ok);\n          msgEl.classList.toggle('err', !ok);\n        };\n\n        if (!__covWlIsValidEmail(email)) {\n          setMsg('Inserisci un\u2019email valida.', false);\n          input && input.focus && input.focus();\n          return;\n        }\n\n        if (cap && __covWlAlreadySent(cap)) {\n          setMsg('Grazie! Ti abbiamo gi\u00E0 inserito in lista per questo CAP.', true);\n          return;\n        }\n\n        try {\n          setMsg('Invio\u2026', true);\n          if (btn) btn.disabled = true;\n\n          const payload = {\n            email,\n            cap: cap || '',\n            address: address || '',\n            placeId: placeId || '',\n            context,\n            sessionId: __covWlGetSessionId(),\n            page: window.location.href,\n            referrer: document.referrer || '',\n            locale: navigator.language || '',\n            tz: (Intl && Intl.DateTimeFormat) ? (Intl.DateTimeFormat().resolvedOptions().timeZone || '') : '',\n            ua: navigator.userAgent || '',\n            utm: __covWlGetUtm()\n          };\n\n          const resp = await fetch(__covWlGetEndpoint(), {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(payload),\n            keepalive: true\n          });\n\n          let out = null;\n          try { out = await resp.json(); } catch (_) {}\n\n          if (!resp.ok || !out || !out.ok) {\n            throw new Error((out && out.message) ? out.message : 'Errore invio');\n          }\n\n          __covWlMarkSent(cap || '');\n          try { localStorage.setItem('florame_customer_email', email); } catch (_) {}\n          try {\n            __logAddressAttempt({\n              source: 'coverage_waitlist',\n              context,\n              status: 'not_served',\n              covered: false,\n              query: address || cap || '',\n              display: address || '',\n              resolvedDisplay: address || '',\n              resolvedCap: cap || '',\n              placeId,\n              customerEmail: email,\n              marketingConsent: false\n            });\n          } catch (_) {}\n\n          try {\n            if (window.dataLayer && typeof window.dataLayer.push === 'function') {\n              window.dataLayer.push({ event: 'coverage_waitlist_submit', cap: cap || '', context });\n            }\n          } catch (_) {}\n\n          setMsg('Grazie! Ti avviseremo appena consegniamo in zona \uD83D\uDC8C', true);\n          if (input) input.disabled = true;\n          if (btn) { btn.disabled = true; btn.textContent = 'Inviato'; }\n        } catch (err) {\n          setMsg('Non siamo riusciti a registrare la richiesta. Riprova tra poco.', false);\n          if (btn) btn.disabled = false;\n        }\n      }, true);\n    }\n\n    // Bind handlers subito (delegato, non pesa)\n    __ensureCoverageWaitlistHandlers();\nfunction showError(msg, opts = {}) {\n        const box = $('capMsg');\n        if (!box) return;\n\n        if (!msg) {\n          box.style.display = 'none';\n          box.textContent = '';\n          return;\n        }\n\n        const useHtml = !!opts.html;\n        box.setAttribute('role', 'alert');\n        const safeMsg = useHtml ? String(msg) : normalizeCapErrorMsg(msg);\n\n        if (useHtml) box.innerHTML = safeMsg;\n        else box.textContent = safeMsg;\n\n        box.style.display = 'block';\n    }\n\n    function syncUI() {\n        const state = getCapState();\n        const inputView = $('capViewInput');\n        if (inputView) inputView.style.display = 'block';\n        \n        if (state.verified && state.fresh) {\n            // Header e card consumano lo stesso display canonico, gi\u00E0 validato\n            // contro il CAP salvato da FlorameHomeAddress.readState().\n            let displayTxt = state.display || state.cap;\n            let last = null;\n            try { last = JSON.parse(localStorage.getItem(ADDR_CACHE_KEY) || 'null'); } catch(_) { last = null; }\n\n            // \u2705 Ripristina anche il valore input + dataset (utile per auto-verifica e per \"Cambia\")\n            const addrInput = $('capAddressInput');\n            if (addrInput) {\n                addrInput.value = String(displayTxt || '');\n                addrInput.dataset.cap = String(state.cap || '');\n                if (last && last.placeId) {\n                    const selected = { placeId: String(last.placeId), display: String(displayTxt || ''), __postcode: String(state.cap || last.postcode || '') };\n                    addrInput.dataset.selected = JSON.stringify(selected);\n                }\n            }\n\n            try {\n              if (window.FlorameHomeAddress && typeof window.FlorameHomeAddress.updateSummary === 'function') {\n                window.FlorameHomeAddress.updateSummary(displayTxt, true);\n              }\n              const addressSection = document.querySelector('[data-home-address-section]');\n              if (addressSection) addressSection.removeAttribute('data-address-requested');\n              if (window.FlorameHomeAddress && typeof window.FlorameHomeAddress.close === 'function') {\n                window.FlorameHomeAddress.close({ restoreFocus: false });\n              }\n            } catch (_) {}\n        } else {\n            try {\n              if (window.FlorameHomeAddress && typeof window.FlorameHomeAddress.updateSummary === 'function') {\n                window.FlorameHomeAddress.updateSummary('', false);\n              }\n            } catch (_) {}\n        }\n    }\n\n    // --- INIT ---\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', initInlineModule);\n    } else {\n        initInlineModule();\n    }\n})();\n\n\n// --- FIX: Helper mancante ---\nfunction __cleanAddress(str) { \n  // Rimuove spazi extra e normalizza\n  return String(str || '').trim(); \n}\n\n// --- FIX: Best Match pi\u00F9 robusto ---\nfunction __addrBookBestMatch(typed) {\n  const raw = String(typed || '').trim();\n  if (!raw) return null;\n\n  // Usa cleanAddress e poi normalizza per il confronto\n  const t = __addrKeyLoose(__cleanAddress(raw));\n  const tCompactLen = t.replace(/\\s/g, '').length;\n  if (!t) return null;\n\n  const { saved, recent } = __addrBookSections();\n\n  const scoreOf = (entry) => {\n    const cand = __addrKeyLoose(__cleanAddress(String(entry?.display || '')));\n    if (!cand) return 0;\n\n    // 1. Corrispondenza Esatta\n    if (cand === t) return 100;\n\n    // 2. Prefisso forte (Es. Tu scrivi \"Via Ro\", salvato \u00E8 \"Via Roma\")\n    // Questo \u00E8 fondamentale mentre si digita\n    if (cand.startsWith(t)) return 95; \n\n    // 3. Inverso (Es. Tu scrivi \"Via Roma 10\", salvato \u00E8 \"Via Roma\")\n    if (t.startsWith(cand) && cand.length > 5) return 90;\n\n    // Richiede almeno 3 caratteri digitati per fuzzy/contains\n    if (tCompactLen < 3) return 0;\n\n    // 4. Contiene la stringa (Es. Scrivi \"Roma\", salvato \"Via Roma\")\n    if (cand.includes(t)) return 85;\n\n    // 5. Token Overlap (parole sparse)\n    const toks = t.split(' ').filter(Boolean).filter(x => x.length >= 2);\n    if (!toks.length) return 0;\n\n    let hit = 0;\n    for (const tok of toks) {\n      if (cand.includes(tok)) hit++;\n    }\n    const ratio = hit / toks.length;\n\n    if (ratio === 1) return 80; // Tutti i token presenti\n    if (ratio >= 0.75) return 70; // Buona parte\n\n    return 0;\n  };\n\n  let best = null;\n  let bestScope = '';\n  let bestScore = 0;\n\n  const scan = (arr, scope) => {\n    for (const e of (arr || [])) {\n      const sc = scoreOf(e);\n      // Priorit\u00E0 ai salvati rispetto ai recenti a parit\u00E0 di score\n      if (sc > bestScore || (sc === bestScore && bestScope !== 'saved' && scope === 'saved')) {\n        best = e; bestScope = scope; bestScore = sc;\n      }\n    }\n  };\n\n  scan(saved, 'saved');\n  scan(recent, 'recent');\n\n  if (!best || !best?.placeId) return null;\n\n  // Soglia minima per mostrare il risultato (65 permette risultati parziali buoni)\n  if (bestScore < 65) return null;\n\n  return { entry: best, scope: bestScope, score: bestScore };\n}\n"],
  "mappings": "CAKC,UAAY,CACT,MAAM,OAAS,CACX,cAAe,uEACf,oBAAqB,6EACrB,eAAgB,wEAChB,yBAA0B,wFAC1B,yBAA0B,iFAC1B,WAAY,2BACZ,cAAe,IACnB,EAEM,YAAc,oBACd,eAAiB,uBACjB,EAAK,IAAO,SAAS,eAAe,EAAE,EAE5C,SAAS,cAAc,MAAO,CAC1B,OAAO,OAAO,OAAS,EAAE,EACpB,KAAK,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,mBAAoB,EAAE,EAC9B,QAAQ,cAAe,GAAG,EAC1B,QAAQ,WAAY,EAAE,CAC/B,CAEA,SAAS,wBAAyB,CAC9B,GAAI,CACA,MAAM,OAAS,IAAI,gBAAgB,OAAO,SAAS,QAAU,EAAE,EACzD,SAAW,cAAc,OAAO,IAAI,SAAS,GAAK,OAAO,IAAI,aAAa,GAAK,EAAE,EACvF,GAAI,SAAU,OAAO,QACzB,MAAY,CAAC,CACb,GAAI,CACA,MAAM,WAAa,cAAc,OAAO,gBAAgB,qBAAqB,GAAG,aAAe,EAAE,EACjG,GAAI,WAAY,OAAO,UAC3B,MAAY,CAAC,CACb,GAAI,CACA,MAAM,QAAU,OAAO,kBAAoB,CAAC,EACtC,SAAW,cAAc,QAAQ,QAAQ,aAAe,QAAQ,aAAe,QAAQ,MAAQ,QAAQ,WAAa,EAAE,EAC5H,GAAI,SAAU,OAAO,QACzB,MAAY,CAAC,CACb,GAAI,CACA,OAAO,cAAc,KAAK,MAAM,eAAe,QAAQ,4BAA4B,GAAK,MAAM,GAAG,MAAQ,EAAE,CAC/G,MAAY,CACR,MAAO,EACX,CACJ,CAEA,SAAS,mBAAmB,IAAK,KAAO,CAAC,EAAG,CACxC,MAAM,IAAM,IAAI,IAAI,OAAO,cAAe,OAAO,SAAS,MAAM,EAChE,IAAI,aAAa,IAAI,MAAO,OAAO,KAAO,EAAE,CAAC,EAC7C,MAAM,IAAM,OAAO,KAAK,GAAG,EACrB,IAAM,OAAO,KAAK,GAAG,EACvB,OAAO,SAAS,GAAG,GAAK,OAAO,SAAS,GAAG,IAC3C,IAAI,aAAa,IAAI,MAAO,OAAO,GAAG,CAAC,EACvC,IAAI,aAAa,IAAI,MAAO,OAAO,GAAG,CAAC,GAE3C,MAAM,iBAAmB,uBAAuB,EAChD,OAAI,kBAAkB,IAAI,aAAa,IAAI,cAAe,gBAAgB,EACnE,IAAI,SAAS,CACxB,CAEA,SAAS,gCAAgC,KAAM,CAC3C,MAAM,iBAAmB,uBAAuB,EAC1C,QAAU,MAAQ,KAAK,SAAW,OAAO,KAAK,SAAY,SAAW,KAAK,QAAU,KACpF,eAAiB,cAAc,SAAS,aAAe,SAAS,WAAa,EAAE,EAC/E,iBAAmB,OAAO,SAAS,SAAW,kBAAoB,iBAAmB,iBAAmB,eAAiB,GAAG,EAAE,KAAK,EACnI,eAAiB,OAAO,kBAAoB,CAAC,EAC7C,iBAAmB,IAAI,IAAI,CAC7B,iBACA,cAAc,eAAe,QAAQ,aAAe,EAAE,EACtD,cAAc,eAAe,aAAe,EAAE,EAC9C,cAAc,eAAe,MAAQ,EAAE,EACvC,cAAc,eAAe,WAAa,EAAE,EAC5C,cAAc,eAAe,IAAM,EAAE,CACzC,EAAE,OAAO,OAAO,CAAC,EAMX,mBALiB,CACnB,eACA,cAAc,SAAS,WAAa,EAAE,EACtC,cAAc,SAAS,IAAM,EAAE,CACnC,EAAE,OAAO,OAAO,EAC0B,KAAM,OAAU,iBAAiB,IAAI,KAAK,CAAC,EAC/E,gBAAmB,iBAEnB,CAAC,EACC,MAAM,UAAY,KACd,mBAAqB,gBAAkB,qBACxC,mBAAqB,gBAJzB,MAAM,UAAY,GAMzB,MAAO,CACH,iBAAkB,kBAAoB,GACtC,qBAAsB,kBAAoB,GAC1C,eAAgB,gBAAkB,GAClC,mBAAoB,gBAAkB,GACtC,mBAAoB,OAAO,SAAS,MAAQ,EAAE,EAAE,KAAK,EACrD,oBAAqB,iBAAmB,gBAAkB,GAC1D,iBACA,gBACA,uBAAwB,gBACxB,cAAe,iBACR,gBAAkB,UAAY,YAC/B,UACN,cAAe,MAAM,UAAY,EACrC,CACJ,CAMA,MAAM,qBAAuB,2EACvB,eAAiB,yBAEvB,SAAS,gBAAiB,CACtB,GAAI,CACA,MAAM,SAAW,aAAa,QAAQ,cAAc,EACpD,GAAI,SAAU,OAAO,SACrB,MAAM,IAAO,OAAO,QAAU,OAAO,OAAO,OAAO,YAAe,WAC5D,OAAO,OAAO,WAAW,EACxB,OAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAI,KAAK,IAAI,EAAE,SAAS,EAAE,EAC5E,oBAAa,QAAQ,eAAgB,GAAG,EACjC,GACX,MAAY,CACR,MAAO,OAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CACtD,CACJ,CAEA,SAAS,sBAAsB,OAAQ,CACnC,GAAI,CACA,MAAM,GAAM,OAAO,QAAU,OAAO,OAAO,OAAO,YAAe,WAC3D,OAAO,OAAO,WAAW,EACxB,KAAK,IAAI,EAAE,SAAS,EAAE,EAAI,IAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EACzE,OAAO,OAAO,QAAU,iBAAiB,EAAI,IAAM,EACvD,MAAY,CACR,OAAO,OAAO,QAAU,iBAAiB,EAAI,IAAM,KAAK,IAAI,EAAE,SAAS,EAAE,EAAI,IAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CACzH,CACJ,CAEA,SAAS,0BAA2B,CAChC,GAAI,CACA,IAAI,GAAK,GACT,GAAI,CAAE,GAAK,KAAK,eAAe,EAAE,gBAAgB,EAAE,UAAY,EAAI,MAAY,CAAC,CAChF,MAAO,CACH,KAAM,OAAQ,OAAO,UAAY,OAAO,SAAS,MAAS,EAAE,EAAE,MAAM,EAAG,GAAI,EAC3E,SAAU,OAAO,SAAS,UAAY,EAAE,EAAE,MAAM,EAAG,GAAI,EACvD,OAAQ,OAAQ,SAAS,iBAAmB,SAAS,gBAAgB,MAAS,UAAU,UAAY,EAAE,EAAE,MAAM,EAAG,EAAE,EACnH,GAAI,OAAO,IAAM,EAAE,EAAE,MAAM,EAAG,EAAE,CACpC,CACJ,MAAY,CAAE,MAAO,CAAC,CAAG,CAC7B,CAEA,SAAS,0BAA0B,EAAG,CAClC,GAAI,CACA,MAAM,QAAU,GAAK,CAAC,EAChB,OAAS,OAAO,QAAQ,QAAU,EAAE,EAAE,KAAK,EAC3C,EAAI,OAAO,QAAQ,OAAS,QAAQ,OAAS,QAAQ,SAAW,QAAQ,iBAAmB,EAAE,EAAE,KAAK,EACpG,EAAI,OAAO,QAAQ,SAAW,QAAQ,iBAAmB,QAAQ,OAAS,QAAQ,OAAS,EAAE,EAAE,KAAK,EAE1G,IAAI,OAAS,QAAQ,UACjB,OAAO,QAAW,YACd,SAAW,WAAa,SAAW,cAAgB,SAAW,QAAS,OAAS,IAC3E,SAAW,mBAAqB,SAAW,qBAAuB,SAAW,mBAAiB,OAAS,KAGpH,MAAM,IAAM,CAAE,GAAI,SAAW,CAAC,CAAG,EACjC,MAAI,CAAC,IAAI,OAAS,IAAG,IAAI,MAAQ,GAC7B,CAAC,IAAI,SAAW,IAAG,IAAI,QAAU,GACjC,OAAO,IAAI,WAAc,WAAa,OAAO,QAAW,YAAW,IAAI,UAAY,QAChF,GACX,MAAY,CAAE,OAAO,GAAK,CAAC,CAAG,CAClC,CAEA,SAAS,oBAAoB,QAAS,CAClC,GAAI,OAAO,uBAAwB,CAAE,OAAO,uBAAuB,KAAK,OAAO,EAAG,MAAQ,CAC1F,GAAI,CACA,MAAM,cAAgB,OACjB,UAAY,QAAQ,eAAiB,QAAQ,SAC7C,IAAM,CACH,GAAI,CACA,OAAO,OAAO,oBAAsB,OAAO,sBAAwB,OAAO,eAAiB,aAAa,QAAQ,wBAAwB,GAAK,EACjJ,MAAY,CAAE,MAAO,EAAI,CAC7B,GAAG,GACH,EACJ,EAAE,KAAK,EAAE,YAAY,EACf,KAAO,CAAE,GAAG,yBAAyB,EAAG,GAAG,0BAA0B,OAAO,EAAG,UAAW,eAAe,EAAG,aAAc,EAChI,MAAM,qBAAsB,CACxB,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,IAAI,EACzB,UAAW,EACf,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACrB,MAAY,CAAC,CACjB,CAIA,SAAS,UAAW,CAChB,GAAI,CAAE,GAAI,OAAO,QAAU,OAAO,OAAO,OAAO,YAAe,WAAY,OAAO,OAAO,OAAO,WAAW,CAAG,MAAY,CAAC,CAC3H,MAAO,uCAAuC,QAAQ,QAAU,GAAM,CAClE,MAAM,EAAK,KAAK,OAAO,EAAI,GAAM,EACjC,OAAQ,IAAM,IAAM,EAAK,EAAI,EAAO,GAAK,SAAS,EAAE,CACxD,CAAC,CACL,CAEA,SAAS,mBAAmB,MAAO,CAC/B,OAAK,MAAM,QAAQ,eAAc,MAAM,QAAQ,aAAe,SAAS,GAChE,MAAM,QAAQ,YACzB,CAEA,SAAS,kBAAkB,MAAO,CAAE,OAAO,MAAM,QAAQ,YAAc,CAEvE,SAAS,wBAAwB,WAAY,WAAY,CACrD,MAAM,KAAO,MAAM,QAAQ,UAAU,EAAI,WAAa,CAAC,EACvD,UAAW,aAAa,KAEpB,IADc,MAAM,QAAQ,WAAW,KAAK,EAAI,UAAU,MAAQ,CAAC,WAAW,IAAI,EAAE,OAAO,OAAO,GACvF,SAAS,UAAU,EAC9B,OAAO,OAAO,WAAW,UAAY,WAAW,UAAY,WAAW,MAAQ,WAAW,WAAa,WAAW,WAAa,EAAE,EAAE,KAAK,EAE5I,MAAO,EACX,CAEA,SAAS,0BAA0B,IAAK,WAAY,CAChD,MAAM,MAAQ,wBAAwB,WAAY,OAAO,EACnD,aAAe,wBAAwB,WAAY,eAAe,EAClE,SAAW,wBAAwB,WAAY,aAAa,EAC5D,KAAO,wBAAwB,WAAY,UAAU,GAAK,wBAAwB,WAAY,aAAa,EAC3G,SAAW,wBAAwB,WAAY,6BAA6B,GAAK,wBAAwB,WAAY,6BAA6B,EACxJ,GAAI,OAAS,aAAc,CACvB,MAAM,SAAW,CAAC,SAAU,KAAM,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACpE,MAAO,CAAC,GAAG,KAAK,IAAI,YAAY,GAAI,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,CAC3E,CAEA,MAAM,MAAQ,OAAO,KAAO,EAAE,EAAE,MAAM,GAAG,EAAE,IAAK,MAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,EACpF,GAAI,CAAC,MAAM,OAAQ,MAAO,GAC1B,MAAM,aAAe,+EACf,YAAc,MAAM,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,YAAY,YAAa,GAAG,CAAC,EAC/E,OAAI,aAAe,cAAc,KAAK,YAAY,CAAC,GAAK,EAAE,IAAG,MAAM,CAAC,EAAI,GAAG,YAAY,CAAC,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,CAAC,IACrH,MAAM,OAAS,GAAK,IAAI,OAAO,IAAI,YAAY,IAAK,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,GAAK,cAAc,KAAK,MAAM,CAAC,CAAC,IACtG,MAAM,CAAC,EAAI,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAClC,MAAM,OAAO,EAAG,CAAC,GAEd,MAAM,OAAQ,MAAS,CAAC,YAAY,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CACpE,CAEA,SAAS,uBAAuB,EAAG,CAC/B,MAAM,KAAO,0BAA0B,EAAE,MAAQ,EAAE,SAAW,EAAE,OAAS,GAAI,EAAE,mBAAqB,EAAE,YAAc,CAAC,CAAC,EAChH,KAAO,EAAE,UAAa,EAAE,kBAAoB,EAAE,iBAAiB,UAAY,EAAE,iBAAiB,SAAS,MAAS,GAChH,UAAY,EAAE,eAAkB,EAAE,kBAAoB,EAAE,iBAAiB,eAAiB,EAAE,iBAAiB,cAAc,MAAS,GACpI,OAAS,EAAE,cAAgB,EAAE,UAAY,EAAE,YAAc,GAEzD,WAAa,MAAS,KAAK,MAAM,GAAG,EAAE,CAAC,GAAK,MAAO,KAAK,EACxD,SAAW,OAAO,WAAa,EAAE,EAAE,KAAK,EACxC,IAAM,CAAC,OAAQ,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,EAEzD,MAAO,CACH,GAAG,EACH,QAAS,MAAQ,CAAC,UAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAChE,YAAa,WAAa,KAC1B,MAAO,IACP,WAAY,SACZ,WAAY,QAAU,EAC1B,CACJ,CAOA,MAAM,gBAAkB,0BAClB,uBAAyB,GACzB,sBAAwB,GAE9B,SAAS,oBAAoB,IAAK,CAC9B,GAAI,CAAE,OAAO,IAAM,KAAK,MAAM,GAAG,EAAI,IAAM,MAAY,CAAE,OAAO,IAAM,CAC1E,CACA,SAAS,gBAAiB,CACtB,MAAM,KAAO,CAAE,EAAG,EAAG,OAAQ,CAAC,EAAG,MAAO,CAAC,CAAE,EAC3C,GAAI,CACA,MAAM,KAAO,oBAAoB,aAAa,QAAQ,eAAe,CAAC,EACtE,MAAI,CAAC,MAAQ,OAAO,MAAS,SAAiB,KACvC,CACH,EAAG,EACH,OAAQ,MAAM,QAAQ,KAAK,MAAM,EAAI,KAAK,OAAS,CAAC,EACpD,MAAO,MAAM,QAAQ,KAAK,KAAK,EAAI,KAAK,MAAQ,CAAC,CACrD,CACJ,MAAY,CAAE,OAAO,IAAM,CAC/B,CACA,SAAS,eAAe,KAAM,CAC1B,GAAI,CAAE,aAAa,QAAQ,gBAAiB,KAAK,UAAU,IAAI,CAAC,CAAG,MAAY,CAAC,CACpF,CACA,SAAS,oBAAoB,MAAO,CAChC,MAAM,QAAU,OAAO,OAAO,SAAW,OAAO,UAAY,EAAE,EAAE,KAAK,EACrE,GAAI,CAAC,QAAS,OAAO,KACrB,MAAM,QAAU,OAAO,OAAO,SAAW,OAAO,MAAQ,OAAO,OAAS,EAAE,EAAE,KAAK,EAC3E,SAAW,OAAO,OAAO,UAAY,OAAO,YAAc,OAAO,YAAc,EAAE,EAAE,KAAK,EACxF,KAAO,OAAO,OAAO,MAAQ,EAAE,EAAE,KAAK,EAC5C,MAAO,CACH,QACA,QACA,SAAW,UAAU,KAAK,QAAQ,EAAI,SAAW,GACjD,KACA,OAAQ,OAAO,OAAO,QAAU,OAAO,IAAM,CAAC,GAAK,EACnD,QAAS,OAAO,OAAO,SAAW,CAAC,GAAK,CAC5C,CACJ,CACA,SAAS,kBAAkB,QAAS,CAChC,MAAM,IAAM,OAAO,SAAW,EAAE,EAAE,KAAK,EACvC,GAAI,CAAC,IAAK,MAAO,GACjB,GAAI,CAAE,OAAQ,eAAe,EAAE,OAAS,CAAC,GAAG,KAAK,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,GAAG,CAAG,MAAY,CAAE,MAAO,EAAO,CACzH,CACA,SAAS,uBAAuB,MAAO,CACnC,MAAM,EAAI,oBAAoB,KAAK,EACnC,GAAI,CAAC,GAAK,CAAC,EAAE,QAAS,OACtB,MAAM,KAAO,eAAe,EACtB,IAAM,KAAK,IAAI,EAGf,MAAQ,KAAK,OAAS,CAAC,GAAG,UAAU,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,EAAE,OAAO,EACrF,GAAI,MAAQ,EAAG,CACX,MAAM,IAAM,oBAAoB,KAAK,MAAM,IAAI,CAAC,GAAK,CAAC,EACtD,KAAK,MAAM,IAAI,EAAI,CAAE,GAAG,IAAK,QAAS,EAAE,QAAS,QAAS,EAAE,SAAW,IAAI,SAAW,GAAI,SAAU,EAAE,UAAY,IAAI,UAAY,GAAI,KAAM,IAAI,MAAQ,GAAI,QAAS,OAAO,IAAI,SAAW,GAAG,GAAK,IAAK,OAAQ,GAAI,CACxN,CAEA,KAAK,QAAU,KAAK,QAAU,CAAC,GAAG,OAAO,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,EAAE,OAAO,EACpF,KAAK,OAAO,QAAQ,CAAE,QAAS,EAAE,QAAS,QAAS,EAAE,QAAS,SAAU,EAAE,SAAU,OAAQ,GAAI,CAAC,EACjG,KAAK,QAAU,KAAK,QAAU,CAAC,GAAG,MAAM,EAAG,sBAAsB,EACjE,eAAe,IAAI,CACvB,CACA,SAAS,sBAAsB,MAAO,KAAM,CACxC,MAAM,EAAI,oBAAoB,KAAK,EAC7B,EAAI,OAAO,MAAQ,EAAE,EAAE,KAAK,EAClC,GAAI,CAAC,GAAK,CAAC,EAAE,SAAW,CAAC,EAAG,OAE5B,MAAM,KAAO,eAAe,EACtB,IAAM,KAAK,IAAI,EACf,KAAO,KAAK,OAAS,CAAC,GAAG,UAAU,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,EAAE,OAAO,EACpF,GAAI,KAAO,EAAG,CACV,MAAM,IAAM,oBAAoB,KAAK,MAAM,GAAG,CAAC,GAAK,CAAC,EACrD,KAAK,MAAM,GAAG,EAAI,CAAE,GAAG,IAAK,QAAS,EAAE,QAAS,QAAS,EAAE,SAAW,IAAI,SAAW,GAAI,SAAU,EAAE,UAAY,IAAI,UAAY,GAAI,KAAM,EAAG,QAAS,OAAO,IAAI,SAAW,GAAG,GAAK,IAAK,OAAQ,GAAI,CAC1M,MACI,KAAK,MAAQ,MAAM,QAAQ,KAAK,KAAK,EAAI,KAAK,MAAQ,CAAC,EACvD,KAAK,MAAM,QAAQ,CAAE,QAAS,EAAE,QAAS,QAAS,EAAE,QAAS,SAAU,EAAE,SAAU,KAAM,EAAG,QAAS,IAAK,OAAQ,GAAI,CAAC,EAE3H,KAAK,OAAS,KAAK,OAAS,CAAC,GAAG,OAAO,GAAK,GAAK,EAAE,SAAW,EAAE,OAAO,EACvE,KAAK,MAAM,KAAK,CAAC,EAAG,IAAM,OAAO,EAAE,SAAW,CAAC,EAAI,OAAO,EAAE,SAAW,CAAC,CAAC,EACzE,KAAK,MAAQ,KAAK,MAAM,MAAM,EAAG,qBAAqB,EAEtD,eAAe,IAAI,EACnB,uBAAuB,CAAC,CAC5B,CACA,SAAS,iBAAiB,QAAS,CAC/B,MAAM,IAAM,OAAO,SAAW,EAAE,EAAE,KAAK,EACvC,GAAI,CAAC,IAAK,OACV,MAAM,KAAO,eAAe,EAC5B,KAAK,OAAS,KAAK,OAAS,CAAC,GAAG,OAAO,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,GAAG,EAC5E,KAAK,QAAU,KAAK,QAAU,CAAC,GAAG,OAAO,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,GAAG,EAC9E,eAAe,IAAI,CACvB,CACA,SAASA,qBAAqB,CAC1B,MAAM,KAAO,eAAe,EACtB,OAAS,KAAK,OAAS,CAAC,GAAG,IAAI,mBAAmB,EAAE,OAAO,OAAO,EAClE,SAAW,IAAI,IAAI,MAAM,IAAI,GAAK,EAAE,OAAO,CAAC,EAC5C,QAAU,KAAK,QAAU,CAAC,GAAG,IAAI,mBAAmB,EAAE,OAAO,GAAK,GAAK,CAAC,SAAS,IAAI,EAAE,OAAO,CAAC,EACrG,aAAM,KAAK,CAAC,EAAG,IAAM,OAAO,EAAE,SAAW,CAAC,EAAI,OAAO,EAAE,SAAW,CAAC,CAAC,EACpE,OAAO,KAAK,CAAC,EAAG,IAAM,OAAO,EAAE,QAAU,CAAC,EAAI,OAAO,EAAE,QAAU,CAAC,CAAC,EAC5D,CAAE,MAAO,MAAO,CAC3B,CAGA,SAAS,oBAAoB,QAAS,CAClC,MAAM,IAAM,OAAO,SAAW,EAAE,EAAE,KAAK,EACvC,GAAI,CAAC,IAAK,MAAO,GACjB,GAAI,CACA,KAAM,CAAE,KAAM,EAAIA,oBAAmB,EAC/B,KAAO,OAAS,CAAC,GAAG,KAAK,GAAK,OAAO,GAAG,SAAW,EAAE,EAAE,KAAK,IAAM,GAAG,EAC3E,OAAO,OAAO,KAAK,MAAQ,EAAE,EAAE,KAAK,CACxC,MAAY,CAAE,MAAO,EAAI,CAC7B,CACA,SAAS,UAAU,IAAK,CACpB,OAAO,OAAO,KAAO,EAAE,EAClB,YAAY,EACZ,QAAQ,OAAQ,GAAG,EACnB,QAAQ,UAAW,GAAG,EACtB,QAAQ,QAAS,GAAG,EACpB,KAAK,CACd,CAGJ,SAASC,gBAAe,IAAK,CAC3B,OAAO,UAAU,GAAG,EACjB,QAAQ,kBAAmB,GAAG,EAC9B,QAAQ,YAAa,GAAG,EACxB,QAAQ,OAAQ,GAAG,EACnB,KAAK,CACV,CAGA,SAASC,qBAAoB,MAAO,CAClC,MAAM,IAAM,OAAO,OAAS,EAAE,EAAE,KAAK,EACrC,GAAI,CAAC,IAAK,OAAO,KAEjB,MAAM,EAAID,gBAAe,eAAe,GAAG,CAAC,EACtC,YAAc,EAAE,QAAQ,MAAO,EAAE,EAAE,OACzC,GAAI,CAAC,EAAG,OAAO,KAEf,KAAM,CAAE,MAAO,MAAO,EAAID,oBAAmB,EAEvC,QAAW,OAAU,CACzB,MAAM,KAAOC,gBAAe,eAAe,OAAO,OAAO,SAAW,EAAE,CAAC,CAAC,EACxE,GAAI,CAAC,KAAM,MAAO,GAGlB,GAAI,OAAS,EAAG,MAAO,KAGvB,GAAI,YAAc,EAAG,MAAO,GAG5B,GAAI,KAAK,WAAW,CAAC,EAAG,MAAO,IAC/B,GAAI,EAAE,WAAW,IAAI,EAAG,MAAO,IAG/B,GAAI,KAAK,SAAS,CAAC,EAAG,MAAO,IAG7B,MAAM,KAAO,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,OAAO,GAAK,EAAE,QAAU,CAAC,EACnE,GAAI,CAAC,KAAK,OAAQ,MAAO,GAEzB,IAAI,IAAM,EACV,UAAW,OAAO,KACZ,KAAK,SAAS,GAAG,GAAG,MAE1B,MAAM,MAAQ,IAAM,KAAK,OAEzB,OAAI,OAAS,GAAY,GACrB,OAAS,GAAY,GACrB,OAAS,IAAO,KAAK,QAAU,EAAU,GAEtC,CACT,EAEA,IAAI,KAAO,KACP,UAAY,GACZ,UAAY,EAEhB,MAAM,KAAO,CAAC,IAAK,QAAU,CAC3B,UAAW,KAAM,KAAO,CAAC,EAAI,CAC3B,MAAM,GAAK,QAAQ,CAAC,GAChB,GAAK,WAAc,KAAO,WAAa,MAAQ,YAAc,UAAY,QAAU,WACrF,KAAO,EAAG,UAAY,MAAO,UAAY,GAE7C,CACF,EAQA,OANA,KAAK,MAAO,OAAO,EACnB,KAAK,OAAQ,QAAQ,EAEjB,CAAC,MAAQ,CAAC,MAAM,SAGhB,UAAY,IAAM,YAAc,IAAY,KAEzC,CAAE,MAAO,KAAM,MAAO,UAAW,MAAO,SAAU,CAC3D,CAGY,MAAM,mBAAqB,qPACrB,kBAAqB,8LACrB,YAAc,+3BAE5B,SAAS,uBAAwB,CAC7B,GAAI,OAAO,oBAAqB,OAAO,OAAO,oBAE9C,MAAM,QAAU,SAAS,cAAc,KAAK,EAC5C,QAAQ,UAAY,qBACpB,QAAQ,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAapB,SAAS,KAAK,YAAY,OAAO,EAEjC,MAAM,QAAU,QAAQ,cAAc,qBAAqB,EACrD,QAAU,QAAQ,cAAc,qBAAqB,EACrD,UAAY,QAAQ,cAAc,wBAAwB,EAC1D,MAAQ,QAAQ,cAAc,yBAAyB,EAE7D,IAAI,UAAY,KACZ,eAAiB,GACjB,UAAY,EACZ,WAAa,KACb,YAAc,KAElB,MAAM,aAAe,IAAM,CACzB,GAAI,CACF,eAAiB,SAAS,gBAAgB,MAAM,UAAY,GAC5D,SAAS,gBAAgB,MAAM,SAAW,QAC5C,MAAY,CAAE,CAEd,GAAI,CACF,UAAY,OAAO,SAAW,OAAO,aAAe,EACpD,WAAa,CACT,SAAU,SAAS,KAAK,MAAM,SAC9B,IAAK,SAAS,KAAK,MAAM,IACzB,KAAM,SAAS,KAAK,MAAM,KAC1B,MAAO,SAAS,KAAK,MAAM,MAC3B,MAAO,SAAS,KAAK,MAAM,KAC/B,EACA,SAAS,KAAK,MAAM,SAAW,QAC/B,SAAS,KAAK,MAAM,IAAO,CAAC,UAAa,KACzC,SAAS,KAAK,MAAM,KAAO,IAC3B,SAAS,KAAK,MAAM,MAAQ,IAC5B,SAAS,KAAK,MAAM,MAAQ,MAC9B,MAAY,CAAE,CAChB,EAEM,eAAiB,IAAM,CAC3B,GAAI,CAAE,SAAS,gBAAgB,MAAM,SAAW,gBAAkB,EAAI,MAAY,CAAE,CACpF,GAAI,CACE,aACA,SAAS,KAAK,MAAM,SAAW,WAAW,UAAY,GACtD,SAAS,KAAK,MAAM,IAAM,WAAW,KAAO,GAC5C,SAAS,KAAK,MAAM,KAAO,WAAW,MAAQ,GAC9C,SAAS,KAAK,MAAM,MAAQ,WAAW,OAAS,GAChD,SAAS,KAAK,MAAM,MAAQ,WAAW,OAAS,IAEpD,OAAO,SAAS,EAAG,WAAa,CAAC,CACnC,MAAY,CAAE,CACd,WAAa,IACf,EAEM,SAAW,IAAM,CACrB,GAAI,CACF,MAAM,GAAK,OAAO,eACZ,IAAO,IAAM,GAAG,OAAU,GAAG,OAAS,OAAO,YACnD,QAAQ,MAAM,YAAY,YAAa,IAAM,IAAI,EAGjD,MAAM,QAAU,OAAO,aAAe,IAChC,SAAY,IAAM,OAAO,GAAG,WAAc,SAAa,GAAG,UAAY,IAAM,EAAM,IAAM,EACxF,aAAe,QAAU,EAC/B,IAAI,MAAQ,SAAW,aAEnB,MAAQ,IAAG,MAAQ,GACnB,MAAQ,OAAM,MAAQ,MAC1B,QAAQ,MAAM,YAAY,mBAAoB,MAAQ,IAAI,CAC5D,MAAY,CAAE,CAChB,EAEM,WAAa,IAAM,CACvB,GAAI,YAAa,OACjB,IAAI,IAAM,EACV,MAAM,KAAO,IAAM,CACjB,GAAI,CAAM,KAAK,qBAAqB,GAAG,CAAG,MAAY,CAAE,CACxD,IAAM,sBAAsB,IAAM,CAAE,SAAS,CAAG,CAAC,CACnD,EAEM,GAAK,OAAO,eAClB,GAAI,CAAE,OAAO,iBAAiB,SAAU,KAAM,CAAE,QAAS,EAAK,CAAC,CAAG,MAAY,CAAE,CAChF,GAAI,CAAE,OAAO,iBAAiB,oBAAqB,KAAM,CAAE,QAAS,EAAK,CAAC,CAAG,MAAY,CAAE,CAE3F,GAAI,IAAM,GAAG,iBAAkB,CAC7B,GAAI,CAAE,GAAG,iBAAiB,SAAU,KAAM,CAAE,QAAS,EAAK,CAAC,CAAG,MAAY,CAAE,CAC5E,GAAI,CAAE,GAAG,iBAAiB,SAAU,KAAM,CAAE,QAAS,EAAK,CAAC,CAAG,MAAY,CAAE,CAC9E,CAEA,YAAc,IAAM,CAClB,GAAI,CAAE,OAAO,oBAAoB,SAAU,IAAI,CAAG,MAAY,CAAE,CAChE,GAAI,CAAE,OAAO,oBAAoB,oBAAqB,IAAI,CAAG,MAAY,CAAE,CAC3E,GAAI,IAAM,GAAG,oBAAqB,CAC9B,GAAI,CAAE,GAAG,oBAAoB,SAAU,IAAI,CAAG,MAAY,CAAE,CAC5D,GAAI,CAAE,GAAG,oBAAoB,SAAU,IAAI,CAAG,MAAY,CAAE,CAChE,CACA,GAAI,CAAM,KAAK,qBAAqB,GAAG,CAAG,MAAY,CAAE,CACxD,IAAM,EACN,YAAc,IAChB,EAGA,WAAW,SAAU,CAAC,EACtB,WAAW,SAAU,EAAE,CACzB,EAEM,WAAa,IAAM,CACvB,GAAI,CAAM,aAAa,YAAY,CAAG,MAAY,CAAE,CACpD,YAAc,KACd,GAAI,CAAE,QAAQ,MAAM,eAAe,kBAAkB,CAAG,MAAY,CAAE,CACtE,GAAI,CAAE,QAAQ,MAAM,eAAe,WAAW,CAAG,MAAY,CAAE,CACjE,EAGM,MAAS,KAAQ,CACnB,GAAI,CAAE,QAAQ,MAAM,QAAU,MAAQ,MAAY,CAAE,CACpD,GAAI,CAAE,WAAW,CAAG,MAAY,CAAE,CAClC,GAAI,CAAE,eAAe,CAAG,MAAY,CAAE,CACtC,MAAM,EAAI,UACV,UAAY,KACR,OAAO,GAAM,YAAY,EAAE,GAAG,CACtC,EAEM,QAAU,IAAM,CAAE,MAAM,SAAW,CAAC,OAAO,QAAQ,OAAS,EAAE,EAAE,KAAK,CAAG,EAE9E,eAAQ,iBAAiB,QAAU,IAAO,CAAM,GAAG,SAAW,SAAS,MAAM,IAAI,CAAG,CAAC,EACrF,UAAU,iBAAiB,QAAS,IAAM,MAAM,IAAI,CAAC,EACrD,MAAM,iBAAiB,QAAS,IAAM,CAAE,MAAM,EAAI,OAAO,QAAQ,OAAS,EAAE,EAAE,KAAK,EAAQ,GAAW,MAAM,CAAC,CAAG,CAAC,EACjH,QAAQ,iBAAiB,QAAS,OAAO,EACzC,QAAQ,iBAAiB,UAAY,IAAO,CACxC,GAAI,GAAG,MAAQ,SAAU,CAAE,GAAG,eAAe,EAAG,MAAM,IAAI,EAAG,MAAQ,CACrE,GAAI,GAAG,MAAQ,QAAS,CAAE,GAAG,eAAe,EAAG,MAAM,EAAI,OAAO,QAAQ,OAAS,EAAE,EAAE,KAAK,EAAG,GAAI,CAAC,EAAG,OAAQ,MAAM,CAAC,CAAG,CAC3H,CAAC,EAED,OAAO,oBAAsB,CACzB,KAAM,CAAC,CAAE,MAAO,aAAc,WAAY,EAAI,CAAC,IAAM,IAAI,QAAS,SAAY,CAC1E,UAAY,QACZ,GAAI,CAAE,aAAa,CAAG,MAAY,CAAE,CACpC,GAAI,CAAE,QAAQ,YAAc,OAAO,OAAS,iBAAiB,CAAG,MAAY,CAAE,CAC9E,GAAI,CAAE,MAAM,YAAc,OAAO,aAAe,OAAO,CAAG,MAAY,CAAE,CACxE,GAAI,CAAE,QAAQ,MAAQ,OAAO,cAAgB,EAAE,CAAG,MAAY,CAAE,CAChE,QAAQ,EACR,GAAI,CAAE,QAAQ,MAAM,QAAU,MAAQ,MAAY,CAAE,CACpD,GAAI,CAAE,WAAW,CAAG,MAAY,CAAE,CAClC,WAAW,IAAM,CAAE,GAAI,CAAE,SAAS,CAAG,MAAY,CAAE,CAAE,EAAG,CAAC,EACzD,WAAW,IAAM,CAAE,GAAI,CAAE,QAAQ,MAAM,EAAG,QAAQ,OAAO,CAAG,MAAY,CAAE,CAAE,EAAG,EAAE,CACrF,CAAC,CACL,EACO,OAAO,mBAClB,CAEA,SAAS,yBAA0B,CAC/B,GAAI,SAAS,eAAe,kBAAkB,EAAG,OACjD,MAAM,MAAQ,SAAS,cAAc,OAAO,EAC5C,MAAM,GAAK,mBACX,MAAM,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCpB,SAAS,KAAK,YAAY,KAAK,CACnC,CAEA,SAAS,yBAAyB,UAAW,MAAO,CAAE,MAAO,EAAI,CAAC,EAAG,CACjE,GAAI,CAAC,UAAW,MAAO,GACvB,wBAAwB,EAExB,GAAI,CAAE,MAAO,MAAO,EAAID,oBAAmB,EAGnD,MAAM,EAAIE,qBAAoB,OAAO,OAAS,MAAM,OAAS,EAAE,CAAC,EAChE,IAAI,OAAS,KACT,YAAc,GAUlB,GATI,GAAK,EAAE,QACP,OAAS,EAAE,MACX,YAAc,EAAE,OAAS,GACrB,cAAgB,QAChB,OAAS,OAAS,CAAC,GAAG,OAAO,GAAK,OAAO,GAAK,EAAE,SAAW,EAAE,IAAM,OAAO,OAAO,SAAW,EAAE,CAAC,EACxF,cAAgB,WACvB,QAAU,QAAU,CAAC,GAAG,OAAO,GAAK,OAAO,GAAK,EAAE,SAAW,EAAE,IAAM,OAAO,OAAO,SAAW,EAAE,CAAC,IAGpG,MAAM,OAAS,OAAO,SAAY,EAC3B,iBAAU,MAAM,QAAU,OAC1B,UAAU,UAAY,GACf,GAGX,MAAM,SAAW,CAAC,EAAG,QAAU,CAC3B,MAAM,EAAI,uBAAuB,GAAK,CAAC,CAAC,EAClC,QAAU,OAAO,EAAE,SAAW,EAAE,EAAE,KAAK,EACvC,QAAU,OAAO,EAAE,SAAW,EAAE,SAAW,EAAE,EAAE,KAAK,EACpD,KAAO,OAAO,EAAE,aAAe,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAK,OAAO,EAAE,KAAK,EACtE,IAAM,OAAO,EAAE,YAAc,EAAE,EAAE,KAAK,EACtC,IAAM,OAAO,EAAE,UAAY,EAAE,YAAc,EAAE,EAAE,KAAK,EACpD,KAAO,OAAO,EAAE,MAAQ,EAAE,EAAE,KAAK,EACjC,OAAS,UAAU,KAAK,GAAG,EAE3B,SAAW,WAAW,IAAI,EAC1B,QAAU,WAAW,KAAO,OAAO,EACnC,SAAY,QAAU,SAAW,KAAQ,wCAAwC,WAAW,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,UAAY,GAClI,SAAW,QAAU,8BAA8B,WAAW,OAAO,CAAC,UAAa,QAAU,8BAA8B,OAAO,UAAY,GAEpJ,MAAO;AAAA,qEACkD,WAAW,OAAO,CAAC,iBAAiB,WAAW,KAAK,CAAC;AAAA;AAAA,0CAEhF,QAAQ;AAAA;AAAA;AAAA,oBAG9B,QAAQ;AAAA,4FACgE,kBAAkB,OAAO,EAAI,WAAa,OAAO,iBAAiB,kBAAkB,OAAO,EAAI,WAAa,OAAO,KAAK,kBAAkB,OAAO,EAAI,kBAAoB,kBAAkB;AAAA,wHAC/J,WAAW;AAAA;AAAA;AAAA,aAI3H,EAEM,UAAY,MAAM,OAAS,MAAM,IAAI,GAAK,SAAS,EAAG,OAAO,CAAC,EAAE,KAAK,EAAE,EAAI,gEAC3E,WAAa,OAAO,OAAS,OAAO,IAAI,GAAK,SAAS,EAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAI,gEAE/E,WAAa,OACb;AAAA;AAAA,mBAEK,SAAS,OAAQ,WAAW,EAAE,QAAQ,mBAAoB,4BAA4B,CAAC;AAAA,uBAE5F,GAEN,iBAAU,MAAM,QAAU,QAC1B,UAAU,UAAY;AAAA;AAAA,cAEhB,UAAU;AAAA;AAAA;AAAA,gBAGR,SAAS;AAAA;AAAA;AAAA;AAAA,gBAIT,UAAU;AAAA;AAAA;AAAA,UAKlB,UAAU,iBAAiB,kBAAkB,EAAE,QAAS,KAAQ,CAC5D,MAAM,QAAU,OAAO,IAAI,aAAa,cAAc,GAAK,EAAE,EAAE,KAAK,EAC9D,MAAQ,OAAO,IAAI,aAAa,YAAY,GAAK,EAAE,EAAE,KAAK,EAC1D,OAAS,IAAM,CACvB,KAAM,CAAE,MAAAC,OAAO,OAAAC,OAAO,EAAIJ,oBAAmB,EAE7C,OADaG,QAAS,CAAC,GAAG,OAAOC,SAAU,CAAC,CAAC,EAClC,KAAK,GAAK,OAAO,GAAG,SAAW,EAAE,IAAM,OAAO,GAAK,IAChE,GAAG,EAEC,IAAI,iBAAiB,QAAU,IAAO,CAClC,MAAM,EAAI,IAAM,GAAG,OAEnB,GADI,GAAK,EAAE,SAAW,EAAE,QAAQ,iBAAiB,GAC7C,CAAC,MAAO,OAEZ,MAAM,OAAS,CAAE,QAAS,MAAM,QAAS,QAAS,MAAM,QAAS,WAAY,MAAM,UAAY,EAAG,EAClG,GAAI,CAAE,MAAM,QAAQ,SAAW,KAAK,UAAU,MAAM,CAAG,MAAY,CAAC,CACpE,GAAI,CAAE,MAAM,QAAQ,IAAM,OAAO,MAAM,UAAY,EAAE,CAAG,MAAY,CAAC,CACrE,MAAM,MAAQ,OAAO,MAAM,SAAW,EAAE,EAExC,GAAI,CAAE,uBAAuB,KAAK,CAAG,MAAY,CAAC,CAClD,GAAI,CAAE,QAAU,OAAO,MAAM,CAAG,MAAY,CAAC,CACjD,EAAG,CAAE,QAAS,EAAM,CAAC,EAErB,MAAM,QAAU,IAAI,cAAc,kBAAkB,EAChD,SAAS,QAAQ,iBAAiB,QAAS,MAAO,IAAO,CAEzD,GADA,GAAG,eAAe,EAAG,GAAG,gBAAgB,EACpC,CAAC,MAAO,OACZ,MAAM,QAAU,kBAAkB,MAAM,OAAO,EACzC,KAAOJ,oBAAmB,EAAE,OAAS,CAAC,GAAG,KAAK,GAAK,EAAE,UAAY,MAAM,OAAO,GAAK,MAEnF,KAAO,MADC,sBAAsB,EACX,KAAK,CAC1B,MAAQ,QAAU,qBAAuB,kBACzC,aAAc,OAAO,IAAI,MAAQ,EAAE,EACnC,YAAc,QAAU,WAAa,OACzC,CAAC,EACD,GAAI,MAAQ,KAAM,OAClB,MAAM,EAAI,OAAO,MAAQ,EAAE,EAAE,KAAK,EAC7B,IACL,sBAAsB,MAAO,CAAC,EAC9B,yBAAyB,UAAW,MAAO,CAAE,MAAO,CAAC,EACzD,EAAG,CAAE,QAAS,EAAM,CAAC,EAErB,MAAM,OAAS,IAAI,cAAc,iBAAiB,EAC9C,QAAQ,OAAO,iBAAiB,QAAU,IAAO,CACjD,GAAG,eAAe,EAAG,GAAG,gBAAgB,EACxC,iBAAiB,OAAO,EACxB,yBAAyB,UAAW,MAAO,CAAE,MAAO,CAAC,CACzD,EAAG,CAAE,QAAS,EAAM,CAAC,CACzB,CAAC,EAEM,EACX,CAQJ,SAAS,2BAA2B,KAAM,CACtC,MAAM,IAAM,MAAM,QAAQ,IAAI,EAAI,KAAO,CAAC,EAC1C,OAAO,IAAI,OAAO,CAAC,KAAM,QAAU,CAC/B,MAAM,QAAU,OAAO,MAAM,SAAW,MAAM,UAAY,EAAE,EAAE,KAAK,EACnE,MAAO,CAAC,CAAC,SAAW,IAAI,UAAW,WAAc,OAAO,WAAW,SAAW,WAAW,UAAY,EAAE,EAAE,KAAK,IAAM,OAAO,IAAM,KACrI,CAAC,CACL,CAEI,SAAS,aAAc,CACnB,GAAI,CACA,GAAI,OAAO,oBAAsB,OAAO,OAAO,mBAAmB,WAAc,WAC5E,OAAO,OAAO,mBAAmB,UAAU,EAE/C,MAAM,MAAQ,KAAK,MAAM,aAAa,QAAQ,WAAW,GAAK,MAAM,EACpE,GAAI,CAAC,OAAS,CAAC,MAAM,IAAK,MAAO,CAAE,SAAU,EAAM,EACnD,MAAM,QAAW,KAAK,IAAI,GAAK,MAAM,IAAM,GAAM,OAAO,cACxD,MAAO,CAAE,GAAG,MAAO,MAAO,OAAQ,CACtC,MAAQ,CAAE,MAAO,CAAE,SAAU,EAAM,CAAG,CAC1C,CAGA,SAAS,kBAAmB,CACxB,MAAM,MAAQ,EAAE,iBAAiB,EACjC,GAAK,MAEL,CAAG,EAAE,mBAAmB,IAAG,EAAE,mBAAmB,EAAE,QAAU,oBAE5D,kBAAkB,kBAAmB,gBAAgB,EACrD,OAAO,EAEP,GAAI,CACF,MAAM,GAAK,YAAY,GACnB,CAAC,IAAM,CAAC,GAAG,UAAY,CAAC,GAAG,QACzB,OAAO,MAAM,iBAAoB,YAAY,MAAM,gBAAgB,CAAE,MAAO,EAAK,CAAC,CAE1F,MAAY,CAAC,CAEb,WAAW,yBAA0B,CAAC,EAC1C,CAEA,eAAe,oBAAqB,CAChC,MAAM,OAAS,EAAE,mBAAmB,EAC9B,MAAQ,EAAE,iBAAiB,EAC3B,MAAQ,QAAQ,cAAc,MAAM,EACpC,UAAY,OAAO,aAAe,uBACxC,GAAI,CAAC,UAAU,YAAa,CACxB,UAAU,sFAA8E,EACxF,MACJ,CACI,SACA,OAAO,SAAW,GAClB,OAAO,aAAa,YAAa,MAAM,GAEvC,QAAO,MAAM,YAAc,gCAC/B,UAAU,IAAI,EACd,GAAI,CACA,MAAM,SAAW,MAAM,IAAI,QAAQ,CAAC,QAAS,SAAW,CACpD,UAAU,YAAY,mBAAmB,QAAS,OAAQ,CACtD,mBAAoB,GACpB,QAAS,IACT,WAAY,GAChB,CAAC,CACL,CAAC,EACK,IAAM,OAAO,SAAS,OAAO,QAAQ,EACrC,IAAM,OAAO,SAAS,OAAO,SAAS,EACtC,IAAM,IAAI,IAAI,OAAO,eAAgB,OAAO,SAAS,MAAM,EACjE,IAAI,aAAa,IAAI,MAAO,OAAO,GAAG,CAAC,EACvC,IAAI,aAAa,IAAI,MAAO,OAAO,GAAG,CAAC,EACvC,MAAM,SAAW,MAAM,MAAM,IAAI,SAAS,EAAG,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAElF,UADO,MAAM,SAAS,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,IAC5B,OAAS,CAAC,EAC3B,IAAM,OAAO,SAAS,UAAY,SAAS,YAAc,EAAE,EAAE,KAAK,EAClE,QAAU,0BAA0B,SAAS,SAAW,SAAS,kBAAoB,GAAI,SAAS,mBAAqB,CAAC,CAAC,EAC/H,GAAI,CAAC,SAAS,IAAM,CAAC,UAAU,KAAK,GAAG,GAAK,CAAC,QAAS,MAAM,IAAI,MAAM,wBAAwB,EAE9F,GAAI,EADa,SAAS,YAAc,IAAQ,EAAQ,OAAO,SAAS,aAAe,wBAAwB,SAAS,mBAAqB,CAAC,EAAG,eAAe,CAAC,EAAE,KAAK,GACzJ,CACP,QAAO,MAAM,MAAQ,SACzB,UAAU,qFAAgF,EAC1F,OAAO,MAAM,EACb,MACJ,CACI,QACA,MAAM,MAAQ,QACd,MAAM,QAAQ,IAAM,KAExB,GAAI,CACA,aAAa,QAAQ,eAAgB,KAAK,UAAU,CAAE,QAAS,SAAU,IAAK,IAAK,IAAK,OAAQ,MAAO,GAAI,KAAK,IAAI,CAAE,CAAC,CAAC,CAC5H,MAAY,CAAC,CACb,MAAM,YAAY,IAAK,QAAS,CAC5B,cAAe,GACf,QAAS,eACT,OAAQ,mBACR,MAAO,MACP,QACA,gBAAiB,QAChB,iBAAkB,QAClB,kBAAmB,SAAS,mBAAqB,CAAC,EAClD,QAAS,SAAS,SAAW,GAC7B,OAAQ,SAAS,QAAU,GAC3B,YAAa,SAAS,aAAe,GACrC,KAAM,SAAS,MAAQ,GACvB,SAAU,SAAS,UAAY,GAChC,IACA,IACA,UAAW,EACf,CAAC,CACL,OAAS,MAAO,CACZ,MAAM,OAAS,OAAO,OAAO,MAAQ,CAAC,IAAM,EAC5C,UAAU,OACJ,yEACA,yEAAoE,CAC9E,QAAE,CACM,SACA,OAAO,SAAW,GAClB,OAAO,gBAAgB,WAAW,GAElC,QAAO,MAAM,YAAc,UACnC,CACJ,CAGA,SAAS,kBAAkB,QAAS,UAAW,CAC3C,MAAM,MAAQ,EAAE,OAAO,EACjB,QAAU,EAAE,SAAS,EAE3B,GADI,CAAC,OAAS,CAAC,SACX,MAAM,YAAa,OACvB,MAAM,YAAc,GAEpB,IAAI,cACA,uBAAyB,KACzB,qBAAuB,EAC3B,MAAM,kBAAoB,IAAI,IAC9B,IAAI,2BAA6B,EAEjC,MAAM,wBAA0B,IAAM,CAClC,2BAA6B,KAAK,IAAI,EAAI,GAC9C,EAEA,GAAI,CAAE,QAAQ,iBAAiB,cAAe,wBAAyB,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CAAG,MAAY,CAAC,CACvH,GAAI,CAAE,QAAQ,iBAAiB,aAAc,wBAAyB,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CAAG,MAAY,CAAC,CACtH,GAAI,CAAE,QAAQ,iBAAiB,YAAa,wBAAyB,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CAAG,MAAY,CAAC,CAGrH,MAAM,QAAU,MAAM,QAAQ,gBAAgB,GAAK,MAAM,cACzD,IAAI,SAAW,QAAQ,cAAc,gBAAgB,EACrD,GAAI,CAAC,SAAU,CACX,SAAW,SAAS,cAAc,QAAQ,EAC1C,SAAS,UAAY,gBACrB,SAAS,UAAY,UACrB,QAAQ,YAAY,QAAQ,EAE5B,MAAM,YAAc,IAAM,CAAE,SAAS,MAAM,QAAU,MAAM,MAAQ,OAAS,MAAQ,EACpF,MAAM,iBAAiB,QAAS,WAAW,EAC3C,SAAS,iBAAiB,QAAS,IAAM,CACrC,sBAAwB,EACxB,GAAI,CAAE,wBAAwB,QAAQ,CAAG,MAAY,CAAC,CACtD,MAAM,MAAQ,GACd,GAAI,CAAE,OAAO,MAAM,QAAQ,QAAU,MAAW,CAAC,CACjD,GAAI,CAAE,OAAO,MAAM,QAAQ,GAAK,MAAW,CAAC,CAC5C,SAAS,MAAM,QAAU,OACzB,QAAQ,MAAM,QAAU,OACxB,UAAU,IAAI,EACd,MAAM,MAAM,EACZ,kBAAkB,KAAK,EACvB,GAAI,CACI,OAAO,MAAM,iBAAoB,YACjC,MAAM,gBAAgB,CAAE,MAAO,EAAK,CAAC,CAE7C,MAAY,CAAC,CACjB,CAAC,CACL,CAKA,IAAI,mBAAqB,EACzB,MAAM,kBAAoB,CAAC,KAAO,CAAC,IAAM,CACrC,GAAI,CACA,MAAM,UAAY,CAAC,EAAE,MAAQ,KAAK,WAC5B,IAAM,KAAK,IAAI,EACrB,GAAI,CAAC,UAAW,CACZ,GAAI,IAAM,mBAAqB,IAAK,MAAO,GAC3C,mBAAqB,GACzB,CAEA,MAAM,MAAQ,CAAC,EAAE,MAAQ,KAAK,OACxB,GAAK,OAAO,MAAM,OAAS,EAAE,EAAE,KAAK,EAE1C,MAAI,CAAC,OAAS,GAAW,GASlB,CAAC,CAPS,yBAAyB,QAAS,MAAO,CACtD,OAAS,QAAW,CAChB,QAAQ,MAAM,QAAU,OACxB,QAAQ,UAAY,GACpB,GAAI,CAAE,eAAe,OAAO,QAAQ,SAAW,EAAE,EAAG,MAAO,QAAU,CAAC,CAAC,CAAG,MAAY,CAAC,CAC3F,CACJ,CAAC,CAEL,MAAY,CAAC,CACb,MAAO,EACX,EAEM,2BAA6B,IAAM,CACrC,GAAI,CAIA,MAHI,GAAC,OAAS,CAAC,SAAW,MAAM,UAC5B,CAAC,MAAM,aAAe,CAAC,QAAQ,aAC/B,OAAO,MAAM,OAAS,EAAE,EAAE,KAAK,GAC/B,OAAO,MAAM,gBAAmB,YAAc,MAAM,eAAe,EAAE,SAAW,EAExF,MAAY,CAAC,CACb,MAAO,EACX,EAEM,uBAAyB,IAAM,CACjC,GAAI,CAEA,OADI,KAAK,IAAI,EAAI,4BACb,CAAC,2BAA2B,EAAU,GACnC,CAAC,CAAC,kBAAkB,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CAC/D,MAAY,CAAC,CACb,MAAO,EACX,EAEM,sBAAwB,IAAM,CAChC,WAAW,IAAM,CACb,GAAI,CAAE,uBAAuB,CAAG,MAAY,CAAC,CACjD,EAAG,CAAC,CACR,EAEA,GAAI,CAAE,MAAM,gBAAkB,iBAAmB,MAAY,CAAC,CAE9D,MAAM,8BAAgC,IAAM,CACxC,sBAAsB,IAAM,CACxB,GAAI,CACI,SAAS,gBAAkB,OAAO,kBAAkB,CAC5D,MAAY,CAAC,CACjB,CAAC,CACL,EAEA,MAAM,iBAAiB,QAAS,8BAA+B,CAAE,QAAS,EAAK,CAAC,EAChF,MAAM,iBAAiB,OAAQ,IAAM,CACnB,OAAO,MAAM,OAAS,EAAE,EAAE,KAAK,GAG7C,sBAAsB,CAC1B,EAAG,CAAE,QAAS,EAAK,CAAC,EAEpB,SAAS,iBAAiB,QAAS,sBAAuB,EAAI,EAG9D,MAAM,iBAAiB,QAAS,IAAM,CAClC,aAAa,aAAa,EAC1B,sBAAwB,EACxB,MAAM,SAAW,qBACjB,GAAI,CAAE,wBAAwB,QAAQ,CAAG,MAAY,CAAC,CACtD,UAAU,IAAI,EACd,MAAM,MAAQ,MAAM,MAAM,KAAK,EAE/B,GAAI,CAAC,MAAM,OAAQ,CAEf,GAAI,CACA,yBAAyB,QAAS,MAAO,CACrC,OAAS,QAAW,CAChB,QAAQ,MAAM,QAAU,OACxB,QAAQ,UAAY,GACpB,GAAI,CAAE,eAAe,OAAO,QAAQ,SAAW,EAAE,EAAG,MAAO,QAAU,CAAC,CAAC,CAAG,MAAY,CAAC,CAC3F,CACJ,CAAC,CACL,MAAY,CAAE,QAAQ,MAAM,QAAU,MAAQ,CAC9C,MACJ,CAEA,GAAI,MAAM,OAAS,EAAG,CAClB,GAAI,CAAE,QAAQ,MAAM,QAAU,OAAQ,QAAQ,UAAY,EAAI,MAAY,CAAC,CAC3E,MACJ,CAEA,MAAM,SAAW,MAAM,kBAAkB,OAAO,EAAE,QAAQ,OAAQ,GAAG,EAC/D,OAAS,kBAAkB,IAAI,QAAQ,EAC7C,GAAI,QAAU,KAAK,IAAI,EAAI,OAAO,QAAU,GAAK,IAAM,CACnD,kBAAkB,OAAO,KAAM,QAAS,KAAK,EAC7C,SAAS,MAAM,QAAU,OACzB,MACJ,CAGA,6BAA6B,QAAS,KAAK,EAE3C,cAAgB,WAAW,SAAY,CACnC,MAAM,MAAQ,mBAAmB,KAAK,EACtC,uBAAyB,OAAO,iBAAoB,WAAa,IAAI,gBAAoB,KACzF,GAAI,CAEA,MAAM,IAAM,GAAG,OAAO,mBAAmB,MAAM,mBAAmB,KAAK,CAAC,oCAAoC,mBAAmB,KAAK,CAAC,GAC/H,IAAM,MAAM,MAAM,IAAK,CACzB,OAAQ,wBAAwB,OAChC,QAAS,CAAE,OAAQ,kBAAmB,CAC1C,CAAC,EACD,GAAI,CAAC,IAAI,GAAI,MAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,EAAE,EAC9D,MAAM,KAAO,MAAM,IAAI,KAAK,EAC5B,GAAI,WAAa,sBAAwB,OAAO,MAAM,OAAS,EAAE,EAAE,KAAK,IAAM,MAAO,OACrF,MAAM,KAAO,MAAM,QAAQ,MAAM,WAAW,EAAI,KAAK,YAAe,MAAM,QAAQ,MAAM,WAAW,EAAI,KAAK,YAAc,CAAC,EAC3H,kBAAkB,IAAI,SAAU,CAAE,KAAM,QAAS,KAAK,IAAI,CAAE,CAAC,EACzD,kBAAkB,KAAO,IAAI,kBAAkB,OAAO,kBAAkB,KAAK,EAAE,KAAK,EAAE,KAAK,EAC/F,kBAAkB,KAAM,QAAS,KAAK,CAC1C,OAAS,EAAG,CACJ,GAAG,OAAS,eACZ,QAAQ,MAAM,qBAAsB,CAAC,EACjC,WAAa,uBAAsB,QAAQ,MAAM,QAAU,QAEvE,QAAE,CACM,WAAa,uBAAsB,SAAS,MAAM,QAAU,OACpE,CACJ,EAAG,EAAE,CACT,CAAC,CACL,CAGA,SAAS,yBAAyB,UAAW,CAC3C,GAAK,UACL,GAAI,CACF,MAAM,MAAQ,SAAS,cAAc,KAAK,EAC1C,MAAM,UAAY,YAClB,MAAM,MAAM,SAAW,QACvB,MAAM,MAAM,KAAO,UACnB,MAAM,MAAM,IAAM,IAClB,MAAM,MAAM,WAAa,SACzB,MAAM,MAAM,cAAgB,OAC5B,MAAM,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA,UAMlB,SAAS,KAAK,YAAY,KAAK,EAC/B,MAAM,EAAI,KAAK,MAAO,MAAM,uBAAyB,MAAM,sBAAsB,EAAE,OAAU,MAAM,sBAAsB,EAAE,OAAU,MAAM,cAAgB,CAAE,EAC7J,MAAM,OAAO,EACT,GAAK,EAAI,GAAG,UAAU,MAAM,YAAY,cAAe,EAAI,IAAI,CACrE,MAAW,CAAC,CACd,CAEA,SAAS,kCAAkC,UAAW,CACpD,GAAK,UACL,WAAU,MAAM,QAAU,GAC1B,UAAU,aAAa,OAAQ,SAAS,EACxC,GAAI,CAAE,yBAAyB,SAAS,CAAG,MAAW,CAAC,CACvD,GAAI,CAAE,UAAU,aAAa,YAAY,GAAG,CAAG,MAAW,CAAC,CAE3D,UAAU,UAAY;AAAA;AAAA,YAEhB,MAAM,KAAK,CAAE,OAAQ,CAAE,CAAC,EAAE,IAAI,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAOrC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,QAGjB,CAGA,SAAS,6BAA6B,UAAW,MAAO,CACtD,GAAI,CAAC,UAAW,OAChB,MAAM,EAAI,OAAO,OAAS,MAAM,OAAS,EAAE,EAAE,KAAK,EAClD,IAAI,EAAI,KACR,GAAI,CAAE,EAAIE,qBAAoB,CAAC,CAAG,MAAW,CAAC,CAC9C,GAAI,CAAC,GAAK,CAAC,EAAE,OAAS,CAAC,EAAE,MAAM,QAAS,CAAE,kCAAkC,SAAS,EAAG,MAAQ,CAGhG,UAAU,MAAM,QAAU,GAC1B,UAAU,aAAa,OAAQ,SAAS,EACxC,GAAI,CAAE,yBAAyB,SAAS,CAAG,MAAW,CAAC,CACvD,GAAI,CAAE,UAAU,aAAa,YAAY,GAAG,CAAG,MAAW,CAAC,CAE3D,MAAM,MAAQ,EAAE,MACV,IAAM,OAAO,MAAM,SAAW,EAAE,EAAE,KAAK,EACvC,KAAO,OAAO,MAAM,SAAW,EAAE,EAAE,KAAK,EACxC,KAAQ,EAAE,QAAU,QAAW,OAAO,MAAM,MAAQ,EAAE,EAAE,KAAK,EAAI,GACjE,KAAQ,EAAE,QAAU,SAAW,KAAQ,gEAAgE,WAAW,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,gBAAkB,GAC9J,SAAW,KAAO,8BAA8B,WAAW,IAAI,CAAC,UAAY,GAElF,UAAU,UAAY;AAAA,yDAC6B,WAAW,GAAG,CAAC;AAAA;AAAA,oCAEpC,QAAQ;AAAA;AAAA,YAEhC,IAAI;AAAA;AAAA;AAAA,YAGJ,MAAM,KAAK,CAAE,OAAQ,CAAE,CAAC,EAAE,IAAI,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAOrC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,QAIf,MAAM,IAAM,UAAU,cAAc,sBAAsB,EACtD,KAAK,IAAI,iBAAiB,QAAS,SAAY,CACjD,GAAI,CAAE,MAAM,MAAQ,IAAM,MAAW,CAAC,CACtC,GAAI,CAAE,UAAU,MAAM,QAAU,MAAQ,MAAW,CAAC,CACpD,GAAI,CAAE,MAAM,eAAe,IAAK,MAAO,CAAE,QAAS,IAAK,QAAS,IAAK,CAAC,CAAG,MAAW,CAAC,CACvF,CAAC,CACH,CAGJ,SAAS,kBAAkB,KAAM,UAAW,MAAO,CAE/C,IAAI,SAAW,2BAA2B,IAAI,EAC9C,MAAM,EAAI,OAAO,OAAS,MAAM,OAAS,EAAE,EAAE,KAAK,EAIlD,GAAI,CACA,MAAM,EAAIA,qBAAoB,CAAC,EAE/B,GAAI,GAAK,EAAE,OAAS,EAAE,MAAM,QAAS,CACjC,MAAM,MAAQ,EAAE,MACV,MAAQ,EAAE,OAAS,GACnB,IAAM,OAAO,MAAM,SAAW,EAAE,EAAE,KAAK,EACvC,UAAY,MAAM,MAAQ,oBAAoB,GAAG,EAEvD,GAAI,IAAK,CAEL,SAAW,SAAS,OAAO,GAAK,OAAO,EAAE,SAAW,EAAE,UAAY,EAAE,EAAE,KAAK,IAAM,GAAG,EAGpF,MAAM,OAAS,CACX,QAAS,IACT,QAAS,MAAM,QACf,KAAM,MAAM,QAEZ,WAAY,MAAM,UAAY,GAC9B,WAAY,GACZ,YAAa,MACb,WAAY,SAChB,EAGA,SAAS,QAAQ,MAAM,CAC3B,CACJ,CACJ,OAAS,EAAG,CAAE,QAAQ,KAAK,oBAAqB,CAAC,CAAG,CAGpD,GAAI,CAAC,UAAY,SAAS,SAAW,EAAG,CACpC,GAAI,CAAE,UAAU,gBAAgB,WAAW,CAAG,MAAW,CAAC,CAC1D,UAAU,MAAM,QAAU,QAC1B,UAAU,UAAY,0JACtB,MACJ,CAGA,UAAU,UAAY,SAAS,IAAI,CAAC,KAAM,MAAQ,CAC9C,MAAM,EAAI,uBAAuB,IAAI,EAG/B,OAAS,CAAC,EAAE,EAAE,YAAc,UAAU,KAAK,OAAO,EAAE,UAAU,CAAC,GAC/D,UAAa,KAAK,YAAc,IAAQ,KAAK,YAAc,GAC3D,KAAK,UACL,KAAK,KAAK,EAAE,aAAe,EAAE,SAAW,EAAE,EAG1C,SAAW,CAAC,CAAC,KAAK,WAClB,SAAY,KAAK,WAAc,OAAO,KAAK,UAAU,EAAI,GAE/D,IAAI,UAAY,GACZ,SACA,UAAY,gEAAgE,WAAW,QAAQ,CAAC,KAAK,WAAW,QAAQ,CAAC,gBAClH,UAAY,KAAK,YAK5B,MAAM,WAAa,SAAW,aAAe,GACvC,UAAY,MAAM,KAAK,IAAI,IAAI,OAAO,EAAE,YAAc,EAAE,EACzD,MAAM,GAAG,EACT,IAAI,MAAQ,KAAK,KAAK,EAAE,QAAQ,0CAA2C,MAAM,CAAC,EAClF,OAAO,MAAQ,MAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,EAChD,MAAM,EAAG,CAAC,EACV,KAAK,IAAI,EAEd,MAAO;AAAA,iCACkB,UAAU,eAAe,GAAG;AAAA;AAAA,uCAEtB,WAAW,OAAO,EAAE,aAAe,EAAE,SAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,gBAClF,UAAY,oDAAoD,WAAW,SAAS,CAAC,gBAAkB,EAAE;AAAA;AAAA,cAE3G,SAAS;AAAA,iBAEnB,CAAC,EAAE,KAAK,EAAE,EAEV,GAAI,CAAE,UAAU,gBAAgB,WAAW,CAAG,MAAW,CAAC,CAC1D,UAAU,MAAM,QAAU,QAG1B,UAAU,iBAAiB,YAAY,EAAE,QAAQ,IAAM,CACnD,GAAG,iBAAiB,QAAS,SAAY,CACrC,MAAM,KAAO,SAAS,GAAG,QAAQ,GAAG,EAE9B,EAAI,uBAAuB,IAAI,EAErC,MAAM,MAAQ,EAAE,QAChB,UAAU,MAAM,QAAU,OAE1B,MAAM,eAAe,KAAK,QAAS,MAAO,CAAC,CAC/C,CAAC,CACL,CAAC,CACL,CAKI,eAAe,eAAe,QAAS,MAAO,cAAe,CACzD,WAAW,EAAI,EAEf,MAAM,SAAW,OAAQ,OAAS,MAAM,OAAW,eAAiB,cAAc,SAAY,EAAE,EAAE,KAAK,EACjG,IAAM,OAAO,SAAW,EAAE,EAAE,KAAK,EACjC,UAAY,sBAAsB,cAAc,EAEtD,GAAI,CACA,MAAM,MAAQ,mBAAmB,KAAK,EAChC,IAAM,GAAG,OAAO,cAAc,YAAY,mBAAmB,GAAG,CAAC,iBAAiB,mBAAmB,KAAK,CAAC,GAG3G,KAAO,MADD,MAAM,MAAM,GAAG,GACJ,KAAK,EACtB,MAAQ,KAAK,OAAS,MAAQ,CAAC,EAG/B,eAAiB,OAAO,MAAM,YAAc,MAAM,UAAY,EAAE,EAAE,KAAK,EACvE,UAAY,CAAC,CAAC,MAAM,UAEpB,kBAAoB,MAAM,QAAQ,MAAM,iBAAiB,EAAI,MAAM,kBAAoB,CAAC,EAC9F,IAAI,gBAAkB,0BAA0B,MAAM,SAAW,MAAM,kBAAoB,cAAc,SAAW,MAAM,MAAO,iBAAiB,EAElJ,MAAM,YACD,gBAAgB,MAAM,aAAa,GAAK,CAAC,GAAG,CAAC,IAC7C,OAAO,eAAiB,cAAc,SAAW,EAAE,EAAE,MAAM,aAAa,GAAK,CAAC,GAAG,CAAC,IAClF,OAAO,OAAS,MAAM,OAAS,EAAE,EAAE,MAAM,aAAa,GAAK,CAAC,GAAG,CAAC,GACjE,GAEE,YAAe,UAAU,KAAK,cAAc,EAAI,eAAkB,YAAc,GAChF,iBAAmB,OAAO,MAAM,kBAAoB,MAAM,SAAW,iBAAmB,EAAE,EAAE,KAAK,EAUvG,GAPI,aAAe,CAAC,IAAI,OAAO,MAAM,WAAW,KAAK,EAAE,KAAK,eAAe,IACvE,gBAAmB,gBAAkB,GAAG,eAAe,KAAK,WAAW,GAAK,aAM5E,CAAC,WAAa,CAAC,UAAU,KAAK,WAAW,EAAG,CAC5C,UAAU,8GAA+F,EACzG,GAAI,CACA,oBAAoB,CAChB,QAAS,eACT,OAAQ,YACR,OAAQ,kBACR,UACA,MAAO,SACP,QAAS,OAAO,iBAAoB,OAAS,MAAM,OAAU,EAAE,EAC/D,gBAAiB,OAAO,iBAAmB,EAAE,EAC7C,iBACA,kBACA,QAAS,IACT,IAAK,aAAe,GACpB,UAAW,GACX,OAAQ,wBACZ,CAAC,CACL,MAAY,CAAC,CACb,WAAW,EAAK,EAChB,MACJ,CAGA,GAAI,CACA,aAAa,QAAQ,eAAgB,KAAK,UAAU,CAChD,QAAS,gBACT,SAAU,YACV,QACA,GAAI,KAAK,IAAI,CACjB,CAAC,CAAC,EACF,GAAI,CAAE,uBAAuB,CAAE,QAAkB,QAAS,gBAAiB,SAAU,OAAO,aAAe,EAAE,CAAE,CAAC,CAAG,MAAY,CAAC,CAEpI,MAAY,CAAC,CAGb,MAAM,YAAY,YAAa,gBAAiB,CAC5C,cAAe,GACf,QAAS,eACT,OAAQ,YACR,UACA,MAAO,SACP,QAAS,IACT,QAAS,gBACT,gBACA,iBACA,kBACA,IAAK,OAAO,SAAS,OAAO,MAAM,GAAG,CAAC,EAAI,OAAO,MAAM,GAAG,EAAI,KAC9D,IAAK,OAAO,SAAS,OAAO,MAAM,GAAG,CAAC,EAAI,OAAO,MAAM,GAAG,EAAI,KAC9D,OAAQ,OAAO,MAAM,QAAU,wBAAwB,kBAAmB,OAAO,GAAK,EAAE,EAAE,KAAK,EAC/F,YAAa,OAAO,MAAM,aAAe,wBAAwB,kBAAmB,eAAe,GAAK,EAAE,EAAE,KAAK,EACjH,KAAM,OAAO,MAAM,MAAQ,wBAAwB,kBAAmB,UAAU,GAAK,wBAAwB,kBAAmB,aAAa,GAAK,EAAE,EAAE,KAAK,EAC3J,SAAU,OAAO,MAAM,UAAY,wBAAwB,kBAAmB,6BAA6B,GAAK,EAAE,EAAE,KAAK,EACzH,UAAW,EACf,CAAC,CAEL,OAAS,EAAG,CACR,QAAQ,MAAM,CAAC,EACf,GAAI,CACA,oBAAoB,CAChB,QAAS,eACT,OAAQ,YACR,OAAQ,gBACR,UACA,MAAO,SACP,QAAS,OAAQ,OAAS,MAAM,OAAU,EAAE,EAC5C,QAAS,IACT,OAAQ,OAAO,GAAK,EAAE,SAAW,GAAK,eAAe,CACzD,CAAC,CACL,MAAY,CAAC,CACb,UAAU,8CAA8C,EACxD,WAAW,EAAK,CACpB,CACA,kBAAkB,KAAK,CAC3B,CAEA,eAAe,YAAY,IAAK,YAAa,KAAO,CAAC,EAAG,CAEpD,MAAM,IAAM,OAAQ,MAAQ,KAAK,SAAY,cAAc,EACrD,cAAgB,CAAC,EAAE,MAAQ,KAAK,eAChC,QAAU,OAAQ,OAAS,KAAK,SAAW,KAAK,kBAAqB,EAAE,EAAE,KAAK,EAC9E,MAAQ,OAAQ,MAAQ,KAAK,OAAU,EAAE,EAAE,KAAK,EAChD,UAAY,OAAQ,MAAQ,KAAK,WAAc,sBAAsB,GAAG,CAAC,EAAE,KAAK,EAChF,gBAAkB,OAAQ,OAAS,KAAK,iBAAmB,KAAK,UAAa,aAAe,EAAE,EAAE,KAAK,EACrG,iBAAmB,OAAQ,MAAQ,KAAK,kBAAqB,iBAAmB,aAAe,EAAE,EAAE,KAAK,EACxG,kBAAoB,MAAM,QAAQ,MAAQ,KAAK,iBAAiB,EAAI,KAAK,kBAAoB,CAAC,EAEpG,GAAI,CAEA,GAAI,cACA,GAAI,CACA,oBAAoB,CAChB,QAAS,IACT,OAAQ,OAAQ,MAAQ,KAAK,QAAW,KAAK,EAC7C,OAAQ,QACR,UACA,IAAK,OAAO,KAAO,EAAE,EACrB,QAAS,OAAO,aAAe,EAAE,EACjC,gBACA,iBACA,kBACA,QACA,MACA,UAAY,MAAQ,OAAO,KAAK,WAAc,UAAa,KAAK,UAAY,MAChF,CAAC,CACL,MAAY,CAAC,CAGjB,MAAM,IAAM,MAAO,OAAO,kBAAkB,OAAS,OAAO,OAAO,mBAAmB,IAAK,IAAI,CAAC,EAEhG,IAAI,KAAO,KACX,GAAI,CAAE,KAAO,MAAM,IAAI,KAAK,CAAG,MAAW,CAAC,CAE3C,GAAI,CAAC,IAAI,GAAI,MAAM,IAAI,MAAM,MAAM,SAAW,eAAe,EAE7D,GAAI,MAAQ,KAAK,UAAY,GAAO,CAChC,MAAMG,YAAa,gCAAgC,IAAI,EACjD,eAAiB,CACnB,IAAK,OAAO,KAAO,EAAE,EACrB,QAAS,OAAO,aAAe,EAAE,EACjC,SAAU,GACV,gBAAiB,GACjB,QAAS,GACT,GAAI,KAAK,IAAI,EACb,MAAO,CAAC,EACR,SAAU,GACV,QAAS,KAAK,SAAW,KACxB,IAAK,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KAC5D,IAAK,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KAC5D,YAAa,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KACpE,YAAa,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KACpE,QACA,OAAQ,OAAO,KAAK,QAAU,EAAE,EAAE,KAAK,EACvC,YAAa,OAAO,KAAK,aAAe,EAAE,EAAE,KAAK,EACjD,KAAM,OAAO,KAAK,MAAQ,EAAE,EAAE,KAAK,EACnC,SAAU,OAAO,KAAK,UAAY,EAAE,EAAE,KAAK,EAC3C,cAAe,CAAC,CAAC,OAAO,KAAK,aAAe,EAAE,EAAE,KAAK,EACrD,GAAGA,WACR,EACA,GAAI,CAAE,aAAa,QAAQ,YAAa,KAAK,UAAU,cAAc,CAAC,CAAG,MAAY,CAAC,CACtF,GAAI,CACA,SAAS,cAAc,IAAI,YAAY,eAAe,CAAC,EACvD,SAAS,cAAc,IAAI,YAAY,mBAAoB,CAAE,OAAQ,cAAe,CAAC,CAAC,CAC1F,MAAY,CAAC,CAGb,GAFA,UAAU,mBAAmB,KAAM,IAAK,CAAE,QAAS,YAAa,QAAS,QAAS,IAAK,KAAM,CAAC,EAAG,CAAE,KAAM,EAAK,CAAC,EAE3G,cACA,GAAI,CACA,oBAAoB,CAChB,QAAS,IACT,OAAQ,OAAQ,MAAQ,KAAK,QAAW,KAAK,EAC7C,OAAQ,aACR,UACA,IAAK,OAAO,KAAO,EAAE,EACrB,QAAS,OAAO,aAAe,EAAE,EACjC,gBACA,iBACA,kBACA,QACA,MACA,UAAY,MAAQ,OAAO,KAAK,WAAc,UAAa,KAAK,UAAY,OAC5E,QAAS,GACT,OAAQ,KAAK,WAAa,iBAC9B,CAAC,CACL,MAAY,CAAC,CAGjB,MACJ,CAEA,GAAI,CAAC,MAAQ,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,MAAM,SAAW,oBAAoB,EAGjF,MAAM,MAAQ,KAAK,OAAS,CAAC,EACvB,WAAa,gCAAgC,IAAI,EACjD,MAAQ,CACV,IACA,QAAS,YACT,SAAU,GACV,gBAAiB,GACjB,QAAS,KAAK,UAAY,GAC1B,GAAI,KAAK,IAAI,EACb,MACA,SAAW,OAAS,KAAK,UAAY,KAAK,WAAa,OAAO,KAAK,UAAY,KAAK,SAAS,EAAK,MAAM,QAAQ,KAAK,GAAK,MAAM,CAAC,EAAI,OAAQ,MAAM,CAAC,EAAE,UAAY,MAAM,CAAC,EAAE,WAAa,MAAM,CAAC,EAAE,IAAM,MAAM,CAAC,EAAE,QAAU,MAAM,CAAC,EAAE,MAAQ,MAAM,QAAQ,MAAM,CAAC,CAAC,EAAI,MAAM,CAAC,EAAE,CAAC,EAAI,KAAQ,EAAE,EAAI,GACjS,QAAS,KAAK,SAAW,KACxB,IAAK,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KAC5D,IAAK,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KAC5D,YAAa,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KACpE,YAAa,OAAO,SAAS,OAAO,KAAK,GAAG,CAAC,EAAI,OAAO,KAAK,GAAG,EAAI,KACpE,QACA,OAAQ,OAAO,KAAK,QAAU,EAAE,EAAE,KAAK,EACvC,YAAa,OAAO,KAAK,aAAe,EAAE,EAAE,KAAK,EACjD,KAAM,OAAO,KAAK,MAAQ,EAAE,EAAE,KAAK,EACnC,SAAU,OAAO,KAAK,UAAY,EAAE,EAAE,KAAK,EAC3C,cAAe,CAAC,CAAC,OAAO,KAAK,aAAe,EAAE,EAAE,KAAK,EACrD,GAAG,UACR,EAWA,GARA,aAAa,QAAQ,YAAa,KAAK,UAAU,KAAK,CAAC,EAGvD,SAAS,cAAc,IAAI,YAAY,eAAe,CAAC,EACvD,SAAS,cAAc,IAAI,YAAY,mBAAoB,CAAE,OAAQ,KAAM,CAAC,CAAC,EAE7E,OAAO,EAEH,cACA,GAAI,CACA,oBAAoB,CAChB,QAAS,IACT,OAAQ,OAAQ,MAAQ,KAAK,QAAW,KAAK,EAC7C,OAAQ,UACR,UACA,IAAK,OAAO,KAAO,EAAE,EACrB,QAAS,OAAO,aAAe,EAAE,EACjC,gBACA,iBACA,kBACA,QACA,MACA,UAAY,MAAQ,OAAO,KAAK,WAAc,UAAa,KAAK,UAAY,OAC5E,QAAS,EACb,CAAC,CACL,MAAY,CAAC,CAGrB,OAAS,EAAG,CAER,MAAM,IAAM,GAAK,EAAE,QAAU,EAAE,QAAU,sBAGzC,GAFA,UAAU,GAAG,EAET,cACA,GAAI,CACA,oBAAoB,CAChB,QAAS,IACT,OAAQ,OAAQ,MAAQ,KAAK,QAAW,KAAK,EAC7C,OAAQ,QACR,UACA,IAAK,OAAO,KAAO,EAAE,EACrB,QAAS,OAAO,aAAe,EAAE,EACjC,gBACA,iBACA,kBACA,QACA,MACA,UAAY,MAAQ,OAAO,KAAK,WAAc,UAAa,KAAK,UAAY,OAC5E,OAAQ,OAAO,KAAO,OAAO,CACjC,CAAC,CACL,MAAY,CAAC,CAGrB,QAAE,CACE,WAAW,EAAK,CACpB,CACJ,CAMA,IAAI,mBAAqB,GAEzB,SAAS,0BAA2B,CAChC,GAAI,CAGA,GAFI,oBAEA,OAAO,qBAAsB,OAEjC,MAAM,GAAK,YAAY,EACvB,GAAI,CAAC,IAAM,CAAC,GAAG,KAAO,CAAC,GAAG,UAAY,CAAC,GAAG,MAAO,OAOjD,GAAI,MAAM,QAAQ,GAAG,KAAK,EAAG,CACzB,mBAAqB,GACrB,OAAO,EACP,MACJ,CAEA,IAAI,WAAa,GAAG,SAAW,GAAG,IAC9B,KAAO,KACX,GAAI,CAAE,KAAO,KAAK,MAAM,aAAa,QAAQ,cAAc,GAAK,MAAM,CAAG,MAAW,CAAE,KAAO,IAAM,CACnG,MAAM,eAAiB,CAAC,EAAE,MAAQ,KAAK,UAAY,CAAC,KAAK,UAAY,OAAO,KAAK,QAAQ,IAAM,OAAO,GAAG,KAAO,EAAE,IAG5G,UAAY,EAAE,iBAAiB,EACrC,GAAI,YACA,UAAU,MAAQ,OAAO,YAAc,EAAE,EACzC,UAAU,QAAQ,IAAM,OAAO,GAAG,KAAO,EAAE,EACvC,gBAAkB,KAAK,SAAS,CAChC,MAAM,SAAW,CAAE,QAAS,OAAO,KAAK,OAAO,EAAG,QAAS,OAAO,YAAc,EAAE,EAAG,WAAY,OAAO,GAAG,KAAO,KAAK,UAAY,EAAE,CAAE,EACvI,UAAU,QAAQ,SAAW,KAAK,UAAU,QAAQ,CACxD,CAGJ,mBAAqB,GACrB,WAAW,EAAI,EACf,QAAQ,QAAQ,YAAY,OAAO,GAAG,GAAG,EAAG,OAAO,UAAU,EAAG,CAC5D,cAAe,GACf,QAAS,eACT,OAAQ,eACR,QAAS,OAAO,GAAG,SAAW,MAAM,SAAW,EAAE,EACjD,IAAK,OAAO,SAAS,OAAO,GAAG,aAAe,GAAG,GAAG,CAAC,EAAI,OAAO,GAAG,aAAe,GAAG,GAAG,EAAI,KAC5F,IAAK,OAAO,SAAS,OAAO,GAAG,aAAe,GAAG,GAAG,CAAC,EAAI,OAAO,GAAG,aAAe,GAAG,GAAG,EAAI,KAC5F,OAAQ,OAAO,GAAG,QAAU,EAAE,EAC9B,YAAa,OAAO,GAAG,aAAe,EAAE,EACxC,KAAM,OAAO,GAAG,MAAQ,EAAE,EAC1B,SAAU,OAAO,GAAG,UAAY,EAAE,EAClC,UAAW,GAAG,kBAAoB,EACtC,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EAAE,QAAQ,IAAM,CAAC,CAAC,CACxC,OAAS,EAAG,CACR,QAAQ,KAAK,kCAAmC,CAAC,CACrD,CACJ,CAGA,SAAS,WAAW,UAAW,CAC3B,MAAM,OAAS,EAAE,WAAW,EACxB,SAAQ,OAAO,MAAM,QAAU,UAAY,OAAS,QAGxD,MAAM,UAAY,EAAE,cAAc,EAC9B,WAAW,UAAU,UAAU,OAAO,iBAAkB,CAAC,CAAC,SAAS,EACvE,MAAM,UAAY,EAAE,iBAAiB,EACjC,YAAW,UAAU,SAAW,CAAC,CAAC,WACnC,WAAW,UAAU,IAAI,CAChC,CAMA,SAAS,qBAAqB,IAAK,CACjC,GAAI,CACF,IAAI,EAAI,OAAO,KAAO,EAAE,EAAE,KAAK,EAC/B,GAAI,CAAC,EAAG,MAAO,GACf,MAAM,GAAK,EAAE,YAAY,EAMzB,OAHI,EAAE,SAAS,MAAM,GAAK,EAAE,SAAS,IAAI,GAAK,EAAE,SAAS,OAAO,GAG5D,GAAG,SAAS,kBAAe,GAAK,GAAG,SAAS,yBAAsB,EAAU,EAG5E,GAAG,SAAS,eAAe,GAAK,GAAG,SAAS,QAAQ,GAAK,GAAG,SAAS,eAAe,GAAK,GAAG,SAAS,eAAe,EAC/G,mKAIL,GAAG,SAAS,sBAAsB,GAAK,GAAG,SAAS,oBAAoB,GAAK,GAAG,SAAS,wBAAwB,GAAK,GAAG,SAAS,gBAAgB,GAAK,GAAG,SAAS,aAAa,EAC1K,+GAIL,GAAG,SAAS,SAAS,GAAM,GAAG,SAAS,SAAS,GAAK,GAAG,SAAS,SAAS,GAAM,GAAG,SAAS,oBAAoB,EAC3G,kEAIL,GAAG,SAAS,aAAa,GAAK,GAAG,SAAS,SAAS,GAAK,GAAG,SAAS,iBAAiB,EAChF,sDAIL,GAAG,SAAS,eAAe,GAAK,GAAG,WAAW,OAAO,EAChD,gEAGF,CACT,MAAY,CACV,OAAO,OAAO,KAAO,EAAE,CACzB,CACF,CAGA,SAAS,WAAW,IAAK,CACvB,OAAO,OAAO,KAAO,EAAE,EACpB,WAAW,IAAK,OAAO,EACvB,WAAW,IAAK,MAAM,EACtB,WAAW,IAAK,MAAM,EACtB,WAAW,IAAK,QAAQ,EACxB,WAAW,IAAK,OAAO,CAC5B,CAEJ,SAAS,mBAAmB,KAAM,IAAK,KAAM,CACvC,MAAM,IAAO,MAAQ,KAAK,QAAW,OAAO,KAAK,OAAO,EAAI,4EACtD,QAAW,MAAQ,KAAK,QAAW,OAAO,KAAK,OAAO,EAAI,6HAC1D,QAAU,MAAQ,KAAK,QAAU,OAAO,KAAK,OAAO,EAAI,GACxD,QAAU,MAAQ,KAAK,QAAU,OAAO,KAAK,OAAO,EAAI,GACxD,QAAU,MAAQ,KAAK,QAAU,OAAO,KAAK,OAAO,EAAI,MACxD,cAAgB,IAAM,CAC1B,GAAI,CACF,MAAM,OAAU,OAAO,oBAAsB,OAAO,sBAAwB,OAAO,eAAiB,IAAO,GAC3G,GAAI,QAAU,YAAY,KAAK,OAAO,MAAM,CAAC,EAAG,OAAO,OAAO,MAAM,EAAE,KAAK,CAC7E,MAAY,CAAC,CACb,GAAI,CACF,MAAM,GAAK,aAAa,QAAQ,wBAAwB,GAAK,GAC7D,GAAI,IAAM,YAAY,KAAK,OAAO,EAAE,CAAC,EAAG,OAAO,OAAO,EAAE,EAAE,KAAK,CACjE,MAAY,CAAC,CACb,MAAO,EACT,GAAG,EAEG,WAAc,QAAU,OAAO,WAAc,OAAO,OAAO,UAAU,EAAI,2BAE/E,MAAO;AAAA,gDACmC,WAAW,KAAO,EAAE,CAAC,mBAAmB,WAAW,OAAO,CAAC,oBAAoB,WAAW,OAAO,CAAC,mBAAmB,WAAW,OAAO,CAAC;AAAA,8CAC1I,WAAW,GAAG,CAAC;AAAA,6CAChB,WAAW,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,4DAIJ,WAAW,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAOxC,WAAW,UAAU,CAAC;AAAA;AAAA,OAG9D,CAKA,MAAM,qBAAuB,0BACvB,qBAAuB,2BAE7B,SAAS,oBAAqB,CAC5B,OAAQ,QAAU,OAAO,yBACrB,OAAO,OAAO,wBAAwB,EACtC,gFACN,CAEA,SAAS,eAAgB,CACvB,GAAI,CACF,MAAM,GAAK,IAAI,gBAAgB,OAAO,SAAS,QAAU,EAAE,EACrD,KAAO,CAAC,aAAa,aAAa,eAAe,WAAW,aAAa,EACzE,IAAM,CAAC,EACb,YAAK,QAAQ,GAAK,CAAE,MAAM,EAAI,GAAG,IAAI,CAAC,EAAO,IAAG,IAAI,CAAC,EAAI,EAAG,CAAC,EACtD,OAAO,KAAK,GAAG,EAAE,OAAS,IAAM,IACzC,MAAY,CAAE,OAAO,IAAM,CAC7B,CAEA,SAAS,qBAAsB,CAC7B,GAAI,CACF,MAAM,SAAW,eAAe,QAAQ,oBAAoB,EAC5D,GAAI,SAAU,OAAO,QACvB,MAAY,CAAC,CACb,MAAM,KAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAI,KAAK,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,EAAG,EAAE,EACvF,GAAI,CAAE,eAAe,QAAQ,qBAAsB,GAAG,CAAG,MAAY,CAAC,CACtE,OAAO,GACT,CAEA,SAAS,oBAAoB,MAAO,CAClC,MAAM,EAAI,OAAO,OAAS,EAAE,EAAE,KAAK,EACnC,MAAO,YAAY,KAAK,CAAC,CAC3B,CAEA,SAAS,mBAAmB,IAAK,CAC/B,GAAI,CAAE,MAAO,CAAC,CAAC,aAAa,QAAQ,qBAAuB,OAAO,KAAO,EAAE,CAAC,CAAG,MAAY,CAAE,MAAO,EAAO,CAC7G,CAEA,SAAS,gBAAgB,IAAK,CAC5B,GAAI,CAAE,aAAa,QAAQ,qBAAuB,OAAO,KAAO,EAAE,EAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAG,MAAY,CAAC,CACzG,CAEA,SAAS,kCAAmC,CACtC,OAAO,iCACX,OAAO,+BAAiC,GAExC,SAAS,iBAAiB,SAAU,MAAO,GAAM,CAC/C,MAAM,KAAO,EAAE,QAAU,EAAE,OAAO,QAAU,EAAE,OAAO,QAAQ,cAAc,EAAI,KAC/E,GAAI,CAAC,KAAM,OAEX,EAAE,eAAe,EAEjB,MAAM,KAAO,KAAK,QAAQ,iBAAiB,EACrC,MAAQ,KAAK,cAAc,eAAe,EAC1C,IAAM,KAAK,cAAc,aAAa,EACtC,MAAQ,KAAO,KAAK,cAAc,aAAa,EAAI,KAEnD,IAAM,KAAO,OAAO,KAAK,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAI,GACrD,QAAU,KAAO,OAAO,KAAK,QAAQ,SAAW,EAAE,EAAE,KAAK,EAAI,GAC7D,QAAU,KAAO,OAAO,KAAK,QAAQ,SAAW,EAAE,EAAE,KAAK,EAAI,GAC7D,QAAU,KAAO,OAAO,KAAK,QAAQ,SAAW,KAAK,EAAE,KAAK,EAAI,MAEhE,MAAQ,MAAQ,OAAO,MAAM,OAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAI,GAEjE,OAAS,CAAC,EAAG,KAAO,CACnB,QACL,MAAM,YAAc,GAAK,GACzB,MAAM,UAAU,OAAO,KAAM,CAAC,CAAC,EAAE,EACjC,MAAM,UAAU,OAAO,MAAO,CAAC,EAAE,EACnC,EAEA,GAAI,CAAC,oBAAoB,KAAK,EAAG,CAC/B,OAAO,kCAA8B,EAAK,EAC1C,OAAS,MAAM,OAAS,MAAM,MAAM,EACpC,MACF,CAEA,GAAI,KAAO,mBAAmB,GAAG,EAAG,CAClC,OAAO,8DAA4D,EAAI,EACvE,MACF,CAEA,GAAI,CACF,OAAO,cAAU,EAAI,EACjB,MAAK,IAAI,SAAW,IAExB,MAAM,QAAU,CACd,MACA,IAAK,KAAO,GACZ,QAAS,SAAW,GACpB,QAAS,SAAW,GACpB,QACA,UAAW,oBAAoB,EAC/B,KAAM,OAAO,SAAS,KACtB,SAAU,SAAS,UAAY,GAC/B,OAAQ,UAAU,UAAY,GAC9B,GAAK,MAAQ,KAAK,gBAAmB,KAAK,eAAe,EAAE,gBAAgB,EAAE,UAAY,GACzF,GAAI,UAAU,WAAa,GAC3B,IAAK,cAAc,CACrB,EAEM,KAAO,MAAM,MAAM,mBAAmB,EAAG,CAC7C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,OAAO,EAC5B,UAAW,EACb,CAAC,EAED,IAAI,IAAM,KACV,GAAI,CAAE,IAAM,MAAM,KAAK,KAAK,CAAG,MAAY,CAAC,CAE5C,GAAI,CAAC,KAAK,IAAM,CAAC,KAAO,CAAC,IAAI,GAC3B,MAAM,IAAI,MAAO,KAAO,IAAI,QAAW,IAAI,QAAU,cAAc,EAGrE,gBAAgB,KAAO,EAAE,EACzB,GAAI,CAAE,aAAa,QAAQ,yBAA0B,KAAK,CAAG,MAAY,CAAC,CAC1E,GAAI,CACF,oBAAoB,CAClB,OAAQ,oBACR,QACA,OAAQ,aACR,QAAS,GACT,MAAO,SAAW,KAAO,GACzB,QAAS,SAAW,GACpB,gBAAiB,SAAW,GAC5B,YAAa,KAAO,GACpB,QACA,cAAe,MACf,iBAAkB,EACpB,CAAC,CACH,MAAY,CAAC,CAEb,GAAI,CACE,OAAO,WAAa,OAAO,OAAO,UAAU,MAAS,YACvD,OAAO,UAAU,KAAK,CAAE,MAAO,2BAA4B,IAAK,KAAO,GAAI,OAAQ,CAAC,CAExF,MAAY,CAAC,CAEb,OAAO,6DAAuD,EAAI,EAC9D,QAAO,MAAM,SAAW,IACxB,MAAO,IAAI,SAAW,GAAM,IAAI,YAAc,UACpD,MAAc,CACZ,OAAO,kEAAmE,EAAK,EAC3E,MAAK,IAAI,SAAW,GAC1B,CACF,EAAG,EAAI,EACT,CAGA,iCAAiC,EACrC,SAAS,UAAU,IAAK,KAAO,CAAC,EAAG,CAC3B,MAAM,IAAM,EAAE,QAAQ,EACtB,GAAI,CAAC,IAAK,OAEV,GAAI,CAAC,IAAK,CACR,IAAI,MAAM,QAAU,OACpB,IAAI,YAAc,GAClB,MACF,CAEA,MAAM,QAAU,CAAC,CAAC,KAAK,KACvB,IAAI,aAAa,OAAQ,OAAO,EAChC,MAAM,QAAU,QAAU,OAAO,GAAG,EAAI,qBAAqB,GAAG,EAE5D,QAAS,IAAI,UAAY,QACxB,IAAI,YAAc,QAEvB,IAAI,MAAM,QAAU,OACxB,CAEA,SAAS,QAAS,CACd,MAAM,MAAQ,YAAY,EACpB,UAAY,EAAE,cAAc,EAGlC,GAFI,YAAW,UAAU,MAAM,QAAU,SAErC,MAAM,UAAY,MAAM,MAAO,CAG/B,IAAI,WAAa,MAAM,SAAW,MAAM,IACpC,KAAO,KACX,GAAI,CAAE,KAAO,KAAK,MAAM,aAAa,QAAQ,cAAc,GAAK,MAAM,CAAG,MAAW,CAAE,KAAO,IAAM,CAGnG,MAAM,UAAY,EAAE,iBAAiB,EACrC,GAAI,YACA,UAAU,MAAQ,OAAO,YAAc,EAAE,EACzC,UAAU,QAAQ,IAAM,OAAO,MAAM,KAAO,EAAE,EAC1C,MAAQ,KAAK,SAAS,CACtB,MAAM,SAAW,CAAE,QAAS,OAAO,KAAK,OAAO,EAAG,QAAS,OAAO,YAAc,EAAE,EAAG,WAAY,OAAO,MAAM,KAAO,KAAK,UAAY,EAAE,CAAE,EAC1I,UAAU,QAAQ,SAAW,KAAK,UAAU,QAAQ,CACxD,CAGJ,GAAI,CACE,OAAO,oBAAsB,OAAO,OAAO,mBAAmB,eAAkB,YAClF,OAAO,mBAAmB,cAAc,WAAY,EAAI,EAE1D,MAAM,eAAiB,SAAS,cAAc,6BAA6B,EACvE,gBAAgB,eAAe,gBAAgB,wBAAwB,EACvE,OAAO,oBAAsB,OAAO,OAAO,mBAAmB,OAAU,YAC1E,OAAO,mBAAmB,MAAM,CAAE,aAAc,EAAM,CAAC,CAE3D,MAAY,CAAC,CACjB,KACI,IAAI,CACE,OAAO,oBAAsB,OAAO,OAAO,mBAAmB,eAAkB,YAClF,OAAO,mBAAmB,cAAc,GAAI,EAAK,CAErD,MAAY,CAAC,CAErB,CAGI,SAAS,aAAe,UACxB,SAAS,iBAAiB,mBAAoB,gBAAgB,EAE9D,iBAAiB,CAEzB,GAAG,EAIH,SAAS,eAAe,IAAK,CAE3B,OAAO,OAAO,KAAO,EAAE,EAAE,KAAK,CAChC,CAGA,SAAS,oBAAoB,MAAO,CAClC,MAAM,IAAM,OAAO,OAAS,EAAE,EAAE,KAAK,EACrC,GAAI,CAAC,IAAK,OAAO,KAGjB,MAAM,EAAI,eAAe,eAAe,GAAG,CAAC,EACtC,YAAc,EAAE,QAAQ,MAAO,EAAE,EAAE,OACzC,GAAI,CAAC,EAAG,OAAO,KAEf,KAAM,CAAE,MAAO,MAAO,EAAI,mBAAmB,EAEvC,QAAW,OAAU,CACzB,MAAM,KAAO,eAAe,eAAe,OAAO,OAAO,SAAW,EAAE,CAAC,CAAC,EACxE,GAAI,CAAC,KAAM,MAAO,GAGlB,GAAI,OAAS,EAAG,MAAO,KAIvB,GAAI,KAAK,WAAW,CAAC,EAAG,MAAO,IAG/B,GAAI,EAAE,WAAW,IAAI,GAAK,KAAK,OAAS,EAAG,MAAO,IAGlD,GAAI,YAAc,EAAG,MAAO,GAG5B,GAAI,KAAK,SAAS,CAAC,EAAG,MAAO,IAG7B,MAAM,KAAO,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,OAAO,GAAK,EAAE,QAAU,CAAC,EACnE,GAAI,CAAC,KAAK,OAAQ,MAAO,GAEzB,IAAI,IAAM,EACV,UAAW,OAAO,KACZ,KAAK,SAAS,GAAG,GAAG,MAE1B,MAAM,MAAQ,IAAM,KAAK,OAEzB,OAAI,QAAU,EAAU,GACpB,OAAS,IAAa,GAEnB,CACT,EAEA,IAAI,KAAO,KACP,UAAY,GACZ,UAAY,EAEhB,MAAM,KAAO,CAAC,IAAK,QAAU,CAC3B,UAAW,KAAM,KAAO,CAAC,EAAI,CAC3B,MAAM,GAAK,QAAQ,CAAC,GAEhB,GAAK,WAAc,KAAO,WAAa,YAAc,SAAW,QAAU,WAC5E,KAAO,EAAG,UAAY,MAAO,UAAY,GAE7C,CACF,EAQA,OANA,KAAK,MAAO,OAAO,EACnB,KAAK,OAAQ,QAAQ,EAEjB,CAAC,MAAQ,CAAC,MAAM,SAGhB,UAAY,GAAW,KAEpB,CAAE,MAAO,KAAM,MAAO,UAAW,MAAO,SAAU,CAC3D",
  "names": ["__addrBookSections", "__addrKeyLoose", "__addrBookBestMatch", "saved", "recent", "assignment"]
}
