{
  "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": ["ensureBadgeLogger", "prefix", "debug", "DEFAULT_COLORS", "G", "globalBADGE", "localBADGE", "mod", "msg", "colorKey", "c", "txc", "tag", "css1", "css2", "css3", "localLOG", "args", "parts", "a", "color", "placeholderFromDisplayFormat", "format", "pick", "firstSignificantVariant", "out", "ch", "isLetterToken", "isDigitToken", "parts", "a", "b", "scoreVariant", "s", "isLetterTokenMask", "isDigitTokenMask", "isSeparator", "firstNonSep", "lastNonSep", "i", "countLetterBlocks", "blocks", "inBlock", "scoreMaskVariant", "digits", "letters", "len", "first", "last", "startsWithLetter", "endsWithLetter", "letterBlocks", "placeholderFromMasks", "masks", "best", "finalizeInputMaskLayouts", "baseLayouts", "displayFormats", "out", "displayPH", "k", "fmt", "placeholderFromDisplayFormat", "cc", "layout", "next", "m", "placeholderFromMasks", "supportedCountries", "FLAG_MAP", "COUNTRY_NAMES", "normalizeCode", "code", "up", "alias", "getCountryName", "code", "cc", "normalizeCode", "COUNTRY_NAMES", "COUNTRY_CODES", "FLAG_MAP", "COUNTRIES", "c", "FLAG_TO_CODE", "NAME_TO_CODE", "DISPLAY_FORMATS", "INPUTMASK_LAYOUTS", "INPUTMASK_LAYOUTS_FINAL", "finalizeInputMaskLayouts", "__depsOnce", "ensureDepsOnce", "opts", "log", "BADGE", "LOG", "ensureDeps", "err", "cdnURLs", "inFlightScripts", "inFlightCss", "detectCspNonce", "explicit", "winNonce", "meta", "applyAttrs", "el", "attrs", "k", "v", "buildKey", "kind", "url", "id", "loadScriptOnce", "src", "opt", "key", "existing", "p", "res", "rej", "s", "nonce", "to", "timeoutMs", "loadCssOnce", "href", "l", "getJQ", "hasJQ", "getToastr", "hasToastr", "getIM", "d", "hasIM", "ensureJQuery", "js", "created", "ensureToastr", "css", "keyCss", "keyJs", "createdCss", "createdJs", "pCss", "pJs", "ensureInputmask", "startTime", "optsForToastr", "msg", "dur", "ALL_COUNTRIES", "supportedCountries", "isCountryKey", "x", "DICT", "pickLang", "code", "t", "lang", "countryName", "cc", "norm", "normalizeCode", "local", "getCountryName", "COUNTRY_NAMES", "makeBaseLogger", "prefix", "DBG", "ext", "cons", "a", "type", "makeToastrLogger", "withPrefix", "randSuffix", "n", "deriveDefaultIds", "root", "wrapperOpt", "base", "inputId", "inputName", "resolveStatusCfg", "ui", "mode", "createEuroPlate", "EuroMod", "i18n", "wrapper", "allowedCountries", "vehicleType", "placeholders", "normalize", "c", "formatters", "timings", "logger", "deps", "autoFocusOnInit", "debug", "useToastrLogger", "input_type", "input", "button", "dropdown", "flagIcon", "flagLabel", "statusEl", "wrapperEl", "uiMerged", "statusCfg", "statusMode", "statusIcon", "showStatusText", "iconPosition", "defId", "defName", "wantedId", "wantedName", "plateInput", "inlineHost", "blockHost", "iconEl", "textEl", "preserve", "host", "inputType", "logPrefix", "ensureBadgeLogger", "G", "hasIMBound", "selected", "applyMaskNow", "getIMBound", "getInputMask", "getDisplayFormat", "FLAG_MAP", "validatePlate", "allowed", "destroyed", "fmtFor", "setFlag", "iso", "debounce", "fn", "wait", "args", "hardClearMask", "prev", "imLog", "hardClearMaskDebounced", "normalizePattern", "_", "level", "title", "payload", "imPreLog", "country", "optsIM", "mergedDefs", "imVersion", "used", "tokensUsedInMask", "have", "missing", "imMounted", "mask", "imError", "e", "set", "ch", "baseLetterDefs", "inputEl", "IM", "spec", "defaultDefs", "instance", "applyMaskDebounced", "defaultsRoot", "clearStatusUI", "status", "wrap", "setValidityUI", "ok", "matchCountry", "shortText", "renderDropdown", "frag", "auto", "selectCountry", "div", "validateNow", "raw", "formatted", "caret", "v2", "m", "match", "fmt", "checkedArr", "updatePlaceholderForCurrentSelection", "hasBtnDrop", "b", "onDocClick", "doFocus", "next", "hasText", "short", "codes", "on", "open"]
}
