{
  "version": 3,
  "sources": ["../../src/client/logger/ensureBadgeLogger.ts", "../../src/utils/placeholders.ts", "../../src/countries.ts", "../../src/client/europlate.client.ts"],
  "sourcesContent": ["import type { ColorKey, CCColors, SmartLogFn, BadgeFn } from \"../../../types/logger-colors.ts\";\nexport type { ColorKey, CCColors, SmartLogFn, BadgeFn } from \"../../../types/logger-colors.ts\";\n/**\n * Inizializza (senza sovrascrivere) CC_BADGE/CC_LOG globali.\n * Restituisce BADGE/LOG che prependono SEMPRE `prefix`.\n */\nexport function ensureBadgeLogger(prefix: string, debug: boolean) {\n  const DEFAULT_COLORS: CCColors = {\n    ok: \"#9fe870\",\n    warn: \"#f3b44a\",\n    err: \"#e85959\",\n    info: \"#7ac8ff\",\n    debug: \"#7e57c2\", // \uD83D\uDC48 viola \"developer\" (material deep-purple)\n    gold: \"#b69b6a\",\n    bg1: \"#111\",\n    bg3: \"#333\",\n  };\n\n  const G = window as any;\n  G.CC_COLORS = G.CC_COLORS || DEFAULT_COLORS;\n\n  const globalBADGE = typeof G.CC_BADGE === \"function\" ? (G.CC_BADGE as (m: string, t: string, c?: string) => void) : null;\n\n  // Badge locale \u201Cdi base\u201D (usato solo se NON esiste un globale gi\u00E0 presente)\n  function localBADGE(mod: string, msg: string, colorKey?: ColorKey | string) {\n    if (!debug) return;\n    const c = G.CC_COLORS[colorKey as keyof CCColors] || colorKey || G.CC_COLORS.gold;\n    const txc = [G.CC_COLORS[\"bg1\"], G.CC_COLORS[\"bg1\"]].includes(c) ? \"#fff\" : \"#000\";\n    //const tag = `%c CodeCorn\u2122 ${mod} %c ${prefix} ${msg} %c`;\n    // \u26A0\uFE0F niente prefix qui: lo aggiunge il wrapper BADGE sotto\n    const tag = `%c CodeCorn\u2122 ${mod} %c ${msg} %c`;\n    const css1 = `background:${G.CC_COLORS.bg1};color:#fff;padding:3px 6px;border-radius:4px 0 0 4px;`;\n    const css2 = `background:${c};color:${txc};font-weight:bold;padding:3px 6px;text-transform:uppercase;`;\n    const css3 = `background:${G.CC_COLORS.bg3};color:#fff;padding:3px 6px;border-radius:0 4px 4px 0;`;\n    try {\n      console.log(tag, css1, css2, css3);\n    } catch {}\n  }\n\n  // Non sovrascrivere: se non c\u2019\u00E8, definisci; se c\u2019\u00E8, lascialo com\u2019\u00E8.\n  if (!globalBADGE) {\n    G.CC_BADGE = localBADGE;\n  }\n\n  // LOG intelligente con prefix, serializzazione safe\n  function localLOG(...args: any[]) {\n    if (!debug) return;\n    const parts = args.map((a) => {\n      if (a && (a.nodeType || (a as any).jquery)) return \"[DOM]\";\n      if (typeof a === \"object\") {\n        try {\n          return JSON.stringify(a);\n        } catch {\n          return \"[Object]\";\n        }\n      }\n      return String(a);\n    });\n    // usa il badge globale ma aggiungi tu il prefix\n    (G.CC_BADGE as any)(\"EuroPlate\", `${prefix} ${parts.join(\" \")}`, \"ok\");\n  }\n\n  if (typeof G.CC_LOG !== \"function\") {\n    G.CC_LOG = localLOG;\n  }\n\n  // Wrapper che prepende SEMPRE il prefix anche se CC_BADGE \u00E8 custom\n  const BADGE = (mod: string, msg: string, color?: ColorKey | string) => (G.CC_BADGE as any)(mod, `${prefix} ${msg}`, color);\n\n  const LOG = (...a: any[]) => localLOG(...a);\n\n  return { BADGE, LOG };\n}\n", "// src/utils/placeholders.ts\n\nimport type { CountryKey, InputMaskLayout } from \"../countries.js\";\n\n/**\n * Converte un \"display format\" leggibile in un placeholder.\n * Regole :\n *  - Lettere ( A / B / L / H / C ) \u2192 \"_\"\n *  - Cifre ( 9 / # / 0-9 ) \u2192 \"_\"\n *  - Separatori ( spazio , - , . , / ) \u2192 preservati\n *  - Per formati multipli ( \"|\" o \"/\" ) prende il PRIMO segmento significativo\n */\nexport function placeholderFromDisplayFormat(format: string): string {\n  const pick = firstSignificantVariant(format);\n\n  let out = \"\";\n  for (const ch of pick) {\n    if (isLetterToken(ch) || isDigitToken(ch)) out += \"_\";\n    else out += ch; // separatori, spazi, trattini, ecc.\n  }\n  // normalizza spazi multipli\n  return out.replace(/\\s{2,}/g, \" \").trim();\n}\n\n/**\n * Separa per '|' o '/' e sceglie la variante pi\u00F9 rappresentativa.\n * Criteri : prima variante non vuota , preferibilmente con cifre.\n */\nfunction firstSignificantVariant(format: string): string {\n  const parts = format.split(/\\s*(?:\\|\\/|\\/|\\|)\\s*/).filter(Boolean);\n  if (parts.length === 0) return format;\n  // Heuristica : preferisci quella con pi\u00F9 cifre / lunghezza\n  return parts.slice().sort((a, b) => scoreVariant(b) - scoreVariant(a))[0];\n}\n\nfunction scoreVariant(s: string): number {\n  const digits = (s.match(/[9#0-9]/g) || []).length;\n  return digits * 10 + s.length; // peso maggiore ai digit\n}\n\nfunction isLetterToken(ch: string): boolean {\n  // Token usati nei display : A B L H C X\n  return /[A-Z]/.test(ch) && /[ABLHCX]/.test(ch);\n}\n\nfunction isDigitToken(ch: string): boolean {\n  return /[9#0-9]/.test(ch);\n}\n// --- helper per tokenizzare una mask ---\nfunction isLetterTokenMask(ch: string): boolean {\n  // token lettere usati nelle nostre mask: L / H / C / X (pi\u00F9 eventuali A/B)\n  return /[A-Z]/.test(ch) && /[LH CAX]/.test(ch.replace(/ /g, \"\")); // tollera spazio\n}\nfunction isDigitTokenMask(ch: string): boolean {\n  return /[9#0]/.test(ch);\n}\nfunction isSeparator(ch: string): boolean {\n  return !isLetterTokenMask(ch) && !isDigitTokenMask(ch);\n}\n\n// prende il primo/ultimo char non-separatore\nfunction firstNonSep(s: string): string | null {\n  for (const ch of s) if (!isSeparator(ch)) return ch;\n  return null;\n}\nfunction lastNonSep(s: string): string | null {\n  for (let i = s.length - 1; i >= 0; i--) {\n    const ch = s[i];\n    if (!isSeparator(ch)) return ch;\n  }\n  return null;\n}\n\n// blocchi di lettere consecutivi (per preferire LL-...-LL)\nfunction countLetterBlocks(s: string): number {\n  let blocks = 0,\n    inBlock = false;\n  for (const ch of s) {\n    if (isLetterTokenMask(ch)) {\n      if (!inBlock) {\n        blocks++;\n        inBlock = true;\n      }\n    } else if (!isSeparator(ch)) {\n      inBlock = false;\n    } else {\n      // separatore: chiude eventuale blocco\n      inBlock = false;\n    }\n  }\n  return blocks;\n}\n\nfunction scoreMaskVariant(s: string): number {\n  const digits = (s.match(/[9#0]/g) || []).length;\n  const letters = (s.match(/[A-Z]/g) || []).length; // conta i token lettera\n  const len = s.length;\n\n  const first = firstNonSep(s);\n  const last = lastNonSep(s);\n\n  const startsWithLetter = first ? isLetterTokenMask(first) : false;\n  const endsWithLetter = last ? isLetterTokenMask(last) : false;\n\n  const letterBlocks = countLetterBlocks(s);\n\n  // base: preferisci molte cifre (pi\u00F9 informativo) e lunghezza\n  // bonus: inizio con lettera (+8), fine con lettera (+4), 2+ blocchi lettera (+3)\n  // ulteriore bonus: pi\u00F9 lettere totali (+letters)\n  return digits * 10 + len + (startsWithLetter ? 8 : 0) + (endsWithLetter ? 4 : 0) + (letterBlocks >= 2 ? 3 : 0) + letters;\n}\n\n/**\n * Dato un array di mask Inputmask, genera un placeholder rappresentativo\n * scegliendo la variante con punteggio migliore (preferenza: inizio lettera).\n */\nexport function placeholderFromMasks(masks: string[]): string {\n  const best = masks.slice().sort((a, b) => scoreMaskVariant(b) - scoreMaskVariant(a))[0] || \"\";\n  let out = \"\";\n  for (const ch of best) {\n    if (isLetterTokenMask(ch)) out += \"_\";\n    else if (isDigitTokenMask(ch)) out += \"_\";\n    else out += ch; // separatori\n  }\n  return out.replace(/\\s{2,}/g, \" \").trim();\n}\n\n/**\n * Costruisce una mappa CountryKey \u2192 placeholder a partire dai DISPLAY_FORMATS.\n */\nexport function buildPlaceholdersFromDisplay(displayFormats: Partial<Record<CountryKey, string>>): Partial<Record<CountryKey, string>> {\n  const out: Partial<Record<CountryKey, string>> = {};\n  for (const [k, fmt] of Object.entries(displayFormats) as [CountryKey, string][]) {\n    out[k] = placeholderFromDisplayFormat(fmt);\n  }\n  return out;\n}\n\n/**\n * Inietta i placeholder mancanti dentro le layout Inputmask.\n * - Se la layout ha `placeholder` non vuoto \u2192 NON toccare.\n * - Se `mask` \u00E8 stringa \u2192 deriva placeholder dalla mask.\n * - Se `mask` \u00E8 array \u2192 usa placeholderFromMasks.\n * - Se fallisce \u2192 prova da DISPLAY_FORMATS.\n * Inoltre: normalizza keepStatic `null` \u2192 `undefined`.\n */\nexport function finalizeInputMaskLayouts<T extends Partial<Record<CountryKey, InputMaskLayout>>>(baseLayouts: T, displayFormats: Partial<Record<CountryKey, string>>): T {\n  // copia superficiale della mappa; poi copiamo ogni voce che modifichiamo\n  const out: Partial<Record<CountryKey, InputMaskLayout>> = { ...baseLayouts };\n\n  const displayPH: Partial<Record<CountryKey, string>> = {};\n  for (const [k, fmt] of Object.entries(displayFormats) as [CountryKey, string][]) {\n    displayPH[k] = placeholderFromDisplayFormat(fmt);\n  }\n\n  (Object.keys(out) as CountryKey[]).forEach((cc) => {\n    const layout = out[cc];\n    if (!layout) return;\n\n    let next: InputMaskLayout = { ...layout };\n\n    // normalizza keepStatic: null \u2192 undefined\n    if (next.keepStatic === null) {\n      delete (next as any).keepStatic;\n    }\n\n    // se gi\u00E0 presente e non vuoto, lascia stare\n    if (next.placeholder && next.placeholder.trim()) {\n      out[cc] = next;\n      return;\n    }\n\n    // prova a derivare dalla mask\n    const m = next.mask;\n    if (typeof m === \"string\") {\n      next.placeholder = placeholderFromMasks([m]);\n    } else if (Array.isArray(m) && m.length > 0) {\n      next.placeholder = placeholderFromMasks(m as string[]);\n    }\n\n    // fallback dal display format\n    if (!next.placeholder || !next.placeholder.trim()) {\n      if (displayPH[cc]) next.placeholder = displayPH[cc]!;\n    }\n\n    out[cc] = next;\n  });\n\n  return out as T;\n}\n", "// src/countries.ts\nimport { finalizeInputMaskLayouts } from \"./utils/placeholders.js\";\n\n// prettier-ignore\n/** Tutti i country code supportati (Russia esclusa) */\nexport type CountryKey = \"IT\" | \"UK\" | \"DE\" | \"FR\" | \"ES\" | \"PT\" | \"NL\" | \"BE\" | \"CH\" | \"AT\" | \"IE\" | \"LU\" | \"DK\" | \"SE\" | \"NO\" | \"FI\" | \"PL\" | \"CZ\" | \"SK\" | \"HU\" | \"RO\" | \"BG\" | \"SI\" | \"HR\" | \"GR\" | \"LT\" | \"LV\" | \"EE\" | \"UA\";\n\n/** Tipo veicolo */\nexport type VehicleType = \"car\" | \"motorcycle\" | \"any\";\n\n// prettier-ignore\n/** Lista di paesi supportati (const + tipizzato) */\nexport const supportedCountries = [\n  \"IT\", \"UK\", \"DE\", \"FR\", \"ES\", \"PT\", \"NL\", \"BE\", \"CH\", \"AT\", \"IE\", \"LU\", \"DK\", \"SE\", \"NO\", \"FI\", \"PL\", \"CZ\", \"SK\", \"HU\", \"RO\", \"BG\", \"SI\", \"HR\", \"GR\", \"LT\", \"LV\", \"EE\", \"UA\",\n] as const satisfies ReadonlyArray<CountryKey>;\n\n// prettier-ignore\nexport const FLAG_MAP = {\n  IT:\"it\", UK:\"gb\", DE:\"de\", FR:\"fr\", ES:\"es\", PT:\"pt\", NL:\"nl\", BE:\"be\", CH:\"ch\", AT:\"at\", IE:\"ie\", LU:\"lu\",\n  DK:\"dk\", SE:\"se\", NO:\"no\", FI:\"fi\", PL:\"pl\", CZ:\"cz\", SK:\"sk\", HU:\"hu\", RO:\"ro\", BG:\"bg\", SI:\"si\", HR:\"hr\",\n  GR:\"gr\", LT:\"lt\", LV:\"lv\", EE:\"ee\", UA:\"ua\"\n} as const;\n\n// prettier-ignore\nexport const COUNTRY_NAMES = {\n  IT:\"Italy\", UK:\"United Kingdom\", DE:\"Germany\", FR:\"France\", ES:\"Spain\", PT:\"Portugal\", NL:\"Netherlands\",\n  BE:\"Belgium\", CH:\"Switzerland\", AT:\"Austria\", IE:\"Ireland\", LU:\"Luxembourg\", DK:\"Denmark\", SE:\"Sweden\",\n  NO:\"Norway\", FI:\"Finland\", PL:\"Poland\", CZ:\"Czechia\", SK:\"Slovakia\", HU:\"Hungary\", RO:\"Romania\", BG:\"Bulgaria\",\n  SI:\"Slovenia\", HR:\"Croatia\", GR:\"Greece\", LT:\"Lithuania\", LV:\"Latvia\", EE:\"Estonia\", UA:\"Ukraine\"\n} as const;\n\nexport type CountryCode = keyof typeof FLAG_MAP;\n\n/**\n * Normalizes some real-world quirks:\n * - GB \u21E2 UK (ISO alpha-2 is GB; plates often use UK). Your map uses \"UK\", so we normalize to that.\n */\nexport function normalizeCode(code: string): CountryCode | undefined {\n  const up = code.trim().toUpperCase();\n  const alias = up === \"GB\" ? \"UK\" : up;\n  return alias in FLAG_MAP ? (alias as CountryCode) : undefined;\n}\n\nexport function getFlagSlug(code: string): string | undefined {\n  const cc = normalizeCode(code);\n  return cc ? FLAG_MAP[cc] : undefined;\n}\n\nexport function getCountryName(code: string): string | undefined {\n  const cc = normalizeCode(code);\n  return cc ? COUNTRY_NAMES[cc] : undefined;\n}\n\nexport const COUNTRY_CODES = Object.keys(FLAG_MAP) as CountryCode[];\n\nexport type CountryInfo = {\n  code: CountryCode;\n  flag: (typeof FLAG_MAP)[CountryCode];\n  name: (typeof COUNTRY_NAMES)[CountryCode];\n};\n\nexport const COUNTRIES: CountryInfo[] = COUNTRY_CODES.map((c) => ({\n  code: c as CountryCode,\n  flag: FLAG_MAP[c as CountryCode],\n  name: COUNTRY_NAMES[c as CountryCode],\n}));\n\n// Reverse lookups (by flag slug or name)\nexport const FLAG_TO_CODE = Object.fromEntries(COUNTRY_CODES.map((c) => [FLAG_MAP[c], c])) as Record<(typeof FLAG_MAP)[CountryCode], CountryCode>;\n\nexport const NAME_TO_CODE = Object.fromEntries(COUNTRY_CODES.map((c) => [COUNTRY_NAMES[c], c])) as Record<(typeof COUNTRY_NAMES)[CountryCode], CountryCode>;\n\n/** Entry di pattern per tipo veicolo */\nexport interface PatternSet {\n  car?: ReadonlyArray<{ rx: RegExp }>;\n  motorcycle?: ReadonlyArray<{ rx: RegExp }>;\n}\n\n/** Definizione Paese */\nexport interface CountryDef {\n  name: string;\n  patterns: PatternSet;\n}\n\n// Tipi: solo type, nessuna dipendenza runtime\ntype IMOpts = Inputmask.Options;\n\nexport interface InputMaskLayout {\n  mask: string | string[];\n  definitions?: IMOpts[\"definitions\"];\n  greedy?: IMOpts[\"greedy\"];\n  keepStatic?: IMOpts[\"keepStatic\"];\n  showMaskOnHover?: IMOpts[\"showMaskOnHover\"];\n  showMaskOnFocus?: IMOpts[\"showMaskOnFocus\"];\n  placeholder?: string;\n}\n\n/** Mappe leggibili per UI / placeholder / doc */\nexport const DISPLAY_FORMATS: Partial<Record<CountryKey, string>> = {\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 EUROZONA BASE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  IT: \"AA 999 AA\", // (senza I O Q U)\n  FR: \"AA-999-AA\",\n  ES: \"9999 BBB\", // (solo consonanti)\n  DE: \"B-AA 1234\", // variabile (prefisso+serie)\n  NL: \"AA-999-AA | 99-AAA-9 | A-999-AA | AA-999-A | 9-AA-999 | LL-LL-99 | 99-LL-LL | LLL-99-L\",\n  PT: \"99-AA-99 | AA-99-99 | 99-99-AA\",\n  BE: \"1-ABC-123 | ABC-123\",\n  CH: \"GE 123456\",\n  AT: \"W 1234 AB\",\n  IE: \"23-D-12345\",\n  LU: \"123456 | 12-3456\",\n  DK: \"AB 12 345\",\n  SE: \"ABC 12A\",\n  NO: \"AB 12345\",\n  FI: \"ABC-123\",\n  PL: \"WW 12345\", // formato generico\n  CZ: \"1AB 2345\",\n  SK: \"AA-999 AA\",\n  HU: \"ABC-123 | AAAA-123 | AA99-AA\",\n  RO: \"BB 99 AAA / B 999 AAA\",\n  BG: \"AA 9999 AA\",\n  SI: \"LJ-123-AB\",\n  HR: \"ST 1234-AA\",\n  GR: \"ABC-1234\",\n  LT: \"ABC 123\",\n  LV: \"AB-1234\",\n  EE: \"123 ABC\",\n  UA: \"AA 1234 AA\",\n  UK: \"AB12 CDE\",\n};\n\n/** Layout Inputmask per digitazione assistita (coerenti con le regex) */\nexport const INPUTMASK_LAYOUTS: Partial<Record<CountryKey, InputMaskLayout>> = {\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 ITALIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  IT: {\n    // AA 999 AA  ma con alfabeto ristretto (niente I O Q U)\n    mask: \"HH 999 HH\",\n    definitions: {\n      // accetta minuscole+maiuscole, poi upper via casing\n      H: { validator: \"[A-HJ-NPR-TV-Za-hj-npr-tv-z]\", casing: \"upper\" },\n    },\n    placeholder: \"__ ___ __\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: 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 FRANCIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  FR: {\n    // AA-999-AA (solo trattini) \u2014 nessuna defs: usa L base dal client\n    mask: \"LL-999-LL\",\n    placeholder: \"__-___-__\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: 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 SPAGNA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  ES: {\n    // 9999 BBB  \u2192 consonanti senza A E I O U Q \u00D1\n    mask: \"9999 CCC\",\n    definitions: {\n      // consonanti in entrambe le casse, poi upper\n      C: { validator: \"[BCDFGHJKLMNPRSTVWXYZbcdfghjklmnprstvwxyz]\", casing: \"upper\" },\n    },\n    placeholder: \"____ ___\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: 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 REGNO UNITO \u2500\u2500\u2500\u2500\u2500\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  UK: {\n    // AB12 CDE (formato corrente) \u2014 nessuna defs: L base\n    mask: \"LL99 LLL\",\n    placeholder: \"__ __ ___\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: true,\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 PAESI BASSI \u2500\u2500\u2500\u2500\u2500\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  NL: {\n    // Sidecode multipli\n    mask: [\"LL-999-LL\", \"99-LLL-9\", \"L-999-LL\", \"LL-999-L\", \"9-LL-999\", \"LL-LL-99\", \"99-LL-LL\", \"LLL-99-L\"],\n    // Alfabeto NL senza A E I O U Q\n    definitions: { L: { validator: \"[BDFGHJKLNPRSTVXYZbdfghjklnprstvxyz]\", casing: \"upper\" } },\n    placeholder: \"\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: false,\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 ROMANIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  RO: {\n    // BB 99 AAA / B 999 AAA \u2014 nessuna defs: L base\n    mask: [\"LL 99 LLL\", \"LL 999 LLL\", \"L 99 LLL\", \"L 999 LLL\"],\n    placeholder: \"\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: false,\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 SLOVACCHIA \u2500\u2500\u2500\u2500\u2500\u2500\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  SK: {\n    // DD-999LL  (accetta varianti con / senza spazi / trattino) \u2014 L base\n    mask: [\"LL-999 LL\", \"LL999LL\", \"LL 999 LL\"],\n    placeholder: \"\",\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: false,\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 PORTOGALLO \u2500\u2500\u2500\u2500\u2500\u2500\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  PT: {\n    // L base\n    mask: [\"99-LL-99\", \"LL-99-99\", \"99-99-LL\"],\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: false,\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 BELGIO \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  BE: {\n    // L base\n    mask: [\"9-LLL-999\", \"LLL-999\"],\n    keepStatic: true,\n    showMaskOnHover: false,\n    showMaskOnFocus: false,\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 DANIMARCA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  DK: {\n    // AA 12 345 \u2014 L base\n    mask: \"LL 99 999\",\n    keepStatic: 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 SVEZIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  SE: {\n    // ABC 12X  (X alfanumerico) \u2014 L base; X con minuscole\n    mask: \"LLL 99 X\",\n    definitions: {\n      X: { validator: \"[A-Za-z0-9]\", casing: \"upper\" },\n    },\n    keepStatic: 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 NORVEGIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  NO: {\n    // AA 12345 \u2014 L base\n    mask: \"LL 99999\",\n    keepStatic: 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 FINLANDIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  FI: {\n    // ABC-123 \u2014 L base\n    mask: \"LLL-999\",\n    keepStatic: 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 REP. CECA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  CZ: {\n    // 1AB 2345 \u2014 L base\n    mask: \"9 LL 9999\",\n    keepStatic: 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 UNGHERIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  HU: {\n    // ABC-123  /  AAAA-123  /  AA99-AA \u2014 L base\n    mask: [\"LLL-999\", \"LLLL-999\", \"LL99-LL\"],\n    keepStatic: 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 BULGARIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  BG: {\n    // L base\n    mask: [\"L 9999 L\", \"LL 9999 LL\", \"L9999L\", \"LL9999LL\"],\n    keepStatic: 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 SLOVENIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  SI: {\n    // L base\n    mask: [\"LL-999- L\", \"LL-999- LL\", \"LL-9999- L\", \"LL-9999- LL\"],\n    keepStatic: 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 CROAZIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  HR: {\n    // L base\n    mask: [\"LL 999- LL\", \"LL 9999- LL\"],\n    keepStatic: 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 GRECIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  GR: {\n    // L base\n    mask: \"LLL-9999\",\n    keepStatic: 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 LITUANIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  LT: {\n    // L base\n    mask: \"LLL 999\",\n    keepStatic: 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 LETTONIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  LV: {\n    // L base\n    mask: \"LL-9999\",\n    keepStatic: 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 ESTONIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  EE: {\n    // L base\n    mask: \"999 LLL\",\n    keepStatic: 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 UCRAINA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  UA: {\n    // L base\n    mask: \"LL 9994 LL\".replace(\"9994\", \"9999\"),\n    keepStatic: 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 LUSSEMBURGO \u2500\u2500\u2500\u2500\u2500\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  LU: {\n    // 4\u20136 cifre  oppure  1\u20132 cifre - 3\u20134 cifre\n    mask: [\"9999\", \"99999\", \"999999\", \"9-999\", \"99-999\", \"9-9999\", \"99-9999\"],\n    keepStatic: 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 GERMANIA / AUSTRIA / SVIZZERA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Prefissi/lunghezze variabili, caratteri speciali (\u00C4\u00D6\u00DC) \u2192 niente mask rigida.\n  // DE: \u2014  AT: \u2014  CH: \u2014\n};\n\n// /** Helper ergonomici */\n// \uD83D\uDD1A Esporta una versione finale che garantisce i placeholder dove mancano\nexport const INPUTMASK_LAYOUTS_FINAL = finalizeInputMaskLayouts(\n  INPUTMASK_LAYOUTS, // <- T = Partial<Record<CountryKey, InputMaskLayout>>\n  DISPLAY_FORMATS\n);\n\n// opzionale: punta i consumer alla mappa \"final\"\nexport function getInputMask(country: CountryKey) {\n  return (INPUTMASK_LAYOUTS_FINAL as Record<CountryKey, InputMaskLayout | undefined>)[country] ?? null;\n}\n\nexport function getDisplayFormat(country: CountryKey): string | null {\n  return (DISPLAY_FORMATS as Record<CountryKey, string | undefined>)[country] ?? null;\n}\n\n/**\n * Mappa paesi \u2192 definizioni con regex.\n * Usa `satisfies` per garantire che ogni chiave rispetti CountryDef.\n */\nexport const RX: Record<CountryKey, CountryDef> = {\n  IT: {\n    name: \"Italy\",\n    patterns: {\n      // Car 1994\u2013today: AA 999 AA (no I O Q U), skip \"EE\" series\n      car: [{ rx: /^(?!EE)[A-HJ-NPR-TV-Z]{2}\\s?\\d{3}\\s?[A-HJ-NPR-TV-Z]{2}$/ }],\n      //BK 05-10 car: [{ rx: /^(?!EE)[A-HJ-NP-RTZ]{2}\\s?\\d{3}\\s?[A-HJ-NP-RTZ]{2}$/ }],\n      // Motorcycle 1999\u2013oggi: AA 00000 (no I O Q U)\n      motorcycle: [{ rx: /^[A-HJ-NPR-TV-Z]{2}\\s?\\d{5}$/ }],\n      //motorcycle: [{ rx: /^[A-HJ-NP-RTZ]{2}\\s?\\d{5}$/ }],\n      // BK 05-10 motorcycle: [{ rx: /^[A-HJ-NP-RTZ]{2}\\s?\\d{5}$/ }],\n    },\n  },\n\n  UK: {\n    name: \"United Kingdom\",\n    patterns: {\n      car: [\n        // Current (2001\u2013today): AB12 CDE\n        { rx: /^[A-Z]{2}\\d{2}\\s?[A-Z]{3}$/ },\n        // Broad legacy: A1, AB1, ABC1234, etc.\n        { rx: /^[A-Z]{1,3}\\s?\\d{1,4}\\s?[A-Z]{0,3}$/ },\n      ],\n      // (moto non dettagliata qui; si pu\u00F2 aggiungere in futuro)\n    },\n  },\n\n  DE: {\n    name: \"Germany\",\n    patterns: {\n      car: [\n        // Standard: prefisso regionale 1\u20133 lettere + '-' + 1\u20132 lettere + 1\u20134 cifre\n        // Nota: sui prefissi compaiono anche umlaut (\u00C4\u00D6\u00DC); li ammettiamo.\n        { rx: /^[A-Z\u00C4\u00D6\u00DC]{1,3}-[A-Z]{1,2}\\s?\\d{1,4}$/ },\n\n        // Ente pubblico / senza serie lettere a destra delle targhette:\n        // prefisso 1\u20133 lettere + '-' + 1\u20134 cifre\n        { rx: /^[A-Z\u00C4\u00D6\u00DC]{1,3}-\\d{1,4}$/ },\n\n        // Targhe \u201Cspeciali\u201D pratiche e frequenti:\n        // 06 = targhe prova/officina; 07 = storiche (H\u00E4ndler/Oldtimer)\n        { rx: /^[A-Z\u00C4\u00D6\u00DC]{1,3}-06\\s?\\d{1,4}$/ },\n        { rx: /^[A-Z\u00C4\u00D6\u00DC]{1,3}-07\\s?\\d{1,4}$/ },\n\n        // Bundeswehr (militari): \"Y-123 456\" (spazio opzionale). Cifre in 2 blocchi (1\u20133 + 1\u20133).\n        { rx: /^Y-\\d{1,3}\\s?\\d{1,3}$/ },\n      ],\n    },\n  },\n\n  // FR: SOLO trattini, niente spazi\n  FR: {\n    name: \"France\",\n    patterns: {\n      // AA-000-AA (nessuno spazio)\n      // TESBVUG 1.0.13\n      car: [{ rx: /^[A-Z]{2}-\\d{3}-[A-Z]{2}$/ }],\n      //    car: [{ rx: /^[A-Z]{2}[-]\\d{3}[-][A-Z]{2}$/ }],\n      //car: [{ rx: /^[A-Z]{2}\\-\\d{3}\\-[A-Z]{2}$/ }],\n    },\n  },\n\n  // ES: lascia cos\u00EC (gi\u00E0 corretta)\n  ES: {\n    name: \"Spain\",\n    patterns: {\n      // 0000 BBB, lettere da consonanti senza A,E,I,\u00D1,O,Q,U\n      car: [{ rx: /^\\d{4}\\s?[BCDFGHJKLMNPRSTVWXYZ]{3}$/ }],\n    },\n  },\n  PT: {\n    name: \"Portugal\",\n    patterns: {\n      car: [{ rx: /^\\d{2}-[A-Z]{2}-\\d{2}$/ }, { rx: /^[A-Z]{2}-\\d{2}-\\d{2}$/ }, { rx: /^\\d{2}-\\d{2}-[A-Z]{2}$/ }],\n    },\n  },\n\n  NL: {\n    name: \"Netherlands\",\n    patterns: {\n      car: [\n        // Sidecodes \u201Cstorici/moderni\u201D con trattini\n        // AA-123-AA\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}-\\d{3}-[BDFGHJKLNPRSTVXYZ]{2}$/ },\n        // 12-AAA-1\n        { rx: /^\\d{2}-[BDFGHJKLNPRSTVXYZ]{3}-\\d$/ },\n        // 1-AAA-12\n        { rx: /^\\d-[BDFGHJKLNPRSTVXYZ]{3}-\\d{2}$/ },\n        // AA-AA-12\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}-[BDFGHJKLNPRSTVXYZ]{2}-\\d{2}$/ },\n        // 12-AA-AA\n        { rx: /^\\d{2}-[BDFGHJKLNPRSTVXYZ]{2}-[BDFGHJKLNPRSTVXYZ]{2}$/ },\n        // AAA-12-A\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{3}-\\d{2}-[BDFGHJKLNPRSTVXYZ]$/ },\n\n        // Nuovi sidecode (dal 2021): A-001-AA, AA-001-A, 0-AA-001\n        { rx: /^[BDFGHJKLNPRSTVXYZ]-\\d{3}-[BDFGHJKLNPRSTVXYZ]{2}$/ }, // A-001-AA\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}-\\d{3}-[BDFGHJKLNPRSTVXYZ]$/ }, // AA-001-A\n        { rx: /^\\d-[BDFGHJKLNPRSTVXYZ]{2}-\\d{3}$/ }, // 0-AA-001\n\n        // Tollera eventuali spazi al posto dei trattini (import/export/trascrizioni)\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}\\s\\d{3}\\s[BDFGHJKLNPRSTVXYZ]{2}$/ },\n        { rx: /^\\d{2}\\s[BDFGHJKLNPRSTVXYZ]{3}\\s\\d$/ },\n        { rx: /^\\d\\s[BDFGHJKLNPRSTVXYZ]{3}\\s\\d{2}$/ },\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}\\s[BDFGHJKLNPRSTVXYZ]{2}\\s\\d{2}$/ },\n        { rx: /^\\d{2}\\s[BDFGHJKLNPRSTVXYZ]{2}\\s[BDFGHJKLNPRSTVXYZ]{2}$/ },\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{3}\\s\\d{2}\\s[BDFGHJKLNPRSTVXYZ]$/ },\n        { rx: /^[BDFGHJKLNPRSTVXYZ]\\s\\d{3}\\s[BDFGHJKLNPRSTVXYZ]{2}$/ },\n        { rx: /^[BDFGHJKLNPRSTVXYZ]{2}\\s\\d{3}\\s[BDFGHJKLNPRSTVXYZ]$/ },\n        { rx: /^\\d\\s[BDFGHJKLNPRSTVXYZ]{2}\\s\\d{3}$/ },\n      ],\n    },\n  },\n\n  BE: {\n    name: \"Belgium\",\n    patterns: { car: [{ rx: /^[1-9]-[A-Z]{3}-\\d{3}$/ }, { rx: /^[A-Z]{3}-\\d{3}$/ }] },\n  },\n  CH: { name: \"Switzerland\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{1,6}$/ }] } },\n  AT: { name: \"Austria\", patterns: { car: [{ rx: /^[A-Z]{1,3}\\s?\\d{1,4}\\s?[A-Z]{0,2}$/ }] } },\n  IE: { name: \"Ireland\", patterns: { car: [{ rx: /^\\d{2,3}-[A-Z]{1,2}-\\d{1,6}$/ }] } },\n  LU: { name: \"Luxembourg\", patterns: { car: [{ rx: /^\\d{4,6}$/ }, { rx: /^\\d{1,2}-\\d{3,4}$/ }] } },\n  DK: { name: \"Denmark\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{2}\\s?\\d{3}$/ }] } },\n  SE: { name: \"Sweden\", patterns: { car: [{ rx: /^[A-Z]{3}\\s?\\d{2}[A-Z0-9]$/ }] } },\n  NO: { name: \"Norway\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{5}$/ }] } },\n  FI: { name: \"Finland\", patterns: { car: [{ rx: /^[A-Z]{3}-\\d{3}$/ }] } },\n  PL: { name: \"Poland\", patterns: { car: [{ rx: /^[A-Z]{1,3}\\s?[A-Z0-9]{4,5}$/ }] } },\n  CZ: { name: \"Czechia\", patterns: { car: [{ rx: /^\\d[A-Z]{2}\\s?\\d{4}$/ }] } },\n  HU: {\n    name: \"Hungary\",\n    patterns: {\n      car: [\n        { rx: /^[A-Z]{3}-\\d{3}$/ }, // storico: ABC-123\n        { rx: /^[A-Z]{4}-\\d{3}$/ }, // nuovo: 2022\u2192, AAAA-123\n        { rx: /^[A-Z]{2}\\d{2}-[A-Z]{2}$/ }, // ampia (legacy/transitorio)\n      ],\n    },\n  },\n\n  // 7-10 RO: { name: \"Romania\", patterns: { car: [{ rx: /^[A-Z]{1,2}\\s?\\d{2,3}\\s?[A-Z]{3}$/ }] } },\n  RO: {\n    name: \"Romania\",\n    patterns: {\n      car: [\n        // Regola generale: 2 lettere di contea + 2/3 cifre + 3 lettere\n        { rx: /^[A-Z]{2}\\s?\\d{2,3}\\s?[A-Z]{3}$/ },\n        // Eccezione capitale: 1 lettera (solo B) + 2/3 cifre + 3 lettere\n        { rx: /^B\\s?\\d{2,3}\\s?[A-Z]{3}$/ },\n      ],\n    },\n  },\n\n  //SK: { name: \"Slovakia\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{3,4}[A-Z]{0,2}$/ }] } },\n  SK: {\n    name: \"Slovakia\",\n    patterns: {\n      car: [\n        // Formato tipico: DD-999LL (con o senza trattino/spazio)\n        { rx: /^[A-Z]{2}[-\\s]?\\d{3}[A-Z]{2}$/ },\n      ],\n    },\n  },\n  BG: { name: \"Bulgaria\", patterns: { car: [{ rx: /^[A-Z]{1,2}\\s?\\d{4}\\s?[A-Z]{1,2}$/ }] } },\n  SI: { name: \"Slovenia\", patterns: { car: [{ rx: /^[A-Z]{2}-\\d{3,4}-[A-Z]{1,2}$/ }] } },\n  HR: { name: \"Croatia\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{3,4}-[A-Z]{2}$/ }] } },\n  GR: { name: \"Greece\", patterns: { car: [{ rx: /^[A-Z]{3}-\\d{4}$/ }] } },\n  LT: { name: \"Lithuania\", patterns: { car: [{ rx: /^[A-Z]{3}\\s?\\d{3}$/ }] } },\n  LV: { name: \"Latvia\", patterns: { car: [{ rx: /^[A-Z]{2}-\\d{4}$/ }] } },\n  EE: { name: \"Estonia\", patterns: { car: [{ rx: /^\\d{3}\\s?[A-Z]{3}$/ }] } },\n  UA: { name: \"Ukraine\", patterns: { car: [{ rx: /^[A-Z]{2}\\s?\\d{4}\\s?[A-Z]{2}$/ }] } },\n} satisfies Record<CountryKey, CountryDef>;\n", "/**\n * EuroPlate Client SDK \u2014 src/client/europlate.client.ts\n * Copyright (c) 2021-2026 Federico Girolami <f.girolami@codecorn.it>\n * MIT License - https://opensource.org/license/mit/\n * - UI opzionale (wrapper/DOM) + maschera + validazione.\n * - Dipendenze esterne autocaricabili (Inputmask, jQuery, Toastr) via jsDelivr.\n * - Nessun hardcode di paesi/DOM nel core (tutto iniettato via EuroMod).\n *\n * Manutenzione:\n * - Tutti i CDN sono centralizzati in `cdnURLs` (single source of truth).\n * - I getter `getIM/getJQ/getToastr` leggono prima da `opts.deps`, poi da `window`.\n * - Per Inputmask UMD gestiamo sia chiamabile che costruttore (call/new).\n * - Usare SEMPRE `hasIMBound/getIMBound` dentro l\u2019istanza (no variabili globali mutate).\n * - Logger di base (console o esterno) e logger Toastr (se richiesto e disponibile).\n * - I18n minimale (it/en) con possibilit\u00E0 di estensione.\n *\n * Pubblico: types, createEuroPlate()\n * Interno: helpers (cdn, loaders, logger, i18n, dom)\n */\nimport { ensureBadgeLogger } from \"./logger/ensureBadgeLogger.js\";\nimport type { SmartLogFn, BadgeFn } from \"./logger/ensureBadgeLogger.js\";\nimport type { CountryKey } from \"../countries.js\";\nimport { COUNTRY_NAMES, supportedCountries, normalizeCode, getCountryName } from \"../countries.js\";\n\nlet __depsOnce: Promise<void> | null = null;\n\nexport async function ensureDepsOnce(opts: EuroPlateOptions, log: Logger, BADGE: BadgeFn = () => {}, LOG: SmartLogFn = () => {}) {\n  if (!__depsOnce) {\n    __depsOnce = (async () => {\n      BADGE(\"EPV[Deps]\", \"Ensuring dependencies\u2026\", \"info\");\n      try {\n        await ensureDeps(opts, log, BADGE, LOG);\n        BADGE(\"EPV[Deps]\", \"Dependencies ensured successfully\", \"ok\");\n      } catch (err) {\n        BADGE(\"EPV[Deps]\", `Error during ensureDeps: ${(err as Error)?.message || err}`, \"err\");\n        throw err;\n      } finally {\n        BADGE(\"EPV[Deps]\", \"ensureDeps finished\", \"debug\");\n      }\n    })();\n  } else {\n    BADGE(\"EPV[Deps]\", \"Deps ensure already in-flight / done\", \"debug\");\n  }\n  return __depsOnce;\n}\n\n/* ============================================================\n * Tipi PUBBLICI (API surface)\n * ============================================================ */\n\n/** Lingue supportate dall\u2019SDK. */\nexport type I18nCode = \"AUTO\" | \"IT\" | \"EN\";\n\n/** Tipi veicolo supportati dal validatore. */\nexport type VehicleType = \"any\" | \"car\" | \"bike\";\n\n/** Interfaccia logger esterno compatibile. */\nexport type Logger = {\n  debug?: (...a: any[]) => void;\n  info?: (...a: any[]) => void;\n  warn?: (...a: any[]) => void;\n  error?: (...a: any[]) => void;\n  /** Tipo libero lato SDK; verr\u00E0 normalizzato lato toastr. */\n  notify?: (msg: string, type?: string) => void;\n};\n\n/** Riferimenti UI opzionali (se non si usa `wrapper`). */\nexport type EuroPlateUI = {\n  flagIcon?: HTMLElement;\n  flagLabel?: HTMLElement;\n  dropdown?: HTMLElement;\n  button?: HTMLElement;\n  status?: HTMLElement;\n  /** Nuove opzioni di rendering status */\n\n  /**\n   * Dove mostrare lo status:\n   * - \"block\"  \u2192 usa <div class=\"status\"> sotto l\u2019input (default, retro-compat)\n   * - \"inline\" \u2192 overlay dentro l\u2019input, non altera l\u2019altezza\n   * - \"off\"    \u2192 non mostra nessuno status testuale\n   */\n  statusMode?: \"block\" | \"inline\" | \"off\"; // default: \"block\"\n  statusIcon?: \"none\" | \"icon\" | \"pill\"; // default: \"none\"\n  showStatusText?: boolean; // default: block\u2192true, inline\u2192false\n  iconPosition?: \"right\" | \"left\"; // default: \"right\"\n};\n/** Opzioni di configurazione per `createEuroPlate` (client-side SDK). */\nexport type EuroPlateOptions = {\n  /** Lingua/i18n del widget.\n   *  - \"AUTO\": deduce da `navigator.language` (it \u2192 \"it\" altrimenti \"en\").\n   *  - \"IT\" | \"EN\": forza la lingua.\n   *  @default \"AUTO\"\n   */\n  i18n?: I18nCode;\n  /** Input esterno gi\u00E0 presente nel DOM (alternativa a `wrapper`).\n   *  Se passato, l\u2019SDK non genera markup ma usa questo input.\n   */\n  input?: HTMLInputElement; // era required \u2192 ora opzionale (se usi wrapper)\n\n  /** Wrapper in cui generare automaticamente la UI.\n   *  - string: CSS selector (es. \"#my-wrapper\")\n   *  - HTMLElement: nodo esistente\n   *  - false: disabilita auto-build (usa `input`)\n   *  @default false\n   */\n  wrapper?: string | HTMLElement | false; // \uD83D\uDC48 selector, nodo o false (default)\n\n  /** ID forzato da assegnare all\u2019input generato/esterno.\n   *  Se `preserveInputAttrs` \u00E8 true e l\u2019input ha gi\u00E0 un id, non lo sovrascrive.\n   */\n  inputId?: string;\n\n  /** name forzato da assegnare all\u2019input generato/esterno.\n   *  Se `preserveInputAttrs` \u00E8 true e l\u2019input ha gi\u00E0 un name, non lo sovrascrive.\n   */\n  inputName?: string;\n\n  /** Se true, non sovrascrive `id`/`name` su input esterni gi\u00E0 valorizzati.\n   *  @default false\n   */\n  preserveInputAttrs?: boolean;\n\n  /** Riferimenti a elementi UI opzionali (se non si usa `wrapper`). */\n  ui?: EuroPlateUI;\n\n  /** Lista bianca di paesi consentiti (ISO-like: IT, FR, \u2026).\n   *  Se omessa, usa tutti i paesi supportati da EuroMod.\n   */\n  allowedCountries?: string[];\n\n  /** Modalit\u00E0 iniziale.\n   *  - \"AUTO\": tenta il match e adatta mask/placeholder dinamicamente\n   *  - codice paese (es. \"IT\") per forzare una nazione fissa\n   *  @default \"AUTO\"\n   */\n  mode?: \"AUTO\" | string;\n\n  /** Tipo veicolo da passare al validatore (se supportato). @default \"any\" */\n  vehicleType?: VehicleType;\n\n  /** Placeholder personalizzabili. default: \"AA 999 AA / AA-999-AA / 9999 AAA\" */\n  placeholders?: { auto?: string };\n\n  /** Normalizzatore codici paese (es. GB\u2192UK). */\n  normalize?: (code: string) => string;\n\n  /** Formatter per country code (applicato a input/paste). */\n  formatters?: Record<string, (s: string) => string>;\n\n  /** Timing UI: debounce applicazione mask e clear. @default {debounce:80,clear:60} */\n  timings?: { debounce?: number; clear?: number };\n\n  /** Se true, applica focus all\u2019input all\u2019init. @default false */\n  autoFocusOnInit?: boolean;\n\n  /** Dipendenze iniettate (per test o per ambienti bundler).\n   *  - `inputmask`: factory/constructor UMD di Inputmask\n   */\n  deps?: { inputmask?: any };\n\n  /** Flag di autoload per dipendenze esterne.\n   *  @default {inputmask:true,jquery:false,toastr:false}\n   */\n  autoLoadDeps?: {\n    inputmask?: boolean;\n    jquery?: boolean;\n    toastr?: boolean;\n  };\n\n  /** Override di CDN per ogni dipendenza (se serve self-hosting). */\n  cdn?: {\n    inputmask?: string;\n    jquery?: string;\n    toastrJs?: string;\n    toastrCss?: string;\n  };\n\n  /** Se true abilita messaggi di debug (console/toastr). @default false */\n  debug?: boolean;\n\n  /** Se true, tenta di usare Toastr come logger di default:\n   *  - forza best-effort jQuery+Toastr se non presenti (rispettando CDN)\n   *  - se viene passato `logger`, ha precedenza\n   *  @default false\n   */\n  useToastrLogger?: boolean;\n\n  /** Logger esterno opzionale (interna/console compat). */\n  logger?: Logger;\n};\n\n/** Istanza runtime del widget EuroPlate. */\nexport type EuroPlateInstance = {\n  /** Imposta una nazione fissa (es. \"IT\") oppure \"AUTO\". */\n  setCountry: (code: \"AUTO\" | string) => void;\n\n  /** Limita i paesi selezionabili/validabili. */\n  setAllowed: (codes: string[]) => void;\n\n  /** Cambia il tipo di veicolo (pass-through a validazione). */\n  setVehicleType: (t: VehicleType) => void;\n\n  /** Attiva/disattiva debug logging. */\n  setDebug: (on: boolean) => void;\n\n  /** Cambia la modalit\u00E0 (come `setCountry`, mantenendo il focus). */\n  setMode: (m: \"AUTO\" | string) => void;\n\n  /** Cambia lingua runtime (placeholder, label, dropdown). */\n  setI18n: (code: I18nCode) => void;\n\n  /** Valida il contenuto attuale dell\u2019input, aggiornando UI. */\n  validate: () => { ok: boolean; country?: string; value: string };\n\n  /** Distrugge listeners e rimuove mask. */\n  destroy: () => void;\n\n  /** Ritorna la lingua corrente (\u201Cit\u201D | \u201Cen\u201D). */\n  getI18n: () => Lang;\n};\n// --- fine tipi pubblici ---\n\n/* ============================================================\n * Interni: CDN + loaders + getters + ensure deps\n * Puoi continuare a passare le opzioni avanzate quando servono (SRI, media, timeout, ecc.). Esempio:\n * @example ts\n *   await loadScriptOnce(urlIM, { integrity: \"...\", timeoutMs: 20000 });\n *   await loadCssOnce(cssToastr,   { media: \"all\", timeoutMs: 10000 });\n * Extra opzionali (se servono pi\u00F9 avanti)\n * **Preload**: prima di `appendChild` puoi verificare e/o aggiungere un `<link rel=\"preload\" as=\"script\">` / `as=\"style\"`.\n * **AbortSignal**: se vuoi abortire manualmente, estendi le opzioni con `signal?: AbortSignal` e fai `signal.addEventListener(\"abort\", \u2026rej\u2026)`.\n * ============================================================ */\n\n/** @internal */\nconst cdnURLs = {\n  base: \"https://cdn.jsdelivr.net/npm/\",\n  jquery: { v: \"jquery@3.7.1\", JS: \"/dist/jquery.min.js\" },\n  toastr: { v: \"toastr@2.1.4\", JS: \"/build/toastr.min.js\", CSS: \"/build/toastr.min.css\" },\n  inputmask: { v: \"inputmask@5.0.9\", JS: \"/dist/inputmask.min.js\" },\n};\n\n/** @internal */\ntype LoadScriptOptions = {\n  /** Imposta <script type=\"module\"> */\n  module?: boolean;\n  /** crossorigin (default: \"anonymous\") */\n  crossOrigin?: \"\" | \"anonymous\" | \"use-credentials\";\n  /** integrity SRI */\n  integrity?: string;\n  /** CSP nonce da applicare al tag */\n  nonce?: string;\n  /** Attributi extra pass-through (data-*, ecc.) */\n  attrs?: Record<string, string>;\n  /** Timeout hard-fail (ms). 0 = no timeout. Default: 15000 */\n  timeoutMs?: number;\n  /** opzionale: id fisso per dedup */\n  id?: string;\n};\n\n/** @internal */\ntype LoadCssOptions = {\n  /** media attribute (es. \"print\", \"(prefers-color-scheme:dark)\") */\n  media?: string;\n  /** crossorigin (default: \"anonymous\") */\n  crossOrigin?: \"\" | \"anonymous\" | \"use-credentials\";\n  /** integrity SRI */\n  integrity?: string;\n  /** CSP nonce da applicare al tag */\n  nonce?: string;\n  /** Attributi extra pass-through (data-*, ecc.) */\n  attrs?: Record<string, string>;\n  /** Timeout hard-fail (ms). 0 = no timeout. Default: 15000 */\n  timeoutMs?: number;\n  /** opzionale: id fisso per dedup */\n  id?: string;\n};\n\n/** Cache per prevenire doppi insert e coalescare chiamate concorrenti */\nconst inFlightScripts = new Map<string, Promise<void>>();\nconst inFlightCss = new Map<string, Promise<void>>();\n\n// ---------- util comuni ----------\n\n/** Rileva il CSP nonce dall'ambiente (override con opt.nonce). */\nfunction detectCspNonce(explicit?: string): string | undefined {\n  if (explicit) return explicit;\n  const winNonce = (window as any).__CSP_NONCE__;\n  if (typeof winNonce === \"string\" && winNonce) return winNonce;\n  const meta = document.querySelector('meta[name=\"csp-nonce\"]') as HTMLMetaElement | null;\n  const metaNonce = meta?.getAttribute(\"content\") || meta?.getAttribute(\"value\");\n  return metaNonce || undefined;\n}\n\nfunction applyAttrs<T extends HTMLElement>(el: T, attrs?: Record<string, string>) {\n  if (!attrs) return;\n  for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n}\n\n/** Chiave di dedup: preferisci id, altrimenti URL normalizzato. */\nfunction buildKey(kind: \"js\" | \"css\", url: string, id?: string): string {\n  return id ? `${kind}#${id}` : `${kind}:${new URL(url, document.baseURI).href}`;\n}\n\n// ---------- loader script ----------\n\n/** Carica uno <script> esterno una sola volta (idempotente+concurrency-safe).\n *  @internal\n *  @param src URL assoluto/relativo dello script\n *  @returns Promise risolta quando `onload` fires (o noop se gi\u00E0 presente)\n */\n\nexport function loadScriptOnce(src: string, opt: LoadScriptOptions = {}): Promise<void> {\n  if (!src || typeof document === \"undefined\") return Promise.resolve();\n\n  // dedup 1: elemento gi\u00E0 presente in DOM (per src o id)\n  if (opt.id && document.getElementById(opt.id)) return Promise.resolve();\n  if (document.querySelector(`script[src=\"${src}\"]`)) return Promise.resolve();\n\n  // dedup 2: chiamate concorrenti\n  const key = buildKey(\"js\", src, opt.id);\n  const existing = inFlightScripts.get(key);\n  if (existing) return existing;\n\n  const p = new Promise<void>((res, rej) => {\n    const s = document.createElement(\"script\");\n    s.src = src;\n\n    // type=\"module\" opzionale\n    if (opt.module) s.type = \"module\";\n\n    // crossorigin (default \"anonymous\" se non vuoto)\n    if (opt.crossOrigin !== undefined) {\n      if (opt.crossOrigin) s.crossOrigin = opt.crossOrigin;\n    } else {\n      s.crossOrigin = \"anonymous\";\n    }\n\n    if (opt.integrity) s.integrity = opt.integrity;\n\n    const nonce = detectCspNonce(opt.nonce);\n    if (nonce) s.setAttribute(\"nonce\", nonce);\n\n    if (opt.id) s.id = opt.id;\n\n    applyAttrs(s, opt.attrs);\n    s.async = true;\n    s.setAttribute(\"data-loaded-by\", \"EuroPlate\");\n\n    let to: number | undefined;\n    const timeoutMs = opt.timeoutMs ?? 15000;\n    if (timeoutMs > 0) {\n      to = window.setTimeout(() => {\n        s.onerror = null!;\n        s.onload = null!;\n        rej(new Error(`Timeout loading script: ${src}`));\n      }, timeoutMs);\n    }\n\n    s.onload = () => {\n      if (to) clearTimeout(to);\n      res();\n    };\n    s.onerror = () => {\n      if (to) clearTimeout(to);\n      rej(new Error(`Failed ${src}`));\n    };\n\n    document.head.appendChild(s);\n  }).finally(() => {\n    inFlightScripts.delete(key);\n  });\n\n  inFlightScripts.set(key, p);\n  return p;\n}\n\n/**\n *  @internal Carica un <link rel=\"stylesheet\"> una sola volta (idempotente+concurrency-safe).\n *  @param href URL del CSS\n *  @returns Promise risolta quando `onload` fires (o noop se gi\u00E0 presente)\n */\nexport function loadCssOnce(href: string, opt: LoadCssOptions = {}): Promise<void> {\n  if (!href || typeof document === \"undefined\") return Promise.resolve();\n\n  // dedup 1: elemento gi\u00E0 presente in DOM (per href o id)\n  if (opt.id && document.getElementById(opt.id)) return Promise.resolve();\n  if (document.querySelector(`link[rel=\"stylesheet\"][href=\"${href}\"]`)) return Promise.resolve();\n\n  // dedup 2: chiamate concorrenti\n  const key = buildKey(\"css\", href, opt.id);\n  const existing = inFlightCss.get(key);\n  if (existing) return existing;\n\n  const p = new Promise<void>((res, rej) => {\n    const l = document.createElement(\"link\");\n    l.rel = \"stylesheet\";\n    l.href = href;\n\n    if (opt.media) l.media = opt.media;\n\n    if (opt.crossOrigin !== undefined) {\n      if (opt.crossOrigin) l.crossOrigin = opt.crossOrigin;\n    } else {\n      l.crossOrigin = \"anonymous\";\n    }\n\n    if (opt.integrity) l.integrity = opt.integrity;\n\n    const nonce = detectCspNonce(opt.nonce);\n    if (nonce) l.setAttribute(\"nonce\", nonce);\n\n    if (opt.id) l.id = opt.id;\n\n    applyAttrs(l, opt.attrs);\n    l.setAttribute(\"data-loaded-by\", \"EuroPlate\");\n\n    let to: number | undefined;\n    const timeoutMs = opt.timeoutMs ?? 15000;\n    if (timeoutMs > 0) {\n      to = window.setTimeout(() => {\n        l.onerror = null!;\n        l.onload = null!;\n        rej(new Error(`Timeout loading css: ${href}`));\n      }, timeoutMs);\n    }\n\n    l.onload = () => {\n      if (to) clearTimeout(to);\n      res();\n    };\n    l.onerror = () => {\n      if (to) clearTimeout(to);\n      rej(new Error(`Failed ${href}`));\n    };\n\n    document.head.appendChild(l);\n  }).finally(() => {\n    inFlightCss.delete(key);\n  });\n\n  inFlightCss.set(key, p);\n  return p;\n}\n/** @internal */\ntype Lang = \"it\" | \"en\";\n\n// --- getters tip-safe su deps/globale --------------------------------\n\n/** @internal */\ntype Deps = EuroPlateOptions[\"deps\"];\n\n/** @internal */\ntype IMInstance = { mask(el: HTMLInputElement): void; remove?: () => void };\n\n/** @internal * Signature runtime-accurata per Inputmask UMD: callable e constructable. */\ntype IMGlobal = { (opts?: any): IMInstance; new (opts?: any): IMInstance };\n\n/** @internal * Restituisce jQuery da window (jQuery|$) se presente. */\nconst getJQ = (): JQueryStatic | undefined => window.jQuery ?? window.$;\n\n/** @internal * True se jQuery \u00E8 gi\u00E0 disponibile. */\nconst hasJQ = (): boolean => !!getJQ();\n\n/** @internal * Restituisce toastr da window, se presente. */\nconst getToastr = (): Toastr | undefined => window.toastr;\n\n/** @internal * True se toastr \u00E8 gi\u00E0 disponibile. */\nconst hasToastr = (): boolean => !!getToastr();\n\n/** @internal * Restituisce Inputmask UMD da deps o window.Inputmask (callable/new). */\nconst getIM = (d?: Deps): IMGlobal | undefined => (d?.inputmask as unknown as IMGlobal) ?? ((window as any).Inputmask as IMGlobal | undefined);\n\n/** @internal * True se Inputmask \u00E8 disponibile (deps o globale). */\nconst hasIM = (d?: Deps): boolean => !!getIM(d);\n// --- fine getters ---\n\n/**\n * ============================================================\n *  \uD83D\uDD27 ensureJQuery / ensureToastr / ensureInputmask\n *  Sistema di caricamento dipendenze EuroPlate (client SDK)\n * ------------------------------------------------------------\n *  \u2022 Idempotenti \u2192 ogni risorsa caricata una sola volta\n *  \u2022 Concurrency-safe \u2192 coalescano chiamate parallele\n *  \u2022 Cleanup controllato \u2192 cancellano solo chiavi create localmente\n *  \u2022 Logging coerente via BADGE/LOG\n * ============================================================\n */\n\n/**\n * @internal\n * Garantisce jQuery, rispettando `autoLoadDeps.jquery`.\n * Nota: usato come dipendenza di toastr 2.x.\n */\nasync function ensureJQuery(opts: EuroPlateOptions, log: Logger, BADGE: BadgeFn = () => {}, LOG: SmartLogFn = () => {}) {\n  // --- 1\uFE0F\u20E3 controllo immediato\n  if (hasJQ()) {\n    BADGE(\"EPV[Deps]\", \"jQuery present\", \"debug\");\n    return;\n  }\n\n  // --- 2\uFE0F\u20E3 flag autoload\n  const want = (opts.autoLoadDeps?.jquery ?? true) !== false;\n  if (!want) {\n    BADGE(\"EPV[Deps]\", \"jQuery autoload disabled\", \"warn\");\n    return;\n  }\n\n  // --- 3\uFE0F\u20E3 costruzione URL e key dedup\n  const js = opts.cdn?.jquery ?? cdnURLs.base + cdnURLs.jquery.v + cdnURLs.jquery.JS;\n  const key = buildKey(\"js\", js);\n\n  // --- 4\uFE0F\u20E3 dedup + concurrency-safe\n  let created = false;\n  let p = inFlightScripts.get(key);\n  if (!p) {\n    p = loadScriptOnce(js, { module: false });\n    inFlightScripts.set(key, p);\n    created = true;\n  } else {\n    BADGE(\"EPV[Deps]\", \"jQuery loading (in-flight)\", \"info\");\n  }\n\n  try {\n    await p;\n    BADGE(\"EPV[Deps]\", created ? \"jQuery loaded\" : \"jQuery ready\", \"debug\");\n  } catch {\n    BADGE(\"EPV[Deps]\", \"Failed to load jQuery from CDN\", \"err\");\n  } finally {\n    if (created) inFlightScripts.delete(key);\n  }\n}\n\n/**\n * @internal\n *  Garantisce toastr (JS+CSS), rispettando `autoLoadDeps.toastr`.\n *  Dipende da jQuery: lo assicura prima di caricare toastr.\n */\nasync function ensureToastr(opts: EuroPlateOptions, log: Logger, BADGE: BadgeFn = () => {}, LOG: SmartLogFn = () => {}) {\n  // gi\u00E0 presente \u2192 esci\n  if (hasToastr()) {\n    BADGE(\"EPV[Deps]\", \"Toastr present\", \"debug\");\n    return;\n  }\n\n  // dipendenza\n  await ensureJQuery(opts, log, BADGE, LOG);\n\n  const want = (opts.autoLoadDeps?.toastr ?? true) !== false;\n  if (!want) {\n    BADGE(\"EPV[Deps]\", \"Toastr autoload disabled\", \"warn\");\n    return;\n  }\n\n  const css = opts.cdn?.toastrCss ?? cdnURLs.base + cdnURLs.toastr.v + cdnURLs.toastr.CSS;\n  const js = opts.cdn?.toastrJs ?? cdnURLs.base + cdnURLs.toastr.v + cdnURLs.toastr.JS;\n\n  const keyCss = buildKey(\"css\", css);\n  const keyJs = buildKey(\"js\", js);\n\n  // prova a riusare se gi\u00E0 in volo; altrimenti crea tu la Promise\n  let createdCss = false;\n  let createdJs = false;\n\n  let pCss = inFlightCss.get(keyCss);\n  if (!pCss) {\n    pCss = loadCssOnce(css, { media: \"all\" });\n    inFlightCss.set(keyCss, pCss);\n    createdCss = true;\n  }\n\n  let pJs = inFlightScripts.get(keyJs);\n  if (!pJs) {\n    pJs = loadScriptOnce(js, { module: false });\n    inFlightScripts.set(keyJs, pJs);\n    createdJs = true;\n  }\n\n  // logging \u201Cin-flight\u201D se non le hai create tu\n  if (!createdCss || !createdJs) BADGE(\"EPV[Deps]\", \"Toastr loading (in-flight)\", \"info\");\n\n  try {\n    await Promise.all([pCss!, pJs!]);\n\n    // ricontrolla dopo l\u2019attesa\n    if (hasToastr()) {\n      BADGE(\"EPV[Deps]\", createdCss || createdJs ? \"Toastr loaded (+CSS)\" : \"Toastr ready\", \"debug\");\n    } else {\n      // JS/CSS caricati ma window.toastr non c\u2019\u00E8 (edge case)\n      BADGE(\"EPV[Deps]\", \"Toastr not available after load\", \"warn\");\n    }\n  } catch {\n    BADGE(\"EPV[Deps]\", \"Failed to load Toastr from CDN\", \"err\");\n  } finally {\n    // rimuovi SOLO se le hai create tu (evita di oscurare altre attese)\n    if (createdCss) inFlightCss.delete(keyCss);\n    if (createdJs) inFlightScripts.delete(keyJs);\n  }\n}\n\n/**\n * @internal\n * Garantisce che Inputmask sia disponibile secondo i flag `autoLoadDeps`.\n *  - Non blocca l\u2019inizializzazione della UI.\n *  - Prima controlla deps/window, poi carica da CDN se consentito.\n */\nasync function ensureInputmask(opts: EuroPlateOptions, log: Logger, BADGE: BadgeFn = () => {}, LOG: SmartLogFn = () => {}) {\n  // --- 1\uFE0F\u20E3 gi\u00E0 presente (deps o globale)\n  if (hasIM(opts.deps)) {\n    BADGE(\"EPV[Deps]\", \"Inputmask present (deps/global)\", \"debug\");\n    return;\n  }\n\n  // --- 2\uFE0F\u20E3 flag autoload\n  const want = (opts.autoLoadDeps?.inputmask ?? true) !== false;\n  if (!want) {\n    BADGE(\"EPV[Deps]\", \"Inputmask autoload disabled\", \"warn\");\n    return;\n  }\n\n  // --- 3\uFE0F\u20E3 URL + dedup\n  const js = opts.cdn?.inputmask ?? cdnURLs.base + cdnURLs.inputmask.v + cdnURLs.inputmask.JS;\n  const key = buildKey(\"js\", js);\n\n  let created = false;\n  let p = inFlightScripts.get(key);\n  if (!p) {\n    p = loadScriptOnce(js, { module: false });\n    inFlightScripts.set(key, p);\n    created = true;\n  } else {\n    BADGE(\"EPV[Deps]\", \"Inputmask loading (in-flight)\", \"info\");\n  }\n\n  try {\n    await p;\n    BADGE(\"EPV[Deps]\", created ? \"Inputmask loaded\" : \"Inputmask ready\", \"debug\");\n  } catch {\n    BADGE(\"EPV[Deps]\", \"Failed to load Inputmask from CDN\", \"err\");\n  } finally {\n    if (created) inFlightScripts.delete(key);\n  }\n}\n\n/**\n * @internal\n * ============================================================\n *  \uD83D\uDD27 ensureDeps (con gestione try/catch/finally)\n *  Orchestratore dipendenze EuroPlate (client SDK)\n * ------------------------------------------------------------\n *  \u2022 Se useToastrLogger === true \u2192 forza jQuery+Toastr\n *  \u2022 Altrimenti rispetta autoLoadDeps\n *  \u2022 Inputmask indipendente dal logger\n *  \u2022 Idempotente e concurrency-safe (si appoggia ai singoli ensure*)\n *  - Coerente con pattern dei singoli ensure*\n *  - Garantisce sequenza corretta e logging finale\n * ============================================================\n */\nasync function ensureDeps(opts: EuroPlateOptions, log: Logger, BADGE: BadgeFn = () => {}, LOG: SmartLogFn = () => {}) {\n  const startTime = performance.now();\n  BADGE(\"EPV[Deps]\", \"Ensuring dependencies\u2026\", \"info\");\n\n  try {\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    // 1\uFE0F\u20E3 Toastr (eventualmente forzato)\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    const wantToastr = !!opts.useToastrLogger || (opts.autoLoadDeps?.toastr ?? true) !== false;\n\n    if (wantToastr) {\n      // Forziamo jQuery + Toastr per compatibilit\u00E0\n      const optsForToastr: EuroPlateOptions = {\n        ...opts,\n        autoLoadDeps: {\n          ...opts.autoLoadDeps,\n          jquery: true,\n          toastr: true,\n        },\n      };\n\n      await ensureToastr(optsForToastr, log, BADGE, LOG);\n    } else {\n      // Se non serve Toastr, valuta comunque jQuery se richiesto\n      const wantJQ = (opts.autoLoadDeps?.jquery ?? true) !== false;\n      if (wantJQ) {\n        await ensureJQuery(opts, log, BADGE, LOG);\n      }\n    }\n\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    // 2\uFE0F\u20E3 Inputmask (indipendente dal logger)\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    const wantIM = (opts.autoLoadDeps?.inputmask ?? true) !== false;\n    if (wantIM) {\n      await ensureInputmask(opts, log, BADGE, LOG);\n    } else {\n      BADGE(\"EPV[Deps]\", \"Inputmask autoload disabled\", \"warn\");\n    }\n\n    BADGE(\"EPV[Deps]\", \"Dependencies ensured successfully\", \"ok\");\n  } catch (err) {\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    // Catch generale (es. eccezioni propagate o runtime)\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    const msg = err instanceof Error ? err.message : JSON.stringify(err ?? \"unknown\");\n    BADGE(\"EPV[Deps]\", `Error during ensureDeps: ${msg}`, \"err\");\n  } finally {\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    // Log tempo di completamento / debug telemetria\n    // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n    const dur = (performance.now() - startTime).toFixed(1);\n    BADGE(\"EPV[Deps]\", `ensureDeps finished in ${dur} ms`, \"debug\");\n  }\n}\n\n/* ============================================================\n * Interni: i18n\n * ============================================================ */\n\n/** @internal */\nconst ALL_COUNTRIES = supportedCountries as readonly CountryKey[];\n\nfunction isCountryKey(x: string): x is CountryKey {\n  return (ALL_COUNTRIES as readonly string[]).includes(x);\n}\n\n/** @internal * \uD83D\uDC47 chiavi scalari (niente 'countries') */\ntype DictScalarKey = \"auto\" | \"placeholderAuto\" | \"valid\" | \"invalid\" | \"checked\";\n\n/** @internal * Nomi paese localizzati (facoltativi per ciascun cc) */\ntype CountryNameDict = Partial<Record<CountryKey, string>>;\n\n//prettier-ignore\n/** @internal */\nconst DICT: Record<\n  Lang,\n  {\n    auto: string;\n    placeholderAuto: string;\n    valid: string;\n    invalid: string;\n    checked: string;\n    countries: CountryNameDict;\n  }\n> = {\n  it: {\n    auto: \"Auto (Tutti)\",\n    placeholderAuto: \"AA 999 AA / AA-999-AA / 9999 AAA\",\n    valid: \"Valida\",\n    invalid: \"Non valida\",\n    checked: \"Controllati\",\n    countries: {\n      IT: \"Italia\", UK: \"Regno Unito\", DE: \"Germania\", FR: \"Francia\", ES: \"Spagna\", PT: \"Portogallo\", NL: \"Paesi Bassi\", BE: \"Belgio\", CH: \"Svizzera\", AT: \"Austria\", IE: \"Irlanda\",\n      LU: \"Lussemburgo\", DK: \"Danimarca\", SE: \"Svezia\", NO: \"Norvegia\", FI: \"Finlandia\", PL: \"Polonia\", CZ: \"Cechia\", SK: \"Slovacchia\", HU: \"Ungheria\", RO: \"Romania\", BG: \"Bulgaria\", \n      SI: \"Slovenia\", HR: \"Croazia\", GR: \"Grecia\", LT: \"Lituania\", LV: \"Lettonia\", EE: \"Estonia\", UA: \"Ucraina\" \n    },\n  },\n  en: {\n    auto: \"Auto (All)\",\n    placeholderAuto: \"AA 999 AA / AA-999-AA / 9999 AAA\",\n    valid: \"Valid\",\n    invalid: \"Invalid\",\n    checked: \"Checked\",\n    countries:{\n      IT: \"Italy\", UK: \"United Kingdom\", DE: \"Germany\", FR: \"France\", ES: \"Spain\", PT: \"Portugal\", NL: \"Netherlands\", BE: \"Belgium\", CH: \"Switzerland\", AT: \"Austria\", IE: \"Ireland\", \n      LU: \"Luxembourg\", DK: \"Denmark\", SE: \"Sweden\", NO: \"Norway\", FI: \"Finland\", PL: \"Poland\", CZ: \"Czechia\", SK: \"Slovakia\", HU: \"Hungary\", RO: \"Romania\", BG: \"Bulgaria\", SI: \"Slovenia\", \n      HR: \"Croatia\", GR: \"Greece\", LT: \"Lithuania\", LV: \"Latvia\", EE: \"Estonia\", UA: \"Ukraine\" \n    },\n  },\n};\n/** @internal */\nfunction pickLang(code: I18nCode): Lang {\n  if (code === \"IT\") return \"it\";\n  if (code === \"EN\") return \"en\";\n  const nav = (navigator?.language || \"\").toLowerCase();\n  return nav.startsWith(\"it\") ? \"it\" : \"en\";\n}\n\n/** @internal \u2705 ora t() restituisce sempre string */\nfunction t(lang: Lang, key: DictScalarKey): string {\n  return DICT[lang][key];\n}\n\n/** @internal \u2705 countryName legge prima i18n, poi fallback EN/core */\nfunction countryName(lang: Lang, cc: string): string {\n  const norm = normalizeCode(cc) as CountryKey | undefined;\n  if (!norm) return cc.toUpperCase();\n  const local = DICT[lang].countries?.[norm];\n  if (local) return local;\n  return getCountryName(norm) ?? COUNTRY_NAMES[norm] ?? norm;\n}\n\n/* ============================================================\n * Interni: logger\n * ============================================================ */\n\n//prettier-ignore\n/** Logger di base: inoltra su console o su logger esterno se fornito.\n *  @internal\n *  - On/Off controllato da `DBG`.\n *  - `notify` passa-attraverso (no-op se mancante).\n */\nfunction makeBaseLogger(prefix: string, DBG: boolean, ext?: Logger): Logger {\n  const cons = console;\n  return {\n    debug: (...a) => { if (DBG) (ext?.debug ?? cons.debug)(prefix, ...a); },\n    info: (...a) => { if (DBG) (ext?.info ?? cons.info)(prefix, ...a);},\n    warn: (...a) => { (ext?.warn ?? cons.warn)(prefix, ...a); },\n    error: (...a) => { (ext?.error ?? cons.error)(prefix, ...a); },\n    notify: (msg, type = \"info\") => { if (DBG) (ext?.notify ?? (() => {}))(msg, type); },\n  };\n}\n\n//prettier-ignore\n/** Logger Toastr:\n *  @internal\n *  - Normalizza `type: string` in {info, success, warning, error}.\n *  - Fallback su console se toastr assente o in errore.\n */\nfunction makeToastrLogger(prefix: string, DBG: boolean): Logger {\n  const t = getToastr();\n  const cons = console;\n  const withPrefix = (msg: string) => (prefix ? `${prefix} ${msg}` : msg);\n\n  return {\n    debug: (...a) => { if (DBG) (cons.debug)(prefix, ...a); },\n    info:  (...a) => { if (DBG) (cons.info )(prefix, ...a); },\n    warn:  (...a) => { (cons.warn)(prefix, ...a); },\n    error: (...a) => { (cons.error)(prefix, ...a); },\n\n    // \uD83D\uDC47 firma allargata a `string`, con mapping interno ai 4 livelli toastr\n    notify: (msg: string, type: string = \"info\") => {\n      if (!t) { if (DBG) cons.info(withPrefix(`[${type}] ${msg}`)); return; }\n\n      // normalizza qualunque string in uno dei 4 tipi toastr\n      const allowed = new Set([\"info\",\"success\",\"warning\",\"error\"]);\n      const key = allowed.has(type) ? (type as \"info\"|\"success\"|\"warning\"|\"error\") : \"info\";\n\n      try {\n        t.options = t.options || {};\n        t.options.positionClass = t.options.positionClass || \"toast-bottom-right\";\n        (t as any)[key](withPrefix(msg));\n      } catch {\n        if (DBG) cons.info(withPrefix(`[${type}] ${msg}`));\n      }\n    },\n  };\n}\n\n/* ============================================================\n * Interni: DOM helpers\n * ============================================================ */\n\n/** @internal */\nfunction randSuffix(n = 6) {\n  return Math.random()\n    .toString(36)\n    .slice(2, 2 + n);\n}\n\n/** @internal */\nfunction deriveDefaultIds(root?: HTMLElement | null, wrapperOpt?: string | HTMLElement | false) {\n  // prova a usare l'id del wrapper se c'\u00E8\n  const wId = (typeof wrapperOpt === \"string\" && wrapperOpt.startsWith(\"#\") ? wrapperOpt.slice(1) : null) || (root && root.id) || \"\";\n\n  const base = wId || `epv-${randSuffix()}`;\n  const inputId = `${base}-plate`;\n  const inputName = base.includes(\"-plate\") ? base : `${base}-plate`;\n  return { inputId, inputName };\n}\n\n// helper interno\nfunction resolveStatusCfg(ui?: EuroPlateUI) {\n  const mode = ui?.statusMode ?? \"block\";\n  return {\n    statusMode: mode,\n    statusIcon: ui?.statusIcon ?? \"none\",\n    showStatusText: ui?.showStatusText ?? (mode === \"inline\" ? false : true),\n    iconPosition: ui?.iconPosition ?? \"right\",\n  } as Required<Pick<EuroPlateUI, \"statusMode\" | \"statusIcon\" | \"showStatusText\" | \"iconPosition\">>;\n}\n\n/* ============================================================\n * ENTRYPOINT PUBBLICO\n * ============================================================ */\n\n/** Crea e inizializza il widget EuroPlate.\n *  - Se `wrapper` \u00E8 truthy, genera markup/accessori nel wrapper.\n *  - Se `input` \u00E8 passato, usa quello e non crea markup.\n *  - Autocarica dipendenze (Inputmask/jQuery/Toastr) secondo flags.\n *  - Applica mask live in base al paese (AUTO o fisso).\n *\n *  @param EuroMod Modulo core con validate/getInputMask/getDisplayFormat/\u2026\n *  @param opts    Opzioni di configurazione (vedi `EuroPlateOptions`)\n *  @returns       Istanza `EuroPlateInstance`\n *  @throws        Error se wrapper/input non trovati o `EuroMod` incompleto\n */\nexport function createEuroPlate(EuroMod: any, opts: EuroPlateOptions): EuroPlateInstance {\n  const {\n    i18n = \"AUTO\",\n    wrapper = false, // \uD83D\uDC48 AGGIUNTO: selector | HTMLElement | false\n    ui = {},\n    allowedCountries,\n    mode = \"AUTO\",\n    vehicleType = \"any\",\n    placeholders = { auto: \"AA 999 AA / AA-999-AA / 9999 AAA\" },\n    normalize = (c: string) => (String(c || \"\").toUpperCase() === \"GB\" ? \"UK\" : String(c || \"\").toUpperCase()),\n    formatters = {\n      FR: (s: string) => s.toUpperCase().replace(/\\s+/g, \"-\"),\n      IT: (s: string) => s.toUpperCase().replace(/\\s+/g, \" \"),\n      ES: (s: string) => s.toUpperCase().replace(/[-_]+/g, \" \"),\n    },\n    timings = { debounce: 80, clear: 60 },\n    logger,\n    deps,\n    autoFocusOnInit = false,\n    debug = false,\n    useToastrLogger = false,\n  } = opts || ({} as EuroPlateOptions);\n\n  // === toggle globale per il badge logger\n  (window as any).CC_EPV_DEBUG = !!debug;\n\n  // ----- RIFERIMENTI UI -----\n  let lang: Lang = pickLang(i18n); // lingua\n\n  let input_type: string = \"text\"; // TODO PERMETTERE DI DECIRE IL TYPE DELL INPUT (text/number/altro)?\n\n  // riferimenti UI locali (li riempiremo da wrapper oppure da opts.ui)\n  let input!: HTMLInputElement; // \u2190 verr\u00E0 assegnato\n  let button: HTMLElement | undefined = ui.button ?? undefined;\n  let dropdown: HTMLElement | undefined = ui.dropdown ?? undefined;\n  let flagIcon: HTMLElement | undefined = ui.flagIcon ?? undefined;\n  let flagLabel: HTMLElement | undefined = ui.flagLabel ?? undefined;\n  let statusEl: HTMLElement | undefined = ui.status ?? undefined;\n  // NEW: wrapper element (se presente)\n  let wrapperEl: HTMLElement | null = null;\n\n  // merge dei campi top-level legacy nelle ui options\n  const uiMerged = {\n    ...ui,\n    statusMode: (opts as any).statusMode ?? ui.statusMode,\n    statusIcon: (opts as any).statusIcon ?? ui.statusIcon,\n    showStatusText: (opts as any).showStatusText ?? ui.showStatusText,\n    iconPosition: (opts as any).iconPosition ?? ui.iconPosition,\n  };\n  // \uD83D\uDD04 facoltativo ma utile: aggiorna opts.ui per riflettere il merge\n  (opts as any).ui = uiMerged;\n  // \u2705 risolvi configurazione status UNA SOLA VOLTA\n  const statusCfg = resolveStatusCfg(uiMerged);\n  const { statusMode, statusIcon, showStatusText, iconPosition } = statusCfg || {};\n\n  // ----- AUTO-BUILD DOM SE wrapper \u00C8 TRUTHY -----\n  if (wrapper) {\n    const root: HTMLElement | null = typeof wrapper === \"string\" ? document.querySelector(wrapper) : wrapper;\n\n    if (!root) throw new Error(`Wrapper non trovato: ${String(wrapper)}`);\n\n    const { inputId: defId, inputName: defName } = deriveDefaultIds(root, wrapper);\n\n    const wantedId = opts.inputId || defId;\n    const wantedName = opts.inputName || wantedId || defName || \"plate\";\n\n    root.classList.add(\"plate-epv-wrapper\");\n    root.innerHTML = `\n      <div class=\"plate-epv\">\n        <button class=\"flag-btn\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n          <div class=\"epv__flag-box\"><div class=\"epv__flag epv__auto-eu\"></div></div>\n          <span class=\"flag-label\">${t(lang, \"auto\")}</span>\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\" style=\"margin-left:4px\">\n            <path d=\"M6 8l4 4 4-4\" stroke=\"#6b7280\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n          </svg>\n        </button>\n        <div class=\"epv__input-wrap\">\n          <input class=\"plate-input\" type=\"${input_type}\" placeholder=\"${t(lang, \"placeholderAuto\")}\" autocomplete=\"off\" />\n          <!-- inline status host (invisibile se mode != inline) -->\n          <span class=\"status-inline-host\" aria-live=\"polite\"></span>\n        </div>\n        <div class=\"dropdown\" role=\"listbox\" aria-label=\"Select country\"></div>\n      </div>\n      <!-- status block (retro-compat) -->\n      <div class=\"status\" aria-live=\"polite\"></div>\n   `;\n\n    // bind\n    const plateInput = root.querySelector(\".plate-input\") as HTMLInputElement;\n    if (!plateInput) throw new Error(\"Markup generato non contiene .plate-input\");\n\n    // assegna id/name (sempre, per coerenza con l\u2019opts)\n    plateInput.id = wantedId;\n    plateInput.name = wantedName;\n    // bind elementi generati\n\n    button = root.querySelector(\".flag-btn\") as HTMLElement;\n    flagIcon = root.querySelector(\".epv__flag\") as HTMLElement;\n    flagLabel = root.querySelector(\".flag-label\") as HTMLElement;\n    dropdown = root.querySelector(\".dropdown\") as HTMLElement;\n    input = plateInput;\n    //   const inputWrap = root.querySelector(\".epv__input-wrap\") as HTMLElement;\n\n    // const inlineHost = (root as HTMLElement).querySelector(\".status-inline-host\") as HTMLElement;\n    // const blockHost = (root as HTMLElement).querySelector(\".status\") as HTMLElement;\n    const inlineHost = root.querySelector(\".status-inline-host\") as HTMLElement;\n    const blockHost = root.querySelector(\".status\") as HTMLElement;\n    // status element (inline/block/off)\n\n    // scegli contenitore e applica le classi/dataset una sola volta\n    if (statusMode === \"inline\") {\n      statusEl = inlineHost;\n      blockHost.style.display = \"none\";\n      inlineHost.style.display = \"\";\n\n      inlineHost.className = \"status-inline-host\"; // reset\n      inlineHost.dataset.pos = iconPosition; // \"right\" | \"left\"\n      inlineHost.dataset.icon = statusIcon; // \"none\" | \"icon\" | \"pill\"\n      inlineHost.dataset.text = String(!!showStatusText);\n\n      // assicurati struttura stabile (icon + text)\n      let iconEl = inlineHost.querySelector(\".s-icon\") as HTMLElement | null;\n      let textEl = inlineHost.querySelector(\".s-text\") as HTMLElement | null;\n      if (!iconEl) {\n        iconEl = document.createElement(\"span\");\n        iconEl.className = \"s-icon\";\n        inlineHost.appendChild(iconEl);\n      }\n      if (!textEl) {\n        textEl = document.createElement(\"span\");\n        textEl.className = \"s-text\";\n        inlineHost.appendChild(textEl);\n      }\n    } else if (statusMode === \"block\") {\n      statusEl = blockHost;\n      inlineHost.style.display = \"none\";\n    } else {\n      // off\n      statusEl = undefined;\n      inlineHost.style.display = \"none\";\n      blockHost.style.display = \"none\";\n    }\n\n    // aggiorna anche opts per retro-compat (se altrove li leggi da opts)\n    (opts as any).ui = { button, flagIcon, flagLabel, dropdown, status: statusEl };\n    (opts as any).input = input;\n\n    // dopo aver ottenuto `root` e creato l\u2019HTML\n    wrapperEl = root;\n  } else {\n    // input esterno \u2014 usa ci\u00F2 che arriva da fuori\n    input = (opts as any).input as HTMLInputElement;\n    if (!input) throw new Error(\"Devi passare `input` o `wrapper`.\");\n\n    const preserve = !!opts.preserveInputAttrs;\n\n    // id/name secondo policy\n    if (opts.inputId) {\n      if (preserve) {\n        if (!input.id) input.id = opts.inputId;\n      } else {\n        input.id = opts.inputId;\n      }\n    }\n    if (opts.inputName) {\n      if (preserve) {\n        if (!input.name) input.name = opts.inputName;\n      } else {\n        input.name = opts.inputName;\n      }\n    }\n    wrapperEl = (input.closest(\".plate-epv-wrapper\") as HTMLElement | null) ?? (input.parentElement as HTMLElement | null) ?? null;\n\n    if (statusMode === \"inline\") {\n      // assicurati un container posizionato\n      const host = (wrapperEl?.querySelector(\".epv__input-wrap\") as HTMLElement | null) ?? (input.parentElement as HTMLElement | null) ?? input;\n\n      if (getComputedStyle(host).position === \"static\") (host as HTMLElement).style.position = \"relative\";\n\n      // crea un inline-host compatibile con quello del wrapper\n      const inlineHost = document.createElement(\"span\");\n      inlineHost.className = \"status-inline-host\";\n      inlineHost.dataset.pos = iconPosition;\n      inlineHost.dataset.icon = statusIcon;\n      inlineHost.dataset.text = String(!!showStatusText);\n\n      const iconEl = document.createElement(\"span\");\n      iconEl.className = \"s-icon\";\n      const textEl = document.createElement(\"span\");\n      textEl.className = \"s-text\";\n      inlineHost.appendChild(iconEl);\n      inlineHost.appendChild(textEl);\n\n      host.appendChild(inlineHost);\n      statusEl = inlineHost;\n    } else if (statusMode === \"block\") {\n      statusEl =\n        (wrapperEl && (wrapperEl.querySelector(\".status\") as HTMLElement | null)) ??\n        (() => {\n          const d = document.createElement(\"div\");\n          d.className = \"status\";\n          input.insertAdjacentElement(\"afterend\", d);\n          return d;\n        })();\n    } else {\n      statusEl = undefined;\n    }\n\n    // fallback id/name se mancano\n    if (!input.id || !input.name) {\n      const { inputId: defId, inputName: defName } = deriveDefaultIds(wrapperEl, false);\n      if (!input.id) input.id = defId;\n      if (!input.name) input.name = defName;\n    }\n\n    // forza type (di default \"text\", oppure prendi da opts se lo esponi)\n    const inputType = (opts as any).inputType ?? \"text\";\n    try {\n      input.type = inputType;\n    } catch {\n      /* ignore invalid types */\n    }\n  }\n\n  // ---------- LOGGER (ora abbiamo l'id)\n  let DBG = !!debug;\n  const logPrefix = input?.id ? `[EPL:${input.id}]` : \"[EPL]\";\n\n  // \u2705 badge+log con prefix sempre incluso (riusa globali se presenti)\n  const { BADGE, LOG } = ensureBadgeLogger(logPrefix, DBG);\n\n  // logger base (console / esterno)\n  let log: Logger = makeBaseLogger(logPrefix, DBG, logger);\n\n  // ---------- DEPS (fire & forget, ora con BADGE/LOG in chiaro)\n  void ensureDepsOnce(opts, log, BADGE, LOG).then(() => {\n    const G = window as any;\n\n    if (useToastrLogger && getToastr() && !logger && !G.CC_EPV_TOASTR_LOGGER_ATTACHED) {\n      log = makeToastrLogger(logPrefix, DBG);\n      G.CC_EPV_TOASTR_LOGGER_ATTACHED = true;\n      BADGE(\"EuroPlate\", \"Toastr logger attached (once)\", \"debug\");\n    }\n    // se IM arriva dopo e non siamo in AUTO, prova ad applicare la mask\n    if (hasIMBound() && selected !== \"AUTO\") {\n      try {\n        //applyMaskDebounced(input, selected);\n        applyMaskNow(input, selected);\n      } catch {}\n    }\n  });\n\n  // ---------- BIND ai deps (closure; niente variabili globali mutate)\n  const getIMBound = () => getIM(deps);\n  const hasIMBound = () => hasIM(deps);\n\n  // ---------- EuroMod guard\n  if (!EuroMod?.validatePlate || !EuroMod?.getInputMask) {\n    throw new Error(\"EuroMod mancante o incompleto\");\n  }\n\n  // ---------- Stato/utility come li avevi...\n  const { supportedCountries, getInputMask, getDisplayFormat, FLAG_MAP, validatePlate } = EuroMod;\n  // ---------- fine stato EuroMod\n\n  let selected: \"AUTO\" | CountryKey = (() => {\n    if (mode === \"AUTO\") return \"AUTO\";\n    const n = normalize(String(mode || \"\"));\n    return isCountryKey(n) ? (n as CountryKey) : \"AUTO\";\n  })();\n\n  let allowed: CountryKey[] = (allowedCountries && allowedCountries.length ? allowedCountries : [...supportedCountries]).map((c) => normalize(String(c || \"\"))).filter(isCountryKey) as CountryKey[];\n\n  let destroyed = false;\n\n  const fmtFor = (cc: string, s: string) => (formatters[cc] ? formatters[cc](s) : String(s).toUpperCase());\n\n  // setFlag\n  const setFlag = (code: \"AUTO\" | CountryKey | null, flagIcon: HTMLElement | undefined, flagLabel: HTMLElement | undefined, lang: Lang) => {\n    if (!flagIcon || !flagLabel) return; // UI opzionale\n    if (!code || code === \"AUTO\") {\n      flagIcon.className = \"epv__flag epv__auto-eu\";\n      flagLabel.textContent = t(lang, \"auto\");\n      return;\n    }\n    const iso = FLAG_MAP[code] || \"auto-eu\";\n    flagIcon.className = `epv__flag epv__${iso}`;\n    flagLabel.textContent = `${countryName(lang, code)} (${code})`; // sempre string\n  };\n\n  const debounce = <T extends (...args: any[]) => any>(fn: T, wait = 80) => {\n    let t: any;\n    return (...args: Parameters<T>) => {\n      clearTimeout(t);\n      t = setTimeout(() => fn(...args), wait);\n    };\n  };\n\n  function hardClearMask(el?: HTMLInputElement | null) {\n    if (!el) return;\n    try {\n      const prev = (el as any)._imInstance;\n      // rimuovi SOLO l'istanza precedente se esiste\n      if (prev?.remove) prev.remove();\n    } catch {}\n    try {\n      (el as any).inputmask?.remove?.();\n    } catch {}\n    (el as any)._imInstance = null;\n    imLog(\"debug\", \"mask:clear (hard)\");\n  }\n\n  const hardClearMaskDebounced = debounce(hardClearMask, timings.clear);\n\n  // untill 1.0.13\n  // const normalizePattern = (p: string) =>\n  //   String(p)\n  //     .replace(/A\\{(\\d+)\\}/g, (_, n) => \"A\".repeat(+n))\n  //     .replace(/9\\{(\\d+)\\}/g, (_, n) => \"9\".repeat(+n));\n  \n  const normalizePattern = (p: string) => String(p).replace(/([ALH9X])\\{(\\d)\\}/g, (_, t, n) => String(t).repeat(n));\n\n  // ===== Logging centralizzato (usa BADGE/LOG se presenti) =====\n  function imLog(level: \"debug\" | \"info\" | \"warn\" | \"error\", title: string, payload?: any) {\n    // rispettare il toggle debug: emetti solo warn/error sempre; debug/info solo se DBG\n    if (!DBG && (level === \"debug\" || level === \"info\")) return;\n    const msg = payload ? `${title} :: ${typeof payload === \"string\" ? payload : JSON.stringify(payload, null, 2)}` : title;\n    try {\n      if (typeof BADGE === \"function\") {\n        BADGE(\"EuroPlate\", msg, level);\n        return;\n      }\n      if (typeof LOG === \"function\") {\n        LOG(msg);\n        return;\n      }\n    } catch {}\n    // fallback console\n    const fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : level === \"info\" ? console.info : console.debug;\n    fn(`[EPV][${level}] ${msg}`);\n  }\n\n  function imPreLog(kind: \"now\" | \"debounced\", country: string, optsIM: any, mergedDefs: Record<string, any>, imVersion: string) {\n    const used = tokensUsedInMask(optsIM.mask);\n    const have = Object.keys(mergedDefs || {});\n    const missing = used.filter((t) => !have.includes(t) && !/^[90#]$/.test(t));\n    imLog(\"debug\", `IM.apply.${kind}: pre`, {\n      country,\n      imVersion,\n      mask: optsIM.mask,\n      placeholder: optsIM.placeholder,\n      tokensUsed: used,\n      defKeys: have.slice().sort(),\n      missingDefs: missing,\n    });\n    if (missing.length) {\n      imLog(\"warn\", `IM.apply.${kind}: missing definitions [${missing.join(\", \")}]`, { country });\n    }\n  }\n\n  function imMounted(kind: \"now\" | \"debounced\", country: string, mask: string | string[]) {\n    imLog(\"info\", `IM.apply.${kind}: mounted`, { country, mask });\n  }\n\n  function imError(kind: \"now\" | \"debounced\", country: string, e: unknown) {\n    imLog(\"error\", `IM.apply.${kind}: instance.mask() failed`, { country, error: String(e) });\n  }\n\n  function tokensUsedInMask(mask: string | string[]) {\n    const src = Array.isArray(mask) ? mask.join(\"|\") : mask;\n    const set = new Set<string>();\n    for (const ch of src) {\n      if (/[A-Z0-9#]/.test(ch)) set.add(ch);\n    }\n    // riduciamo ai token che ci interessano\n    const tokens = Array.from(set)\n      .filter((t) => /[LHCXAH]|[90#]/.test(t))\n      .sort();\n    return tokens;\n  }\n\n  // Token lettera base, SEMPRE presente (Inputmask non ha 'L' di default)\n  const baseLetterDefs = {\n    // accetta a\u2013z o A\u2013Z, poi forziamo maiuscolo con casing\n    L: { validator: \"[A-Za-z]\", casing: \"upper\" },\n  };\n\n  function applyMaskNow(inputEl: HTMLInputElement, country: string) {\n    if (!hasIMBound()) return;\n    const IM = getIMBound();\n    if (!IM || !inputEl || !country || country === \"AUTO\") return;\n\n    const spec = getInputMask(country);\n    if (!spec) return;\n\n    const defaultsRoot = (IM as any)?.prototype?.defaults ?? (window as any).Inputmask?.prototype?.defaults ?? undefined;\n    const defaultDefs = defaultsRoot?.definitions ?? undefined;\n    const imVersion = (IM as any)?.prototype?.defaults?.version ?? (window as any).Inputmask?.prototype?.defaults?.version ?? \"unknown\";\n\n    // Unisci: default \u2192 base L \u2192 definitions specifiche (H, C, \u2026)\n    const mergedDefs = { ...(defaultDefs || {}), ...baseLetterDefs, ...(spec.definitions || {}) };\n    const optsIM: any = {\n      mask: normalizePattern(spec.mask),\n      keepStatic: spec.keepStatic ?? true,\n      greedy: spec.greedy ?? false,\n      placeholder: spec.placeholder ?? \"\",\n      showMaskOnHover: spec.showMaskOnHover ?? false,\n      showMaskOnFocus: spec.showMaskOnFocus ?? false,\n      jitMasking: true,\n      autoUnmask: false,\n      insertModeVisual: false,\n      rightAlign: false,\n      definitions: mergedDefs, // \uD83D\uDC48 ora sempre passato\n      onBeforeMask: (v: string) => fmtFor(country, String(v ?? \"\")),\n      onBeforePaste: (p: string) => fmtFor(country, String(p ?? \"\")),\n      positionCaretOnClick: \"lvp\",\n    };\n\n    // --- LOG PRE --- @@DEBUG\n    imPreLog(\"now\", country, optsIM, mergedDefs, imVersion);\n    // --- LOG PRE --- @@DEBUG\n\n    try {\n      (inputEl as any)._imInstance?.remove?.();\n    } catch {}\n    try {\n      (inputEl as any).inputmask?.remove?.();\n    } catch {}\n\n    let instance: any;\n    try {\n      instance = IM(optsIM);\n    } catch {\n      instance = new (IM as any)(optsIM);\n    }\n\n    try {\n      instance.mask(inputEl);\n      imMounted(\"now\", country, optsIM.mask);\n    } catch (e) {\n      imError(\"now\", country, e);\n      throw e;\n    }\n    (inputEl as any)._imInstance = instance;\n  }\n\n  const applyMaskDebounced = debounce((inputEl: HTMLInputElement, country: string) => {\n    if (!hasIMBound()) {\n      // BADGE(\"EuroPlate\", \"Inputmask non disponibile: salto applyMask\", \"warn\");\n      imLog(\"warn\", \"IM.apply.debounced: Inputmask non disponibile\");\n      return;\n    }\n    const IM = getIMBound()! as IMGlobal; // tipo: IMGlobal\n\n    if (!IM) {\n      //  BADGE(\"EuroPlate\", \"Inputmask non disponibile (again): RETURN!\", \"warn\");\n      imLog(\"warn\", \"IM.apply.debounced: Inputmask non disponibile (again)\");\n      return;\n    }\n\n    if (!inputEl || !country || country === \"AUTO\") {\n      hardClearMaskDebounced(inputEl);\n      return;\n    }\n\n    const spec = getInputMask(country);\n    if (!spec) {\n      hardClearMaskDebounced(inputEl);\n      return;\n    }\n\n    const defaultsRoot = (IM as any)?.prototype?.defaults ?? (window as any).Inputmask?.prototype?.defaults ?? undefined;\n    const defaultDefs = defaultsRoot?.definitions ?? undefined;\n    const imVersion = defaultsRoot?.version ?? \"unknown\";\n\n    // Unisci: default \u2192 base L \u2192 definitions specifiche (H, C, \u2026)\n    const mergedDefs = { ...(defaultDefs || {}), ...baseLetterDefs, ...(spec.definitions || {}) };\n\n    const optsIM = {\n      mask: normalizePattern(spec.mask),\n      keepStatic: spec.keepStatic ?? true,\n      greedy: spec.greedy ?? false,\n      placeholder: spec.placeholder ?? \"\", // \uD83D\uDC48 usa i placeholder finalizzati\n      showMaskOnHover: spec.showMaskOnHover ?? false,\n      showMaskOnFocus: spec.showMaskOnFocus ?? false,\n      jitMasking: true,\n      autoUnmask: false,\n      insertModeVisual: false,\n      rightAlign: false,\n      definitions: mergedDefs, // \uD83D\uDC48 ora sempre passato\n      onBeforeMask: (v: string) => fmtFor(country, String(v ?? \"\")),\n      onBeforePaste: (p: string) => fmtFor(country, String(p ?? \"\")),\n      positionCaretOnClick: \"lvp\",\n    };\n\n    // --- LOG PRE --- @@DEBUG\n    imPreLog(\"now\", country, optsIM, mergedDefs, imVersion);\n    // --- LOG PRE --- @@DEBUG\n\n    try {\n      (inputEl as any)._imInstance?.remove?.();\n      (inputEl as any).inputmask?.remove?.();\n    } catch {}\n\n    let instance: IMInstance;\n    try {\n      // UMD spesso \u00E8 callable\n      instance = IM(optsIM);\n    } catch {\n      // fallback costruttore\n      instance = new IM(optsIM);\n    }\n\n    // instance.mask(inputEl);\n    // (inputEl as any)._imInstance = instance;\n    // BADGE(\"EuroPlate\", JSON.stringify({ logMsg: \"mask:apply\", country, mask: optsIM.mask }, null, 2), \"debug\");\n    try {\n      instance.mask(inputEl);\n      (inputEl as any)._imInstance = instance;\n      imMounted(\"debounced\", country, optsIM.mask);\n    } catch (e) {\n      imError(\"debounced\", country, e);\n    }\n  }, timings.debounce);\n\n  function clearStatusUI(input: HTMLInputElement, status?: HTMLElement, wrap?: HTMLElement | null) {\n    // input & wrapper: rimuovi classi stato\n    input.classList.remove(\"valid\", \"invalid\");\n    if (wrap) wrap.classList.remove(\"valid\", \"invalid\");\n    input.setAttribute(\"aria-invalid\", \"false\");\n    input.setCustomValidity(\"\");\n\n    if (!status) return;\n\n    // inline: togli proprio data-state \u2192 niente padding via :has()\n    // // \u2728 chiave: sparisce lo stato \u2192 niente :has([data-state]) nel CSS\n    status.removeAttribute(\"data-state\");\n\n    // pulisci icona/testo se presenti\n    const iconEl = status.querySelector(\".s-icon\") as HTMLElement | null;\n    const textEl = status.querySelector(\".s-text\") as HTMLElement | null;\n    // reset eventuale .pill ok/err\n    if (iconEl) {\n      iconEl.className = \"s-icon\";\n      iconEl.textContent = \"\";\n    }\n    if (textEl) {\n      textEl.textContent = \"\";\n      textEl.style.display = \"none\";\n    }\n\n    // block mode: neutro\n    if (status.classList.contains(\"status\")) {\n      status.className = \"status\";\n      status.textContent = \"\";\n    }\n  }\n\n  // setValidityUI\n  function setValidityUI(ok: boolean | null, msg: string, matchCountry: CountryKey | null, input: HTMLInputElement, status: HTMLElement | undefined, lang: Lang, wrap?: HTMLElement | null) {\n    // INPUT: classi + aria\n    if (ok === true) {\n      input.classList.add(\"valid\");\n      input.classList.remove(\"invalid\");\n      input.setAttribute(\"aria-invalid\", \"false\");\n      input.setCustomValidity(\"\");\n      wrap?.classList.add(\"valid\");\n      wrap?.classList.remove(\"invalid\");\n    } else if (ok === false) {\n      input.classList.add(\"invalid\");\n      input.classList.remove(\"valid\");\n      input.setAttribute(\"aria-invalid\", \"true\");\n      input.setCustomValidity(msg || \"Invalid\");\n      wrap?.classList.add(\"invalid\");\n      wrap?.classList.remove(\"valid\");\n    } else {\n      // idle\n      input.classList.remove(\"valid\", \"invalid\");\n      input.removeAttribute(\"aria-invalid\");\n      input.setCustomValidity(\"\");\n      wrap?.classList.remove(\"valid\", \"invalid\");\n    }\n\n    if (!status || statusMode === \"off\") return;\n\n    // dataset per CSS (\u2192 usato anche dai selettori :has)\n    if (ok === true) status.dataset.state = \"ok\";\n    else if (ok === false) status.dataset.state = \"err\";\n    else delete status.dataset.state; // idle: nessuno stato\n\n    const shortText = ok === true && matchCountry ? `${countryName(lang, matchCountry)} (${matchCountry})` : ok === false ? t(lang, \"invalid\") : \"\"; // idle \u2192 niente testo\n\n    if (statusMode === \"inline\") {\n      status.className = \"status-inline-host\";\n      status.dataset.pos = iconPosition;\n      status.dataset.icon = statusIcon;\n      status.dataset.text = String(!!showStatusText);\n\n      let iconEl = status.querySelector(\".s-icon\") as HTMLElement | null;\n      let textEl = status.querySelector(\".s-text\") as HTMLElement | null;\n      if (!iconEl) {\n        iconEl = document.createElement(\"span\");\n        iconEl.className = \"s-icon\";\n        status.appendChild(iconEl);\n      }\n      if (!textEl) {\n        textEl = document.createElement(\"span\");\n        textEl.className = \"s-text\";\n        status.appendChild(textEl);\n      }\n\n      // icona\n      iconEl.className = \"s-icon\";\n      if (ok === true) {\n        if (statusIcon === \"icon\") iconEl.textContent = \"\u2713\";\n        else if (statusIcon === \"pill\") {\n          iconEl.classList.add(\"pill\", \"ok\");\n          iconEl.textContent = \"\u2713\";\n        } else iconEl.textContent = \"\";\n      } else if (ok === false) {\n        if (statusIcon === \"icon\") iconEl.textContent = \"!\";\n        else if (statusIcon === \"pill\") {\n          iconEl.classList.add(\"pill\", \"err\");\n          iconEl.textContent = \"!\";\n        } else iconEl.textContent = \"\";\n      } else {\n        // idle\n        iconEl.textContent = \"\";\n        iconEl.classList.remove(\"pill\", \"ok\", \"err\");\n      }\n\n      // testo\n      textEl.textContent = ok == null ? \"\" : showStatusText ? shortText : \"\";\n      textEl.style.display = showStatusText && ok != null ? \"\" : \"none\";\n      return;\n    }\n\n    // BLOCK (retro)\n    if (ok === true && matchCountry) {\n      status.className = \"status ok\";\n      status.textContent = `\u2705 ${t(lang, \"valid\")} \u2014 ${countryName(lang, matchCountry)} (${matchCountry})`;\n    } else if (ok === false) {\n      status.className = \"status err\";\n      status.textContent = msg || `\u274C ${t(lang, \"invalid\")}`;\n    } else {\n      status.className = \"status\";\n      status.textContent = \"\";\n    }\n    BADGE(\"EuroPlate\", `status block \u2192 ${ok ? \"OK\" : \"ERR\"}`, ok ? \"ok\" : \"err\");\n  }\n\n  // renderDropdown\n  function renderDropdown() {\n    if (!dropdown) return;\n    const frag = document.createDocumentFragment();\n\n    // AUTO\n    {\n      const auto = document.createElement(\"div\");\n      auto.className = \"country-item\";\n      auto.role = \"option\";\n      auto.dataset.value = \"AUTO\";\n      auto.innerHTML = `\n      <div class=\"epv__flag-box\"><div class=\"epv__flag epv__auto-eu\"></div></div>\n      <div class=\"country-name\">${t(lang, \"auto\")}</div>\n      <div class=\"country-code\">ANY</div>`;\n      auto.onclick = () => selectCountry(\"AUTO\");\n      frag.appendChild(auto);\n    }\n\n    // paesi whitelisted\n    for (const c of allowed) {\n      const cc = normalize(String(c || \"\"));\n      if (!isCountryKey(cc)) continue;\n\n      const iso = FLAG_MAP?.[cc] || \"auto-eu\";\n      const div = document.createElement(\"div\");\n      div.className = \"country-item\";\n      div.role = \"option\";\n      div.dataset.value = cc;\n      div.innerHTML = `\n        <div class=\"epv__flag-box\"><div class=\"epv__flag epv__${iso}\"></div></div>\n        <div class=\"country-name\">${countryName(lang, cc)}</div>\n        <div class=\"country-code\">${cc}</div>`;\n      div.onclick = () => selectCountry(cc); // far\u00E0 focus (interazione utente)\n      frag.appendChild(div);\n    }\n\n    dropdown.innerHTML = \"\";\n    dropdown.appendChild(frag);\n  }\n\n  function validateNow() {\n    if (destroyed) return { ok: false, value: input.value };\n\n    let raw = input.value;\n\n    if (!raw.trim()) {\n      // IN 1-0-12\n      //setValidityUI(true as any, \"\", null, input, statusEl, lang, wrapperEl);\n      //input.classList.remove(\"valid\", \"invalid\");\n      //wrapperEl?.classList.remove(\"valid\", \"invalid\");\n      clearStatusUI(input, statusEl, wrapperEl); // \uD83D\uDC48 niente stato\n      if (selected === \"AUTO\") {\n        hardClearMaskDebounced(input);\n        input.placeholder = placeholders.auto || \"\";\n      }\n      return { ok: false, value: raw };\n    }\n\n    if (selected !== \"AUTO\") {\n      const formatted = fmtFor(selected, raw);\n      if (formatted !== raw) {\n        const caret = input.selectionStart;\n        input.value = formatted;\n        if (caret != null) input.setSelectionRange(caret, caret);\n        raw = formatted;\n      }\n    } else {\n      const v2 = raw.toUpperCase().replace(/\\s+/g, \" \").trimStart();\n      if (v2 !== raw) input.value = raw = v2;\n    }\n    // non validiamo finche nn c e un risultato minimo\n    if (raw.trim()?.length <= 5) return { ok: false, value: raw };\n\n    const countries = selected === \"AUTO\" ? allowed : [selected];\n    const res = validatePlate(raw, countries, { vehicleType });\n\n    if (res.isValid && res.matches.length) {\n      const m = normalize(res.matches[0]?.country || \"\");\n      if (isCountryKey(m)) {\n        const match = m as CountryKey;\n\n        const formatted = fmtFor(match, input.value);\n        if (formatted !== input.value) input.value = formatted;\n\n        setValidityUI(true, \"\", match, input, statusEl, lang, wrapperEl);\n        setFlag(match, flagIcon, flagLabel, lang);\n        applyMaskDebounced(input, match);\n\n        const fmt = getDisplayFormat(match);\n        if (fmt) input.placeholder = fmt;\n\n        return { ok: true, country: match, value: input.value };\n      } else {\n        // fallback: se non \u00E8 un CountryKey valido, trattalo come KO sotto\n        // KO\n        const checkedArr = res.checked ?? [];\n        const msg = checkedArr.length ? `\u274C ${t(lang, \"invalid\")} \u2014 ${t(lang, \"checked\")}: ${checkedArr.join(\", \")}` : `\u274C ${t(lang, \"invalid\")}`;\n\n        setValidityUI(false, msg, null, input, statusEl, lang, wrapperEl);\n\n        // In AUTO rimuovi eventuale mask \u201Cresidua\u201D\n        if (selected === \"AUTO\") {\n          hardClearMaskDebounced(input);\n          input.placeholder = \"\";\n        }\n\n        return { ok: false, value: input.value };\n      }\n    } else {\n      // KO\n      const checkedArr = res.checked ?? [];\n      const msg = checkedArr.length ? `\u274C ${t(lang, \"invalid\")} \u2014 ${t(lang, \"checked\")}: ${checkedArr.join(\", \")}` : `\u274C ${t(lang, \"invalid\")}`;\n\n      setValidityUI(false, msg, null, input, statusEl, lang, wrapperEl);\n\n      // In AUTO rimuovi eventuale mask \u201Cresidua\u201D\n      if (selected === \"AUTO\") {\n        hardClearMaskDebounced(input);\n        input.placeholder = \"\";\n      }\n\n      return { ok: false, value: input.value };\n    }\n  }\n\n  function updatePlaceholderForCurrentSelection(selected: \"AUTO\" | CountryKey, input: HTMLInputElement, EuroMod: any, lang: Lang) {\n    if (selected === \"AUTO\") {\n      input.placeholder = t(lang, \"placeholderAuto\");\n    } else {\n      input.placeholder = EuroMod.getDisplayFormat(selected) || \"\";\n    }\n  }\n\n  // hasBtnDrop\n  function hasBtnDrop(b?: HTMLElement, d?: HTMLElement): b is HTMLElement & {} {\n    return !!b && !!d;\n  }\n\n  // onDocClick\n  const onDocClick = (e: MouseEvent) => {\n    if (!dropdown || !button) return;\n    const t = e.target as Node;\n    if (!dropdown.contains(t) && !button.contains(t)) {\n      dropdown.classList.remove(\"open\");\n      button.setAttribute(\"aria-expanded\", \"false\");\n    }\n  };\n\n  function selectCountry(code: \"AUTO\" | string, doFocus = true) {\n    // normalizza/valida\n    let next: \"AUTO\" | CountryKey = \"AUTO\";\n    if (code !== \"AUTO\") {\n      const n = normalize(String(code || \"\"));\n      next = isCountryKey(n) ? (n as CountryKey) : \"AUTO\";\n    }\n    // salva il precedente per sicurezza (se ti serve altrove)\n    const prev = selected;\n    selected = next;\n\n    // flag + placeholder\n    setFlag(selected, flagIcon, flagLabel, lang);\n    updatePlaceholderForCurrentSelection(selected, input, EuroMod, lang);\n\n    // 1) stacca SUBITO la vecchia mask (sync)\n    hardClearMask(input); // \u26A0\uFE0F IMPORTANTISSIMO: rimuovi SUBITO la vecchia mask (no debounce)\n\n    const hasText = !!input.value.trim();\n    const short = hasText && input.value.trim().length <= 5;\n\n    if (selected === \"AUTO\") {\n      // 2) AUTO: nessuna mask\n      if (!hasText) {\n        clearStatusUI(input, statusEl, wrapperEl);\n      } else {\n        // se vuoi allineare subito (facoltativo)\n        validateNow(); // opzionale\n      }\n    } else {\n      // 3) NON-AUTO: applica SEMPRE la nuova mask (anche a vuoto)\n      if (hasText) {\n        const v = fmtFor(selected, input.value);\n        if (input.value !== v) input.value = v;\n      }\n      // puoi usare la versione immediata o lasciare il tuo debounced;\n      //applyMaskDebounced(input, selected);\n      // se vuoi zero lag qui, crea una variante non debounced.\n      applyMaskNow(input, selected); // \uD83D\uDC48 immediata, niente race col debounce\n\n      // stato neutro se vuoto o corto\n      if (!hasText || short) {\n        clearStatusUI(input, statusEl, wrapperEl);\n      } else {\n        // se vuoi allineare subito (facoltativo)\n        validateNow(); // opzionale\n      }\n    }\n    // chiudi dropdown\n\n    if (dropdown && button) {\n      dropdown.classList.remove(\"open\");\n      button.setAttribute(\"aria-expanded\", \"false\");\n    }\n    // \uD83D\uDC47 focus solo se booleano true esplicito\n\n    if (doFocus === true) input.focus();\n  }\n\n  const instance: EuroPlateInstance = {\n    setCountry: (code) => selectCountry(code),\n\n    setAllowed(codes) {\n      allowed = Array.from(new Set((codes || []).map((c) => normalize(String(c || \"\"))))).filter(isCountryKey) as CountryKey[];\n      renderDropdown();\n    },\n    setVehicleType(t) {\n      (opts as any).vehicleType = t;\n    },\n    setDebug(on) {\n      DBG = !!on;\n    },\n\n    // 3) in setMode mantieni il focus (interazione esplicita)\n    setMode(m: \"AUTO\" | string) {\n      selectCountry(m); // focus = true (default)\n    },\n\n    setI18n(code) {\n      lang = pickLang(code);\n      renderDropdown();\n      setFlag(selected, flagIcon, flagLabel, lang);\n      updatePlaceholderForCurrentSelection(selected, input, EuroMod, lang);\n    },\n    validate: validateNow,\n    destroy() {\n      destroyed = true;\n      hardClearMaskDebounced(input);\n      input.removeEventListener(\"input\", validateNow as any);\n      input.removeEventListener(\"blur\", validateNow as any);\n      document.removeEventListener(\"click\", onDocClick);\n    },\n    getI18n: () => lang,\n  };\n\n  // wiring eventi\n  if (button) {\n    button.addEventListener(\"click\", () => {\n      if (!dropdown) return;\n      const open = dropdown.classList.toggle(\"open\");\n      button.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n    });\n  }\n\n  document.addEventListener(\"click\", onDocClick);\n  input.addEventListener(\"input\", validateNow as any);\n  input.addEventListener(\"blur\", validateNow as any);\n\n  // 4) all\u2019init evita il focus\n  renderDropdown();\n  selectCountry(mode, !!autoFocusOnInit); // \uD83D\uDC48 niente autofocus all\u2019avvio // ok: la funzione normalizza e imposta selected (\"AUTO\" | CountryKey)\n\n  BADGE(\"EuroPlate\", \"Pronto \u2705\", \"ok\");\n\n  return instance;\n}\n\n/* ============================================================\n * NOTE STRUTTURALI\n * - Tutto ci\u00F2 che NON \u00E8 esportato \u00E8 considerato interno.\n * - @internal aiuta i lettori; per l\u2019elisione serve tsconfig/declaration maps.\n * ============================================================ */\n\n/**\n * Wrapper DOM\n * - A runtime, se `wrapper` \u00E8 fornito, viene generata la struttura:\n *   .plate-epv-wrapper\n *     .plate-epv\n *       button.flag-btn > .epv__flag-box > .epv__flag\n *       input.plate-input\n *       .dropdown\n *     .status\n * - Classi di stato:\n *   input: .valid / .invalid (aria-invalid aggiornato)\n *   .dropdown: .open on/off\n *   .status: .ok / .err\n *\n * Accessibilit\u00E0:\n * - `flag-btn` \u00E8 `aria-haspopup=\"listbox\"` + `aria-expanded`\n * - `.dropdown` ha `role=\"listbox\"` e item con `role=\"option\"`\n */\n"],
  "mappings": "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",
  "names": ["t", "supportedCountries", "FLAG_MAP", "flagIcon", "flagLabel", "lang", "instance", "input", "selected", "EuroMod"]
}
