{"version":3,"sources":["../src/camera/errors.ts","../src/camera/stream.ts","../src/content/parse.ts","../src/core/bit-matrix.ts","../src/errors.ts","../src/core/version.ts","../src/core/function-pattern.ts","../src/core/mask.ts","../src/core/gf256.ts","../src/core/reed-solomon.ts","../src/core/codewords.ts","../src/core/bch.ts","../src/core/format.ts","../src/core/bitstream.ts","../src/core/segments.ts","../src/core/decode-matrix.ts","../src/detect/bit-image.ts","../src/detect/binarizer.ts","../src/detect/alignment.ts","../src/detect/finder.ts","../src/detect/perspective.ts","../src/detect/detector.ts","../src/detect/downscale.ts","../src/detect/grayscale.ts","../src/decode.ts","../src/scanner/coords.ts","../src/camera/capabilities.ts","../src/camera/frame-grabber.ts","../src/scanner/dedupe.ts","../src/scanner/native.ts","../src/scanner/runner.ts","../src/scanner/structured-append.ts","../src/scanner/scanner.ts"],"names":["bytes","id"],"mappings":"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","file":"index.cjs","sourcesContent":["export type CameraErrorCode =\n  | 'insecure-context'\n  | 'unsupported'\n  | 'permission-denied'\n  | 'camera-not-found'\n  | 'camera-in-use'\n  | 'stream-failed';\n\n/** Typed camera/stream failure — match on `code`, not message strings. */\nexport class CameraError extends Error {\n  override readonly name = 'CameraError';\n\n  constructor(\n    readonly code: CameraErrorCode,\n    message: string,\n    readonly cause?: unknown,\n  ) {\n    super(message);\n  }\n\n  /** Maps a getUserMedia rejection to a typed CameraError. */\n  static from(error: unknown): CameraError {\n    if (error instanceof CameraError) return error;\n    const name = (error as { name?: string })?.name ?? '';\n    switch (name) {\n      case 'NotAllowedError':\n      case 'PermissionDeniedError':\n      case 'SecurityError':\n        return new CameraError('permission-denied', 'camera permission was denied', error);\n      case 'NotFoundError':\n      case 'DevicesNotFoundError':\n      case 'OverconstrainedError':\n        return new CameraError('camera-not-found', 'no camera matches the constraints', error);\n      case 'NotReadableError':\n      case 'TrackStartError':\n        return new CameraError('camera-in-use', 'camera is already in use or unreadable', error);\n      default:\n        return new CameraError('stream-failed', 'could not start the camera stream', error);\n    }\n  }\n}\n","import { CameraError } from './errors.js';\n\nexport interface CameraOptions {\n  /** Which way the camera faces; ignored when deviceId is set. */\n  facing?: 'environment' | 'user';\n  /** Exact camera device (from listCameras()). */\n  deviceId?: string;\n  /** Ideal capture resolution; the browser picks the closest mode. */\n  resolution?: { width?: number; height?: number };\n}\n\nexport function buildConstraints(camera: CameraOptions = {}): MediaStreamConstraints {\n  const video: MediaTrackConstraints = {\n    width: { ideal: camera.resolution?.width ?? 1280 },\n    height: { ideal: camera.resolution?.height ?? 720 },\n  };\n  if (camera.deviceId !== undefined) {\n    video.deviceId = { exact: camera.deviceId };\n  } else {\n    video.facingMode = { ideal: camera.facing ?? 'environment' };\n  }\n  return { video, audio: false };\n}\n\nfunction resolveMediaDevices(override?: MediaDevices): MediaDevices | null {\n  if (override) return override;\n  if (typeof navigator !== 'undefined' && navigator.mediaDevices) return navigator.mediaDevices;\n  return null;\n}\n\n/** Requests a camera stream, translating failures to typed CameraErrors. */\nexport async function startStream(\n  camera: CameraOptions = {},\n  mediaDevicesOverride?: MediaDevices,\n): Promise<MediaStream> {\n  const mediaDevices = resolveMediaDevices(mediaDevicesOverride);\n  if (!mediaDevices?.getUserMedia) {\n    if (typeof window !== 'undefined' && window.isSecureContext === false) {\n      throw new CameraError(\n        'insecure-context',\n        'camera access requires a secure context (HTTPS or localhost)',\n      );\n    }\n    throw new CameraError('unsupported', 'getUserMedia is not available in this environment');\n  }\n  try {\n    return await mediaDevices.getUserMedia(buildConstraints(camera));\n  } catch (error) {\n    throw CameraError.from(error);\n  }\n}\n\nexport function stopStream(stream: MediaStream): void {\n  for (const track of stream.getTracks()) track.stop();\n}\n\nexport interface CameraDevice {\n  id: string;\n  label: string;\n}\n\n/**\n * Lists available cameras. Labels are only populated once the user has\n * granted camera permission (a platform privacy rule, not ours).\n */\nexport async function listCameras(mediaDevicesOverride?: MediaDevices): Promise<CameraDevice[]> {\n  const mediaDevices = resolveMediaDevices(mediaDevicesOverride);\n  if (!mediaDevices?.enumerateDevices) return [];\n  const devices = await mediaDevices.enumerateDevices();\n  return devices\n    .filter((device) => device.kind === 'videoinput')\n    .map((device, index) => ({\n      id: device.deviceId,\n      label: device.label || `Camera ${index + 1}`,\n    }));\n}\n","/**\n * Best-effort classification of common QR payload conventions. Pure string\n * processing — never throws; unrecognized payloads come back as\n * `{ type: 'text' }`.\n */\nexport type ParsedContent =\n  | { type: 'url'; url: string }\n  | {\n      type: 'wifi';\n      ssid: string;\n      password?: string;\n      security?: 'WEP' | 'WPA' | 'WPA2-EAP' | 'nopass';\n      hidden?: boolean;\n    }\n  | { type: 'geo'; latitude: number; longitude: number; altitude?: number }\n  | { type: 'tel'; number: string }\n  | { type: 'sms'; number: string; message?: string }\n  | { type: 'email'; to: string; subject?: string; body?: string }\n  | { type: 'vcard'; raw: string; name?: string; org?: string; tel?: string; email?: string }\n  | { type: 'gs1'; raw: string; elements: Array<{ ai: string; value: string }> }\n  | { type: 'text'; text: string };\n\nexport interface ParseContentHints {\n  /** The symbol carried FNC1 in first position (GS1-formatted data). */\n  gs1?: boolean;\n}\n\nexport function parseContent(text: string, hints: ParseContentHints = {}): ParsedContent {\n  return (\n    (hints.gs1 === true ? parseGs1(text) : null) ??\n    parseWifi(text) ??\n    parseGeo(text) ??\n    parseTel(text) ??\n    parseSms(text) ??\n    parseEmail(text) ??\n    parseVCard(text) ??\n    parseUrl(text) ?? { type: 'text', text }\n  );\n}\n\n/**\n * Splits a GS1 element string into (application identifier, value) pairs.\n * Fixed-length AIs come from the GS1 predefined-length table; everything\n * else reads to the next GS separator (0x1D). Best-effort: uncommon 3/4-digit\n * variable AIs outside the known prefix ranges fall back to a 2-digit split.\n */\nfunction parseGs1(text: string): ParsedContent | null {\n  const elements: Array<{ ai: string; value: string }> = [];\n  let pos = 0;\n  while (pos < text.length) {\n    if (text[pos] === '\\x1d') {\n      pos++;\n      continue;\n    }\n    const two = text.slice(pos, pos + 2);\n    if (!/^\\d\\d$/.test(two)) return null;\n    const prefix = Number(two);\n\n    let aiLength = 2;\n    let valueLength: number | null = null; // null = variable, read to GS\n    const fixedTwoDigit: Record<string, number> = {\n      '00': 18,\n      '01': 14,\n      '02': 14,\n      '03': 14,\n      '04': 16,\n      '11': 6,\n      '12': 6,\n      '13': 6,\n      '14': 6,\n      '15': 6,\n      '16': 6,\n      '17': 6,\n      '18': 6,\n      '19': 6,\n      '20': 2,\n    };\n    if (two in fixedTwoDigit) {\n      valueLength = fixedTwoDigit[two]!;\n    } else if (prefix >= 31 && prefix <= 36) {\n      aiLength = 4; // metric measures, e.g. 3103 = net weight kg, 3 decimals\n      valueLength = 6;\n    } else if (prefix === 41) {\n      aiLength = 3; // 410–419 routing/location codes\n      valueLength = 13;\n    } else if (prefix === 23 || prefix === 24 || prefix === 25 || prefix === 40 || prefix === 42) {\n      aiLength = 3;\n    } else if (prefix === 39 || prefix === 43 || (prefix >= 70 && prefix <= 82)) {\n      aiLength = 4;\n    }\n\n    const ai = text.slice(pos, pos + aiLength);\n    if (ai.length < aiLength || !/^\\d+$/.test(ai)) return null;\n    pos += aiLength;\n\n    let value: string;\n    if (valueLength !== null) {\n      value = text.slice(pos, pos + valueLength);\n      if (value.length < valueLength) return null;\n      pos += valueLength;\n    } else {\n      const gs = text.indexOf('\\x1d', pos);\n      value = gs === -1 ? text.slice(pos) : text.slice(pos, gs);\n      pos += value.length;\n    }\n    if (value === '') return null;\n    elements.push({ ai, value });\n  }\n  return elements.length > 0 ? { type: 'gs1', raw: text, elements } : null;\n}\n\nfunction parseUrl(text: string): ParsedContent | null {\n  if (!/^https?:\\/\\//i.test(text)) return null;\n  try {\n    new URL(text);\n    return { type: 'url', url: text };\n  } catch {\n    return null;\n  }\n}\n\n/** WIFI:T:WPA;S:my ssid;P:secret;H:true;; with \\-escaping of ; , : \" \\ */\nfunction parseWifi(text: string): ParsedContent | null {\n  if (!/^WIFI:/i.test(text)) return null;\n  const fields = new Map<string, string>();\n  let key = '';\n  let value = '';\n  let inValue = false;\n  const body = text.slice(5);\n  for (let i = 0; i < body.length; i++) {\n    const char = body[i]!;\n    if (char === '\\\\' && i + 1 < body.length) {\n      value += body[++i]!;\n      continue;\n    }\n    if (!inValue && char === ':') {\n      key = value;\n      value = '';\n      inValue = true;\n    } else if (inValue && char === ';') {\n      fields.set(key.toUpperCase(), value);\n      value = '';\n      inValue = false;\n    } else {\n      value += char;\n    }\n  }\n  // The `;;` terminator is conventional, not universal. Commit a field left\n  // open at the end of the payload rather than dropping it — an unterminated\n  // `WIFI:S:mynet` otherwise falls all the way through to plain text.\n  if (inValue && key !== '') fields.set(key.toUpperCase(), value);\n\n  const ssid = fields.get('S');\n  if (ssid === undefined || ssid === '') return null;\n\n  const result: ParsedContent = { type: 'wifi', ssid };\n  const security = fields.get('T')?.toUpperCase();\n  if (security === 'WEP' || security === 'WPA' || security === 'WPA2-EAP') {\n    result.security = security;\n  } else if (security?.toLowerCase() === 'nopass') {\n    result.security = 'nopass';\n  }\n  const password = fields.get('P');\n  if (password !== undefined && password !== '' && result.security !== 'nopass') {\n    result.password = password;\n  }\n  if (fields.get('H')?.toLowerCase() === 'true') result.hidden = true;\n  return result;\n}\n\nfunction parseGeo(text: string): ParsedContent | null {\n  const match = /^geo:(-?\\d+(?:\\.\\d+)?),(-?\\d+(?:\\.\\d+)?)(?:,(-?\\d+(?:\\.\\d+)?))?/i.exec(text);\n  if (!match) return null;\n  const result: ParsedContent = {\n    type: 'geo',\n    latitude: Number(match[1]),\n    longitude: Number(match[2]),\n  };\n  if (match[3] !== undefined) result.altitude = Number(match[3]);\n  return result;\n}\n\nfunction parseTel(text: string): ParsedContent | null {\n  const match = /^tel:(.+)$/i.exec(text);\n  return match ? { type: 'tel', number: match[1]! } : null;\n}\n\n/** smsto:number:message and sms:number?body=message */\nfunction parseSms(text: string): ParsedContent | null {\n  const smsto = /^smsto:([^:]+)(?::([\\s\\S]*))?$/i.exec(text);\n  if (smsto) {\n    const result: ParsedContent = { type: 'sms', number: smsto[1]! };\n    if (smsto[2]) result.message = smsto[2];\n    return result;\n  }\n  const sms = /^sms:([^?]+)(?:\\?body=([\\s\\S]*))?$/i.exec(text);\n  if (sms) {\n    const result: ParsedContent = { type: 'sms', number: sms[1]! };\n    if (sms[2]) result.message = safeDecodeURIComponent(sms[2]);\n    return result;\n  }\n  return null;\n}\n\n/** mailto: URLs and the MATMSG:TO:…;SUB:…;BODY:…;; convention. */\nfunction parseEmail(text: string): ParsedContent | null {\n  const mailto = /^mailto:([^?]+)(?:\\?([\\s\\S]*))?$/i.exec(text);\n  if (mailto) {\n    const result: ParsedContent = { type: 'email', to: safeDecodeURIComponent(mailto[1]!) };\n    if (mailto[2]) {\n      const params = new URLSearchParams(mailto[2]);\n      const subject = params.get('subject');\n      const body = params.get('body');\n      if (subject) result.subject = subject;\n      if (body) result.body = body;\n    }\n    return result;\n  }\n  if (/^MATMSG:/i.test(text)) {\n    const to = /TO:([^;]*)/i.exec(text)?.[1];\n    if (!to) return null;\n    const result: ParsedContent = { type: 'email', to };\n    const subject = /SUB:([^;]*)/i.exec(text)?.[1];\n    const body = /BODY:([^;]*)/i.exec(text)?.[1];\n    if (subject) result.subject = subject;\n    if (body) result.body = body;\n    return result;\n  }\n  return null;\n}\n\nfunction parseVCard(text: string): ParsedContent | null {\n  if (!/^BEGIN:VCARD/i.test(text.trimStart())) return null;\n  const result: ParsedContent = { type: 'vcard', raw: text };\n  const name = /^FN(?:;[^:]*)?:(.+)$/im.exec(text)?.[1];\n  const org = /^ORG(?:;[^:]*)?:(.+)$/im.exec(text)?.[1];\n  const tel = /^TEL(?:;[^:]*)?:(.+)$/im.exec(text)?.[1];\n  const email = /^EMAIL(?:;[^:]*)?:(.+)$/im.exec(text)?.[1];\n  if (name) result.name = name.trim();\n  if (org) result.org = org.trim();\n  if (tel) result.tel = tel.trim();\n  if (email) result.email = email.trim();\n  return result;\n}\n\nfunction safeDecodeURIComponent(value: string): string {\n  try {\n    return decodeURIComponent(value);\n  } catch {\n    return value;\n  }\n}\n","/**\n * Square matrix of modules. `get(x, y)` addresses column x, row y; truthy\n * means a dark module.\n */\nexport class BitMatrix {\n  readonly size: number;\n  private readonly bits: Uint8Array;\n\n  constructor(size: number, bits?: Uint8Array) {\n    if (bits !== undefined && bits.length !== size * size) {\n      throw new Error(`bit buffer length ${bits.length} does not match size ${size}`);\n    }\n    this.size = size;\n    this.bits = bits ?? new Uint8Array(size * size);\n  }\n\n  get(x: number, y: number): boolean {\n    return this.bits[y * this.size + x] !== 0;\n  }\n\n  set(x: number, y: number, value: boolean): void {\n    this.bits[y * this.size + x] = value ? 1 : 0;\n  }\n\n  /** Marks a width×height region starting at (left, top). */\n  setRegion(left: number, top: number, width: number, height: number): void {\n    for (let y = top; y < top + height; y++) {\n      for (let x = left; x < left + width; x++) {\n        this.bits[y * this.size + x] = 1;\n      }\n    }\n  }\n\n  clone(): BitMatrix {\n    return new BitMatrix(this.size, this.bits.slice());\n  }\n}\n","export type DecodeErrorCode =\n  | 'detect'\n  | 'invalid-dimension'\n  | 'format-info'\n  | 'version-info'\n  | 'codewords'\n  | 'reed-solomon'\n  | 'bitstream'\n  | 'unsupported-mode'\n  // The decode runner itself failed (e.g. the decode Web Worker crashed), as\n  // opposed to a specific pipeline stage rejecting the symbol.\n  | 'runner-failed';\n\n/** Thrown when a bit matrix cannot be decoded as a valid QR symbol. */\nexport class DecodeError extends Error {\n  override readonly name = 'DecodeError';\n\n  constructor(\n    readonly code: DecodeErrorCode,\n    message: string,\n    readonly cause?: unknown,\n  ) {\n    super(message);\n  }\n\n  /**\n   * Wraps a decode/worker fault as a typed DecodeError, passing an existing\n   * DecodeError through unchanged. Used to keep runner failures out of the\n   * camera-stream error channel (see QrScanner's error event).\n   */\n  static from(error: unknown): DecodeError {\n    if (error instanceof DecodeError) return error;\n    const message = error instanceof Error ? error.message : String(error);\n    return new DecodeError('runner-failed', message, error);\n  }\n}\n","import type { ErrorCorrectionLevel } from '../types.js';\n\nexport interface EcBlockGroup {\n  /** Number of blocks with this shape. */\n  count: number;\n  /** Data codewords per block (EC codewords come on top). */\n  dataCodewords: number;\n}\n\nexport interface EcBlocks {\n  ecCodewordsPerBlock: number;\n  groups: EcBlockGroup[];\n}\n\nexport interface VersionInfo {\n  version: number;\n  size: number;\n  alignmentPositions: number[];\n  ecBlocks: Record<ErrorCorrectionLevel, EcBlocks>;\n}\n\nexport function versionForSize(size: number): number | null {\n  if (size < 21 || size > 177 || (size - 17) % 4 !== 0) return null;\n  return (size - 17) / 4;\n}\n\nexport function sizeForVersion(version: number): number {\n  return version * 4 + 17;\n}\n\n/** Total codewords (data + EC) in a version, derived from the EC table. */\nexport function totalCodewords(info: VersionInfo, level: ErrorCorrectionLevel): number {\n  const { ecCodewordsPerBlock, groups } = info.ecBlocks[level];\n  return groups.reduce((sum, g) => sum + g.count * (g.dataCodewords + ecCodewordsPerBlock), 0);\n}\n\n// Compact ECC table, one row per version, levels ordered L, M, Q, H.\n// Row shape: [ecPerBlock, count1, data1, count2?, data2?] per level.\n// Source: ISO/IEC 18004 error correction characteristics table.\ntype EcRow = [number, number, number] | [number, number, number, number, number];\n\nconst ECC_TABLE: [EcRow, EcRow, EcRow, EcRow][] = [\n  /*  1 */ [\n    [7, 1, 19],\n    [10, 1, 16],\n    [13, 1, 13],\n    [17, 1, 9],\n  ],\n  /*  2 */ [\n    [10, 1, 34],\n    [16, 1, 28],\n    [22, 1, 22],\n    [28, 1, 16],\n  ],\n  /*  3 */ [\n    [15, 1, 55],\n    [26, 1, 44],\n    [18, 2, 17],\n    [22, 2, 13],\n  ],\n  /*  4 */ [\n    [20, 1, 80],\n    [18, 2, 32],\n    [26, 2, 24],\n    [16, 4, 9],\n  ],\n  /*  5 */ [\n    [26, 1, 108],\n    [24, 2, 43],\n    [18, 2, 15, 2, 16],\n    [22, 2, 11, 2, 12],\n  ],\n  /*  6 */ [\n    [18, 2, 68],\n    [16, 4, 27],\n    [24, 4, 19],\n    [28, 4, 15],\n  ],\n  /*  7 */ [\n    [20, 2, 78],\n    [18, 4, 31],\n    [18, 2, 14, 4, 15],\n    [26, 4, 13, 1, 14],\n  ],\n  /*  8 */ [\n    [24, 2, 97],\n    [22, 2, 38, 2, 39],\n    [22, 4, 18, 2, 19],\n    [26, 4, 14, 2, 15],\n  ],\n  /*  9 */ [\n    [30, 2, 116],\n    [22, 3, 36, 2, 37],\n    [20, 4, 16, 4, 17],\n    [24, 4, 12, 4, 13],\n  ],\n  /* 10 */ [\n    [18, 2, 68, 2, 69],\n    [26, 4, 43, 1, 44],\n    [24, 6, 19, 2, 20],\n    [28, 6, 15, 2, 16],\n  ],\n  /* 11 */ [\n    [20, 4, 81],\n    [30, 1, 50, 4, 51],\n    [28, 4, 22, 4, 23],\n    [24, 3, 12, 8, 13],\n  ],\n  /* 12 */ [\n    [24, 2, 92, 2, 93],\n    [22, 6, 36, 2, 37],\n    [26, 4, 20, 6, 21],\n    [28, 7, 14, 4, 15],\n  ],\n  /* 13 */ [\n    [26, 4, 107],\n    [22, 8, 37, 1, 38],\n    [24, 8, 20, 4, 21],\n    [22, 12, 11, 4, 12],\n  ],\n  /* 14 */ [\n    [30, 3, 115, 1, 116],\n    [24, 4, 40, 5, 41],\n    [20, 11, 16, 5, 17],\n    [24, 11, 12, 5, 13],\n  ],\n  /* 15 */ [\n    [22, 5, 87, 1, 88],\n    [24, 5, 41, 5, 42],\n    [30, 5, 24, 7, 25],\n    [24, 11, 12, 7, 13],\n  ],\n  /* 16 */ [\n    [24, 5, 98, 1, 99],\n    [28, 7, 45, 3, 46],\n    [24, 15, 19, 2, 20],\n    [30, 3, 15, 13, 16],\n  ],\n  /* 17 */ [\n    [28, 1, 107, 5, 108],\n    [28, 10, 46, 1, 47],\n    [28, 1, 22, 15, 23],\n    [28, 2, 14, 17, 15],\n  ],\n  /* 18 */ [\n    [30, 5, 120, 1, 121],\n    [26, 9, 43, 4, 44],\n    [28, 17, 22, 1, 23],\n    [28, 2, 14, 19, 15],\n  ],\n  /* 19 */ [\n    [28, 3, 113, 4, 114],\n    [26, 3, 44, 11, 45],\n    [26, 17, 21, 4, 22],\n    [26, 9, 13, 16, 14],\n  ],\n  /* 20 */ [\n    [28, 3, 107, 5, 108],\n    [26, 3, 41, 13, 42],\n    [30, 15, 24, 5, 25],\n    [28, 15, 15, 10, 16],\n  ],\n  /* 21 */ [\n    [28, 4, 116, 4, 117],\n    [26, 17, 42],\n    [28, 17, 22, 6, 23],\n    [30, 19, 16, 6, 17],\n  ],\n  /* 22 */ [\n    [28, 2, 111, 7, 112],\n    [28, 17, 46],\n    [30, 7, 24, 16, 25],\n    [24, 34, 13],\n  ],\n  /* 23 */ [\n    [30, 4, 121, 5, 122],\n    [28, 4, 47, 14, 48],\n    [30, 11, 24, 14, 25],\n    [30, 16, 15, 14, 16],\n  ],\n  /* 24 */ [\n    [30, 6, 117, 4, 118],\n    [28, 6, 45, 14, 46],\n    [30, 11, 24, 16, 25],\n    [30, 30, 16, 2, 17],\n  ],\n  /* 25 */ [\n    [26, 8, 106, 4, 107],\n    [28, 8, 47, 13, 48],\n    [30, 7, 24, 22, 25],\n    [30, 22, 15, 13, 16],\n  ],\n  /* 26 */ [\n    [28, 10, 114, 2, 115],\n    [28, 19, 46, 4, 47],\n    [28, 28, 22, 6, 23],\n    [30, 33, 16, 4, 17],\n  ],\n  /* 27 */ [\n    [30, 8, 122, 4, 123],\n    [28, 22, 45, 3, 46],\n    [30, 8, 23, 26, 24],\n    [30, 12, 15, 28, 16],\n  ],\n  /* 28 */ [\n    [30, 3, 117, 10, 118],\n    [28, 3, 45, 23, 46],\n    [30, 4, 24, 31, 25],\n    [30, 11, 15, 31, 16],\n  ],\n  /* 29 */ [\n    [30, 7, 116, 7, 117],\n    [28, 21, 45, 7, 46],\n    [30, 1, 23, 37, 24],\n    [30, 19, 15, 26, 16],\n  ],\n  /* 30 */ [\n    [30, 5, 115, 10, 116],\n    [28, 19, 47, 10, 48],\n    [30, 15, 24, 25, 25],\n    [30, 23, 15, 25, 16],\n  ],\n  /* 31 */ [\n    [30, 13, 115, 3, 116],\n    [28, 2, 46, 29, 47],\n    [30, 42, 24, 1, 25],\n    [30, 23, 15, 28, 16],\n  ],\n  /* 32 */ [\n    [30, 17, 115],\n    [28, 10, 46, 23, 47],\n    [30, 10, 24, 35, 25],\n    [30, 19, 15, 35, 16],\n  ],\n  /* 33 */ [\n    [30, 17, 115, 1, 116],\n    [28, 14, 46, 21, 47],\n    [30, 29, 24, 19, 25],\n    [30, 11, 15, 46, 16],\n  ],\n  /* 34 */ [\n    [30, 13, 115, 6, 116],\n    [28, 14, 46, 23, 47],\n    [30, 44, 24, 7, 25],\n    [30, 59, 16, 1, 17],\n  ],\n  /* 35 */ [\n    [30, 12, 121, 7, 122],\n    [28, 12, 47, 26, 48],\n    [30, 39, 24, 14, 25],\n    [30, 22, 15, 41, 16],\n  ],\n  /* 36 */ [\n    [30, 6, 121, 14, 122],\n    [28, 6, 47, 34, 48],\n    [30, 46, 24, 10, 25],\n    [30, 2, 15, 64, 16],\n  ],\n  /* 37 */ [\n    [30, 17, 122, 4, 123],\n    [28, 29, 46, 14, 47],\n    [30, 49, 24, 10, 25],\n    [30, 24, 15, 46, 16],\n  ],\n  /* 38 */ [\n    [30, 4, 122, 18, 123],\n    [28, 13, 46, 32, 47],\n    [30, 48, 24, 14, 25],\n    [30, 42, 15, 32, 16],\n  ],\n  /* 39 */ [\n    [30, 20, 117, 4, 118],\n    [28, 40, 47, 7, 48],\n    [30, 43, 24, 22, 25],\n    [30, 10, 15, 67, 16],\n  ],\n  /* 40 */ [\n    [30, 19, 118, 6, 119],\n    [28, 18, 47, 31, 48],\n    [30, 34, 24, 34, 25],\n    [30, 20, 15, 61, 16],\n  ],\n];\n\n// Alignment pattern center coordinates per version (ISO/IEC 18004 Annex E).\nconst ALIGNMENT_POSITIONS: number[][] = [\n  /*  1 */ [],\n  /*  2 */ [6, 18],\n  /*  3 */ [6, 22],\n  /*  4 */ [6, 26],\n  /*  5 */ [6, 30],\n  /*  6 */ [6, 34],\n  /*  7 */ [6, 22, 38],\n  /*  8 */ [6, 24, 42],\n  /*  9 */ [6, 26, 46],\n  /* 10 */ [6, 28, 50],\n  /* 11 */ [6, 30, 54],\n  /* 12 */ [6, 32, 58],\n  /* 13 */ [6, 34, 62],\n  /* 14 */ [6, 26, 46, 66],\n  /* 15 */ [6, 26, 48, 70],\n  /* 16 */ [6, 26, 50, 74],\n  /* 17 */ [6, 30, 54, 78],\n  /* 18 */ [6, 30, 56, 82],\n  /* 19 */ [6, 30, 58, 86],\n  /* 20 */ [6, 34, 62, 90],\n  /* 21 */ [6, 28, 50, 72, 94],\n  /* 22 */ [6, 26, 50, 74, 98],\n  /* 23 */ [6, 30, 54, 78, 102],\n  /* 24 */ [6, 28, 54, 80, 106],\n  /* 25 */ [6, 32, 58, 84, 110],\n  /* 26 */ [6, 30, 58, 86, 114],\n  /* 27 */ [6, 34, 62, 90, 118],\n  /* 28 */ [6, 26, 50, 74, 98, 122],\n  /* 29 */ [6, 30, 54, 78, 102, 126],\n  /* 30 */ [6, 26, 52, 78, 104, 130],\n  /* 31 */ [6, 30, 56, 82, 108, 134],\n  /* 32 */ [6, 34, 60, 86, 112, 138],\n  /* 33 */ [6, 30, 58, 86, 114, 142],\n  /* 34 */ [6, 34, 62, 90, 118, 146],\n  /* 35 */ [6, 30, 54, 78, 102, 126, 150],\n  /* 36 */ [6, 24, 50, 76, 102, 128, 154],\n  /* 37 */ [6, 28, 54, 80, 106, 132, 158],\n  /* 38 */ [6, 32, 58, 84, 110, 136, 162],\n  /* 39 */ [6, 26, 54, 82, 110, 138, 166],\n  /* 40 */ [6, 30, 58, 86, 114, 142, 170],\n];\n\nfunction parseRow(row: EcRow): EcBlocks {\n  const groups: EcBlockGroup[] = [{ count: row[1], dataCodewords: row[2] }];\n  if (row.length === 5) groups.push({ count: row[3], dataCodewords: row[4] });\n  return { ecCodewordsPerBlock: row[0], groups };\n}\n\nconst VERSIONS: VersionInfo[] = ECC_TABLE.map((levels, i) => ({\n  version: i + 1,\n  size: sizeForVersion(i + 1),\n  alignmentPositions: ALIGNMENT_POSITIONS[i]!,\n  ecBlocks: {\n    L: parseRow(levels[0]),\n    M: parseRow(levels[1]),\n    Q: parseRow(levels[2]),\n    H: parseRow(levels[3]),\n  },\n}));\n\nexport function getVersionInfo(version: number): VersionInfo {\n  const info = VERSIONS[version - 1];\n  if (info === undefined) throw new RangeError(`invalid QR version ${version}`);\n  return info;\n}\n","import { BitMatrix } from './bit-matrix.js';\nimport { getVersionInfo } from './version.js';\n\n/**\n * Builds a matrix marking every function module (finder patterns, separators,\n * timing patterns, alignment patterns, format/version info areas, dark\n * module) so the codeword readout can skip them.\n */\nexport function buildFunctionPatternMap(version: number): BitMatrix {\n  const info = getVersionInfo(version);\n  const size = info.size;\n  const map = new BitMatrix(size);\n\n  // Finder patterns + separators + format info areas (the dark module at\n  // (8, size-8) falls inside the bottom-left region).\n  map.setRegion(0, 0, 9, 9);\n  map.setRegion(size - 8, 0, 8, 9);\n  map.setRegion(0, size - 8, 9, 8);\n\n  // Alignment patterns: all coordinate pairs except the three that would\n  // overlap the finder patterns.\n  const positions = info.alignmentPositions;\n  const max = positions.length - 1;\n  for (let i = 0; i < positions.length; i++) {\n    for (let j = 0; j < positions.length; j++) {\n      const overlapsFinder =\n        (i === 0 && j === 0) || (i === 0 && j === max) || (i === max && j === 0);\n      if (overlapsFinder) continue;\n      map.setRegion(positions[j]! - 2, positions[i]! - 2, 5, 5);\n    }\n  }\n\n  // Timing patterns.\n  map.setRegion(6, 9, 1, size - 17);\n  map.setRegion(9, 6, size - 17, 1);\n\n  // Version info areas (versions 7 and up).\n  if (version >= 7) {\n    map.setRegion(size - 11, 0, 3, 6);\n    map.setRegion(0, size - 11, 6, 3);\n  }\n\n  return map;\n}\n\n/** Number of non-function modules — the data+EC capacity in bits. */\nexport function countDataModules(version: number): number {\n  const map = buildFunctionPatternMap(version);\n  let count = 0;\n  for (let y = 0; y < map.size; y++) {\n    for (let x = 0; x < map.size; x++) {\n      if (!map.get(x, y)) count++;\n    }\n  }\n  return count;\n}\n","// #region snippet: mask\n/**\n * The eight QR data mask conditions (ISO/IEC 18004 §8.8.1). Returns true when\n * the module at (row, col) is inverted by the given mask pattern.\n */\nexport function maskBit(mask: number, row: number, col: number): boolean {\n  switch (mask) {\n    case 0:\n      return (row + col) % 2 === 0;\n    case 1:\n      return row % 2 === 0;\n    case 2:\n      return col % 3 === 0;\n    case 3:\n      return (row + col) % 3 === 0;\n    case 4:\n      return (Math.floor(row / 2) + Math.floor(col / 3)) % 2 === 0;\n    case 5:\n      return ((row * col) % 2) + ((row * col) % 3) === 0;\n    case 6:\n      return (((row * col) % 2) + ((row * col) % 3)) % 2 === 0;\n    case 7:\n      return (((row + col) % 2) + ((row * col) % 3)) % 2 === 0;\n    default:\n      throw new RangeError(`invalid mask pattern ${mask}`);\n  }\n}\n// #endregion snippet\n","/**\n * Arithmetic in GF(2^8) as used by QR error correction: the field is built\n * from the primitive polynomial x^8 + x^4 + x^3 + x^2 + 1 (0x11d) with\n * generator α = 2 (ISO/IEC 18004 §8.5.2). Log/antilog lookup tables are the\n * standard implementation technique for the field operations.\n *\n * Polynomials over the field are plain Uint8Arrays in ascending-degree order:\n * p[i] is the coefficient of x^i.\n */\n\nconst PRIMITIVE = 0x11d;\n/** Multiplicative order of the field: α^255 = 1. */\nconst ORDER = 255;\n\n/** antilog[e] = α^e; doubled in length so summed logs index without a mod. */\nconst antilog = new Uint8Array(ORDER * 2);\n/** logOf[v] = e with α^e = v, for v ≥ 1 (index 0 is unused). */\nconst logOf = new Uint8Array(256);\n\n{\n  let value = 1;\n  for (let e = 0; e < ORDER; e++) {\n    antilog[e] = value;\n    antilog[e + ORDER] = value;\n    logOf[value] = e;\n    value <<= 1;\n    if (value & 0x100) value ^= PRIMITIVE;\n  }\n}\n\n/** α^e for any integer exponent, including negative ones. */\nexport function alphaPow(e: number): number {\n  return antilog[((e % ORDER) + ORDER) % ORDER]!;\n}\n\n/** Discrete log base α of a non-zero field element. */\nexport function gfLog(a: number): number {\n  if (a === 0) throw new RangeError('zero has no discrete log in GF(256)');\n  return logOf[a]!;\n}\n\nexport function gfMul(a: number, b: number): number {\n  if (a === 0 || b === 0) return 0;\n  return antilog[logOf[a]! + logOf[b]!]!;\n}\n\nexport function gfDiv(a: number, b: number): number {\n  if (b === 0) throw new RangeError('division by zero in GF(256)');\n  if (a === 0) return 0;\n  return antilog[logOf[a]! + ORDER - logOf[b]!]!;\n}\n\n/** Multiplicative inverse of a non-zero field element. */\nexport function gfInv(a: number): number {\n  if (a === 0) throw new RangeError('zero is not invertible in GF(256)');\n  return antilog[ORDER - logOf[a]!]!;\n}\n\n/** Evaluates the ascending-degree polynomial p at x by Horner's rule. */\nexport function polyEval(p: Uint8Array, x: number): number {\n  let acc = 0;\n  for (let i = p.length - 1; i >= 0; i--) {\n    acc = gfMul(acc, x) ^ p[i]!;\n  }\n  return acc;\n}\n\n/** Product of two ascending-degree polynomials (fresh buffer). */\nexport function polyMul(a: Uint8Array, b: Uint8Array): Uint8Array {\n  const out = new Uint8Array(a.length + b.length - 1);\n  for (let i = 0; i < a.length; i++) {\n    const coeff = a[i]!;\n    if (coeff === 0) continue;\n    for (let j = 0; j < b.length; j++) {\n      out[i + j]! ^= gfMul(coeff, b[j]!);\n    }\n  }\n  return out;\n}\n\n/**\n * XORs `scale · x^shift · addend` into `target`, in place. Terms that would\n * land beyond the end of `target` are dropped.\n */\nexport function polyMulAddInto(\n  target: Uint8Array,\n  addend: Uint8Array,\n  scale: number,\n  shift: number,\n): void {\n  const limit = Math.min(addend.length, target.length - shift);\n  for (let i = 0; i < limit; i++) {\n    target[i + shift]! ^= gfMul(scale, addend[i]!);\n  }\n}\n","import { DecodeError } from '../errors.js';\nimport { alphaPow, gfDiv, gfMul, polyEval, polyMulAddInto } from './gf256.js';\n\n/**\n * Reed–Solomon error correction for QR blocks over GF(256). QR codewords are\n * encoded with generator roots α^0 … α^(ecCount−1) (ISO/IEC 18004 §8.5.2);\n * decoding here follows the classic textbook pipeline — Berlekamp–Massey for\n * the error-locator polynomial, a Chien search for its roots, and Forney's\n * formula for the error magnitudes (see Lin & Costello, \"Error Control\n * Coding\", ch. 7, or Blahut, \"Algebraic Codes for Data Transmission\").\n *\n * All polynomials are ascending-degree Uint8Arrays (see gf256.ts). The\n * received block itself is the usual wire order: codewords[0] carries the\n * highest power of x.\n */\n\n/**\n * Corrects up to ⌊ecCount/2⌋ codeword errors in place and returns how many\n * were corrected. Throws DecodeError('reed-solomon') when the block is\n * uncorrectable.\n */\nexport function rsCorrect(codewords: Uint8Array, ecCount: number): number {\n  const length = codewords.length;\n\n  // Syndromes S_j = R(α^j) for j = 0 … ecCount−1, stored ascending in j.\n  const syndromes = new Uint8Array(ecCount);\n  let damaged = false;\n  for (let j = 0; j < ecCount; j++) {\n    const point = alphaPow(j);\n    let acc = 0;\n    for (let i = 0; i < length; i++) {\n      acc = gfMul(acc, point) ^ codewords[i]!;\n    }\n    syndromes[j] = acc;\n    if (acc !== 0) damaged = true;\n  }\n  if (!damaged) return 0;\n\n  const locator = berlekampMassey(syndromes);\n  const errorCount = locatorDegree(locator);\n  if (2 * errorCount > ecCount) {\n    throw new DecodeError('reed-solomon', 'block damage exceeds correction capacity');\n  }\n\n  // Chien search: an error at degree k of R(x) makes α^−k a root of Λ.\n  const errorDegrees: number[] = [];\n  for (let k = 0; k < length; k++) {\n    if (polyEval(locator, alphaPow(-k)) === 0) errorDegrees.push(k);\n  }\n  if (errorDegrees.length !== errorCount) {\n    throw new DecodeError('reed-solomon', 'could not locate all codeword errors');\n  }\n\n  // Forney: Ω(x) = S(x)·Λ(x) mod x^ecCount, then the magnitude of the error\n  // with locator X = α^k is X · Ω(X⁻¹) / Λ′(X⁻¹) (first generator root is\n  // α^0, so the X^(1−b) factor reduces to X).\n  const evaluator = new Uint8Array(ecCount);\n  for (let i = 0; i < locator.length; i++) {\n    if (locator[i] !== 0) polyMulAddInto(evaluator, syndromes, locator[i]!, i);\n  }\n\n  for (const k of errorDegrees) {\n    const inverse = alphaPow(-k);\n    // Λ′ keeps only Λ's odd-degree terms (formal derivative in char 2).\n    let slope = 0;\n    for (let i = 1; i < locator.length; i += 2) {\n      if (locator[i] !== 0) slope ^= gfMul(locator[i]!, alphaPow(-k * (i - 1)));\n    }\n    if (slope === 0) {\n      throw new DecodeError('reed-solomon', 'inconsistent error location in block');\n    }\n    const magnitude = gfMul(alphaPow(k), gfDiv(polyEval(evaluator, inverse), slope));\n    codewords[length - 1 - k]! ^= magnitude;\n  }\n  return errorCount;\n}\n\n// #region snippet: reed-solomon\n/**\n * Berlekamp–Massey: returns the shortest LFSR (as the connection polynomial\n * Λ, ascending degree, Λ(0) = 1) that generates the syndrome sequence.\n */\nfunction berlekampMassey(syndromes: Uint8Array): Uint8Array {\n  const rounds = syndromes.length;\n  const current = new Uint8Array(rounds + 1); // Λ under construction\n  let fallback = new Uint8Array(rounds + 1); // copy of Λ from the last length change\n  current[0] = 1;\n  fallback[0] = 1;\n  let lfsrLength = 0;\n  let sinceChange = 1; // rounds elapsed since `fallback` was taken\n  let changeDelta = 1; // discrepancy observed at that change\n\n  for (let round = 0; round < rounds; round++) {\n    let delta = syndromes[round]!;\n    for (let i = 1; i <= lfsrLength; i++) {\n      delta ^= gfMul(current[i]!, syndromes[round - i]!);\n    }\n    if (delta === 0) {\n      sinceChange++;\n      continue;\n    }\n    const grows = 2 * lfsrLength <= round;\n    const snapshot = grows ? current.slice() : undefined;\n    polyMulAddInto(current, fallback, gfDiv(delta, changeDelta), sinceChange);\n    if (grows) {\n      lfsrLength = round + 1 - lfsrLength;\n      fallback = snapshot!;\n      changeDelta = delta;\n      sinceChange = 1;\n    } else {\n      sinceChange++;\n    }\n  }\n  return current.subarray(0, lfsrLength + 1);\n}\n// #endregion snippet\n\n/** Actual degree of Λ (highest non-zero coefficient). */\nfunction locatorDegree(locator: Uint8Array): number {\n  for (let i = locator.length - 1; i > 0; i--) {\n    if (locator[i] !== 0) return i;\n  }\n  return 0;\n}\n","import { DecodeError } from '../errors.js';\nimport type { ErrorCorrectionLevel } from '../types.js';\nimport type { BitMatrix } from './bit-matrix.js';\nimport { buildFunctionPatternMap } from './function-pattern.js';\nimport { maskBit } from './mask.js';\nimport { rsCorrect } from './reed-solomon.js';\nimport { getVersionInfo } from './version.js';\n\n/**\n * Reads the raw codeword stream out of a sampled symbol (ISO/IEC 18004\n * §8.7.3): modules are visited in two-module-wide column bands, right to\n * left, alternating bottom-up and top-down. The vertical timing column is\n * simply absent from the visit order, function modules are skipped, and each\n * data bit is unmasked as it is read. Remainder bits (fewer than 8 left over)\n * are discarded per the spec.\n */\n// #region snippet: zigzag\nexport function readCodewords(matrix: BitMatrix, version: number, mask: number): Uint8Array {\n  const size = matrix.size;\n  const functionModules = buildFunctionPatternMap(version);\n\n  // Column x-coordinates in visit order: right to left, without the vertical\n  // timing column at x = 6. The remaining count is even, so consecutive\n  // entries pair up into the two-module bands.\n  const columns: number[] = [];\n  for (let x = size - 1; x >= 0; x--) {\n    if (x !== 6) columns.push(x);\n  }\n\n  const bytes: number[] = [];\n  let acc = 0;\n  let bitCount = 0;\n  const visit = (x: number, y: number): void => {\n    if (functionModules.get(x, y)) return;\n    const bit = matrix.get(x, y) !== maskBit(mask, y, x);\n    acc = (acc << 1) | (bit ? 1 : 0);\n    if (++bitCount === 8) {\n      bytes.push(acc);\n      acc = 0;\n      bitCount = 0;\n    }\n  };\n\n  for (let band = 0; band < columns.length; band += 2) {\n    const rightX = columns[band]!;\n    const leftX = columns[band + 1]!;\n    const upward = (band & 2) === 0;\n    for (let step = 0; step < size; step++) {\n      const y = upward ? size - 1 - step : step;\n      visit(rightX, y);\n      visit(leftX, y);\n    }\n  }\n  return Uint8Array.from(bytes);\n}\n// #endregion snippet\n\n/**\n * Undoes the block interleaving of §8.6, error-corrects each block, and\n * concatenates the data codewords. Block shapes come straight from the\n * version's EC table: an array of per-block data lengths (all blocks share\n * one EC length), indexed round-robin — no special casing of short vs long\n * blocks.\n */\nexport function correctAndExtractData(\n  raw: Uint8Array,\n  version: number,\n  level: ErrorCorrectionLevel,\n): { bytes: Uint8Array; blocks: number; codewordsCorrected: number } {\n  const { ecCodewordsPerBlock, groups } = getVersionInfo(version).ecBlocks[level];\n\n  const dataLengths: number[] = [];\n  for (const group of groups) {\n    for (let i = 0; i < group.count; i++) dataLengths.push(group.dataCodewords);\n  }\n  const blockCount = dataLengths.length;\n  const totalData = dataLengths.reduce((sum, len) => sum + len, 0);\n  const totalCodewords = totalData + blockCount * ecCodewordsPerBlock;\n  if (raw.length !== totalCodewords) {\n    throw new DecodeError(\n      'codewords',\n      `read ${raw.length} codewords, version ${version}${level} carries ${totalCodewords}`,\n    );\n  }\n\n  // Interleaving sends codeword i of every block before codeword i+1 of any;\n  // blocks whose data section has already ended just sit a round out. EC\n  // codewords follow the same rotation after all data.\n  const blocks = dataLengths.map((len) => new Uint8Array(len + ecCodewordsPerBlock));\n  let cursor = 0;\n  const longestData = Math.max(...dataLengths);\n  for (let round = 0; round < longestData; round++) {\n    for (let b = 0; b < blockCount; b++) {\n      if (round < dataLengths[b]!) blocks[b]![round] = raw[cursor++]!;\n    }\n  }\n  for (let round = 0; round < ecCodewordsPerBlock; round++) {\n    for (let b = 0; b < blockCount; b++) {\n      blocks[b]![dataLengths[b]! + round] = raw[cursor++]!;\n    }\n  }\n\n  const bytes = new Uint8Array(totalData);\n  let codewordsCorrected = 0;\n  let offset = 0;\n  for (let b = 0; b < blockCount; b++) {\n    codewordsCorrected += rsCorrect(blocks[b]!, ecCodewordsPerBlock);\n    bytes.set(blocks[b]!.subarray(0, dataLengths[b]!), offset);\n    offset += dataLengths[b]!;\n  }\n  return { bytes, blocks: blockCount, codewordsCorrected };\n}\n","/**\n * BCH encoding/decoding for the QR format and version information fields.\n * Both fields are short enough that decoding is a minimum-Hamming-distance\n * search over the full table of valid codewords.\n */\n\n/** Remainder of value·x^degree(poly−1) divided by the generator polynomial. */\nexport function bchRemainder(value: number, generator: number): number {\n  const generatorDegree = 31 - Math.clz32(generator);\n  let remainder = value << generatorDegree;\n  while (31 - Math.clz32(remainder) >= generatorDegree && remainder !== 0) {\n    remainder ^= generator << (31 - Math.clz32(remainder) - generatorDegree);\n  }\n  return remainder;\n}\n\nconst FORMAT_GENERATOR = 0x537; // x^10 + x^8 + x^5 + x^4 + x^2 + x + 1\nconst FORMAT_MASK = 0x5412;\nconst VERSION_GENERATOR = 0x1f25; // x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1\n\n/** 15-bit masked format codeword for a 5-bit (ecBits<<3 | mask) value. */\nexport function encodeFormatInfo(data: number): number {\n  return ((data << 10) | bchRemainder(data, FORMAT_GENERATOR)) ^ FORMAT_MASK;\n}\n\n/** 18-bit version codeword for a 6-bit version number (7..40). */\nexport function encodeVersionInfo(version: number): number {\n  return (version << 12) | bchRemainder(version, VERSION_GENERATOR);\n}\n\nfunction hammingDistance(a: number, b: number): number {\n  let x = a ^ b;\n  let count = 0;\n  while (x !== 0) {\n    x &= x - 1;\n    count++;\n  }\n  return count;\n}\n\n/**\n * Nearest-codeword decode over one or two independent readings of the same\n * field. A candidate's distance is its distance to the *better-preserved*\n * reading, so a clean copy can never be shadowed by a copy damaged into the\n * neighborhood of a different codeword; ties fall to the summed distance.\n * Returns the data value within maxDistance bits, or null when nothing is\n * close enough.\n */\nfunction decodeNearest(\n  bits: number,\n  secondBits: number | null,\n  candidates: ReadonlyArray<readonly [data: number, codeword: number]>,\n  maxDistance: number,\n): number | null {\n  let bestData: number | null = null;\n  let bestNearest = maxDistance + 1;\n  let bestTotal = Number.POSITIVE_INFINITY;\n  for (const [data, codeword] of candidates) {\n    const first = hammingDistance(bits, codeword);\n    const second = secondBits === null ? first : hammingDistance(secondBits, codeword);\n    const nearest = Math.min(first, second);\n    const total = first + second;\n    if (nearest < bestNearest || (nearest === bestNearest && total < bestTotal)) {\n      bestNearest = nearest;\n      bestTotal = total;\n      bestData = data;\n    }\n  }\n  return bestNearest <= maxDistance ? bestData : null;\n}\n\nconst FORMAT_TABLE: ReadonlyArray<readonly [number, number]> = Array.from(\n  { length: 32 },\n  (_, data) => [data, encodeFormatInfo(data)] as const,\n);\n\nconst VERSION_TABLE: ReadonlyArray<readonly [number, number]> = Array.from(\n  { length: 34 },\n  (_, i) => [i + 7, encodeVersionInfo(i + 7)] as const,\n);\n\n/**\n * Decodes 15 read format bits to (ecBits<<3 | mask), correcting up to 3 bit\n * errors in the better-preserved of the given copies. Returns null when\n * uncorrectable.\n */\nexport function decodeFormatBits(bits: number, secondBits?: number): number | null {\n  return decodeNearest(bits, secondBits ?? null, FORMAT_TABLE, 3);\n}\n\n/**\n * Decodes 18 read version bits to a version number 7..40, correcting up to\n * 3 bit errors in the better-preserved of the given copies. Returns null\n * when uncorrectable.\n */\nexport function decodeVersionBits(bits: number, secondBits?: number): number | null {\n  return decodeNearest(bits, secondBits ?? null, VERSION_TABLE, 3);\n}\n","import { DecodeError } from '../errors.js';\nimport type { ErrorCorrectionLevel } from '../types.js';\nimport { decodeFormatBits, decodeVersionBits } from './bch.js';\nimport type { BitMatrix } from './bit-matrix.js';\n\nexport interface FormatInformation {\n  errorCorrectionLevel: ErrorCorrectionLevel;\n  mask: number;\n}\n\n// Format field EC bits (ISO/IEC 18004 §8.9): L=01, M=00, Q=11, H=10.\nconst EC_LEVELS: ErrorCorrectionLevel[] = ['M', 'L', 'H', 'Q'];\n\n// #region snippet: format-info\n/**\n * Reads and decodes the format information from its two redundant placements\n * jointly, correcting up to 3 bit errors in the better-preserved copy — a\n * copy damaged toward a different valid codeword cannot shadow a clean one.\n */\nexport function readFormatInformation(matrix: BitMatrix): FormatInformation {\n  const size = matrix.size;\n  const bit = (x: number, y: number) => (matrix.get(x, y) ? 1 : 0);\n\n  // Copy 1: around the top-left finder pattern, MSB first.\n  let bits1 = 0;\n  for (let x = 0; x <= 5; x++) bits1 = (bits1 << 1) | bit(x, 8);\n  bits1 = (bits1 << 1) | bit(7, 8);\n  bits1 = (bits1 << 1) | bit(8, 8);\n  bits1 = (bits1 << 1) | bit(8, 7);\n  for (let y = 5; y >= 0; y--) bits1 = (bits1 << 1) | bit(8, y);\n\n  // Copy 2: split between below the top-right finder and right of the\n  // bottom-left finder.\n  let bits2 = 0;\n  for (let y = size - 1; y >= size - 7; y--) bits2 = (bits2 << 1) | bit(8, y);\n  for (let x = size - 8; x < size; x++) bits2 = (bits2 << 1) | bit(x, 8);\n\n  const data = decodeFormatBits(bits1, bits2);\n  if (data === null) {\n    throw new DecodeError('format-info', 'format information is unreadable');\n  }\n  return {\n    errorCorrectionLevel: EC_LEVELS[(data >> 3) & 0b11]!,\n    mask: data & 0b111,\n  };\n}\n// #endregion snippet\n\n/**\n * Reads and decodes the version information blocks (versions 7+) jointly,\n * correcting up to 3 bit errors in the better-preserved copy. Returns null\n * when both copies are unreadable.\n */\nexport function readVersionInformation(matrix: BitMatrix): number | null {\n  const size = matrix.size;\n  const bit = (x: number, y: number) => (matrix.get(x, y) ? 1 : 0);\n\n  // Both 6×3 blocks store bit 0 (LSB) first in placement order; read them\n  // back MSB-first by walking the block in reverse.\n  let bits1 = 0; // bottom-left block: columns 0..5, rows size-11..size-9\n  for (let x = 5; x >= 0; x--) {\n    for (let y = size - 9; y >= size - 11; y--) bits1 = (bits1 << 1) | bit(x, y);\n  }\n  let bits2 = 0; // top-right block: transposed layout of the first\n  for (let y = 5; y >= 0; y--) {\n    for (let x = size - 9; x >= size - 11; x--) bits2 = (bits2 << 1) | bit(x, y);\n  }\n\n  return decodeVersionBits(bits1, bits2);\n}\n","import { DecodeError } from '../errors.js';\n\n/** MSB-first bit reader over a byte array. */\nexport class BitReader {\n  private byteOffset = 0;\n  private bitOffset = 0;\n\n  constructor(private readonly bytes: Uint8Array) {}\n\n  available(): number {\n    return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset;\n  }\n\n  read(numBits: number): number {\n    if (numBits < 1 || numBits > 32) {\n      throw new RangeError(`cannot read ${numBits} bits at once`);\n    }\n    // Exhaustion is a data error, not a caller bug: a miscorrected block can\n    // put arbitrary counts in front of too few payload bits, and that must\n    // surface as an undecodable symbol rather than escape decode().\n    if (numBits > this.available()) {\n      throw new DecodeError(\n        'bitstream',\n        `bitstream exhausted: needed ${numBits} bits, ${this.available()} available`,\n      );\n    }\n    let result = 0;\n    let remaining = numBits;\n    while (remaining > 0) {\n      const bitsLeftInByte = 8 - this.bitOffset;\n      const toRead = Math.min(remaining, bitsLeftInByte);\n      const shift = bitsLeftInByte - toRead;\n      const mask = ((1 << toRead) - 1) << shift;\n      result = (result << toRead) | ((this.bytes[this.byteOffset]! & mask) >> shift);\n      remaining -= toRead;\n      this.bitOffset += toRead;\n      if (this.bitOffset === 8) {\n        this.bitOffset = 0;\n        this.byteOffset++;\n      }\n    }\n    return result;\n  }\n}\n","import { DecodeError } from '../errors.js';\nimport type { Fnc1, Segment, StructuredAppend } from '../types.js';\nimport { BitReader } from './bitstream.js';\n\nconst MODE_TERMINATOR = 0b0000;\nconst MODE_NUMERIC = 0b0001;\nconst MODE_ALPHANUMERIC = 0b0010;\nconst MODE_STRUCTURED_APPEND = 0b0011;\nconst MODE_BYTE = 0b0100;\nconst MODE_FNC1_FIRST = 0b0101;\nconst MODE_ECI = 0b0111;\nconst MODE_KANJI = 0b1000;\nconst MODE_FNC1_SECOND = 0b1001;\n\nconst ALPHANUMERIC_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Character count indicator width per mode and version (§8.4). */\nfunction countBits(mode: number, version: number): number {\n  const index = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n  switch (mode) {\n    case MODE_NUMERIC:\n      return [10, 12, 14][index]!;\n    case MODE_ALPHANUMERIC:\n      return [9, 11, 13][index]!;\n    case MODE_BYTE:\n      return [8, 16, 16][index]!;\n    case MODE_KANJI:\n      return [8, 10, 12][index]!;\n    default:\n      throw new DecodeError('bitstream', `no count field for mode ${mode}`);\n  }\n}\n\n/**\n * Maps ECI assignment numbers (AIM ITS/04-023, the table ISO/IEC 18004\n * references) to TextDecoder labels. Assignments 4–18 are the ISO-8859\n * series offset by two (14 and 19 are unassigned); the rest are enumerated.\n * Unknown assignments fall back to the UTF-8 → ISO-8859-1 heuristic.\n */\nfunction eciLabel(assignment: number): string | null {\n  if (assignment >= 4 && assignment <= 18 && assignment !== 14) {\n    return `iso-8859-${assignment - 2}`;\n  }\n  switch (assignment) {\n    case 1:\n    case 3:\n      return 'iso-8859-1';\n    case 20:\n      return 'shift_jis';\n    case 21:\n      return 'windows-1250';\n    case 22:\n      return 'windows-1251';\n    case 23:\n      return 'windows-1252';\n    case 24:\n      return 'windows-1256';\n    case 25:\n      return 'utf-16be';\n    case 26:\n      return 'utf-8';\n    case 27:\n    case 170:\n      return 'ascii';\n    case 28:\n      return 'big5';\n    case 29:\n      return 'gb18030';\n    case 30:\n      return 'euc-kr';\n    default:\n      return null;\n  }\n}\n\n/**\n * Decodes byte-mode payload bytes to text. With no ECI in effect, applies the\n * de-facto standard heuristic: strict UTF-8 first, ISO-8859-1 fallback.\n */\nfunction decodeBytes(bytes: Uint8Array, eci: number | null): string {\n  if (eci !== null) {\n    const label = eciLabel(eci);\n    if (label !== null) {\n      try {\n        return new TextDecoder(label).decode(bytes);\n      } catch {\n        // Unknown label at runtime — fall through to the heuristic.\n      }\n    }\n  }\n  try {\n    return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n  } catch {\n    return new TextDecoder('iso-8859-1').decode(bytes);\n  }\n}\n\n// #region snippet: segments\nfunction decodeNumeric(reader: BitReader, count: number): string {\n  let result = '';\n  let remaining = count;\n  while (remaining >= 3) {\n    const value = reader.read(10);\n    if (value >= 1000) throw new DecodeError('bitstream', 'invalid numeric triple');\n    result += value.toString().padStart(3, '0');\n    remaining -= 3;\n  }\n  if (remaining === 2) {\n    const value = reader.read(7);\n    if (value >= 100) throw new DecodeError('bitstream', 'invalid numeric pair');\n    result += value.toString().padStart(2, '0');\n  } else if (remaining === 1) {\n    const value = reader.read(4);\n    if (value >= 10) throw new DecodeError('bitstream', 'invalid numeric digit');\n    result += value.toString();\n  }\n  return result;\n}\n// #endregion snippet\n\n/**\n * Decodes a Kanji segment: 13-bit packed values → Shift-JIS byte pairs\n * (§8.4.7: ranges 0x8140–0x9FFC and 0xE040–0xEBBF, offset by 0x8140 and\n * 0xC140 respectively).\n */\nfunction decodeKanjiBytes(reader: BitReader, count: number): Uint8Array {\n  const bytes = new Uint8Array(count * 2);\n  for (let i = 0; i < count; i++) {\n    const value = reader.read(13);\n    const assembled = (Math.floor(value / 0xc0) << 8) | (value % 0xc0);\n    const shiftJis = assembled + (assembled + 0x8140 <= 0x9ffc ? 0x8140 : 0xc140);\n    bytes[i * 2] = shiftJis >> 8;\n    bytes[i * 2 + 1] = shiftJis & 0xff;\n  }\n  return bytes;\n}\n\nfunction decodeShiftJis(bytes: Uint8Array): string {\n  try {\n    return new TextDecoder('shift_jis').decode(bytes);\n  } catch {\n    throw new DecodeError('unsupported-mode', 'no Shift-JIS decoder available in this runtime');\n  }\n}\n\n/**\n * In an FNC1 symbol, \"%\" in alphanumeric segments is an escape: \"%%\" is a\n * literal percent, a lone \"%\" is the GS separator (0x1D).\n */\nfunction applyFnc1Escapes(text: string): string {\n  return text.replace(/%%|%/g, (match) => (match === '%%' ? '%' : '\\x1d'));\n}\n\nfunction decodeAlphanumeric(reader: BitReader, count: number): string {\n  let result = '';\n  let remaining = count;\n  while (remaining >= 2) {\n    const value = reader.read(11);\n    if (value >= 45 * 45) throw new DecodeError('bitstream', 'invalid alphanumeric pair');\n    result += ALPHANUMERIC_CHARS[Math.floor(value / 45)]! + ALPHANUMERIC_CHARS[value % 45]!;\n    remaining -= 2;\n  }\n  if (remaining === 1) {\n    const value = reader.read(6);\n    if (value >= 45) throw new DecodeError('bitstream', 'invalid alphanumeric character');\n    result += ALPHANUMERIC_CHARS[value]!;\n  }\n  return result;\n}\n\nfunction readEciAssignment(reader: BitReader): number {\n  const first = reader.read(8);\n  if ((first & 0b1000_0000) === 0) return first & 0b0111_1111;\n  if ((first & 0b1100_0000) === 0b1000_0000) {\n    return ((first & 0b0011_1111) << 8) | reader.read(8);\n  }\n  if ((first & 0b1110_0000) === 0b1100_0000) {\n    return ((first & 0b0001_1111) << 16) | reader.read(16);\n  }\n  throw new DecodeError('bitstream', 'invalid ECI designator');\n}\n\nexport interface DecodedStream {\n  text: string;\n  bytes: Uint8Array;\n  segments: Segment[];\n  structuredAppend?: StructuredAppend;\n  fnc1?: Fnc1;\n}\n\n/**\n * Lazily instantiated so merely importing the library never touches the\n * `TextEncoder` global (absent in some jsdom/SSR/edge/RN environments). Only a\n * decode that hits a numeric or alphanumeric segment needs it.\n */\nlet textEncoder: TextEncoder | undefined;\nfunction encodeUtf8(text: string): Uint8Array {\n  textEncoder ??= new TextEncoder();\n  return textEncoder.encode(text);\n}\n\n/** Decodes the mode-segmented data bitstream (§8.4) into text and segments. */\nexport function decodeSegments(data: Uint8Array, version: number): DecodedStream {\n  const reader = new BitReader(data);\n  const segments: Segment[] = [];\n  const byteChunks: Uint8Array[] = [];\n  let text = '';\n  let eci: number | null = null;\n  let structuredAppend: StructuredAppend | undefined;\n  let fnc1: Fnc1 | undefined;\n\n  while (reader.available() >= 4) {\n    const mode = reader.read(4);\n    if (mode === MODE_TERMINATOR) break;\n\n    switch (mode) {\n      case MODE_NUMERIC: {\n        const count = reader.read(countBits(mode, version));\n        const decoded = decodeNumeric(reader, count);\n        segments.push({ mode: 'numeric', text: decoded });\n        text += decoded;\n        byteChunks.push(encodeUtf8(decoded));\n        break;\n      }\n      case MODE_ALPHANUMERIC: {\n        const count = reader.read(countBits(mode, version));\n        let decoded = decodeAlphanumeric(reader, count);\n        if (fnc1 !== undefined) decoded = applyFnc1Escapes(decoded);\n        segments.push({ mode: 'alphanumeric', text: decoded });\n        text += decoded;\n        byteChunks.push(encodeUtf8(decoded));\n        break;\n      }\n      case MODE_BYTE: {\n        const count = reader.read(countBits(mode, version));\n        if (reader.available() < 8 * count) {\n          throw new DecodeError('bitstream', 'byte segment overruns data');\n        }\n        const bytes = new Uint8Array(count);\n        for (let i = 0; i < count; i++) bytes[i] = reader.read(8);\n        const decoded = decodeBytes(bytes, eci);\n        segments.push({ mode: 'byte', bytes, text: decoded });\n        text += decoded;\n        byteChunks.push(bytes);\n        break;\n      }\n      case MODE_ECI: {\n        eci = readEciAssignment(reader);\n        segments.push({ mode: 'eci', assignment: eci });\n        break;\n      }\n      case MODE_STRUCTURED_APPEND: {\n        structuredAppend = {\n          index: reader.read(4),\n          total: reader.read(4) + 1,\n          parity: reader.read(8),\n        };\n        break;\n      }\n      case MODE_FNC1_FIRST: {\n        fnc1 = { position: 'first' };\n        break;\n      }\n      case MODE_FNC1_SECOND: {\n        // Application indicator: a two-digit number as its value, or a\n        // single letter as its ASCII code plus 100.\n        const indicator = reader.read(8);\n        fnc1 = {\n          position: 'second',\n          applicationIndicator:\n            indicator >= 100 && indicator <= 226\n              ? String.fromCharCode(indicator - 100)\n              : String(indicator).padStart(2, '0'),\n        };\n        break;\n      }\n      case MODE_KANJI: {\n        const count = reader.read(countBits(mode, version));\n        if (reader.available() < 13 * count) {\n          throw new DecodeError('bitstream', 'kanji segment overruns data');\n        }\n        const bytes = decodeKanjiBytes(reader, count);\n        const decoded = decodeShiftJis(bytes);\n        segments.push({ mode: 'kanji', bytes, text: decoded });\n        text += decoded;\n        byteChunks.push(bytes);\n        break;\n      }\n      default:\n        throw new DecodeError('bitstream', `unknown mode indicator ${mode}`);\n    }\n  }\n\n  const totalBytes = byteChunks.reduce((sum, c) => sum + c.length, 0);\n  const bytes = new Uint8Array(totalBytes);\n  let offset = 0;\n  for (const chunk of byteChunks) {\n    bytes.set(chunk, offset);\n    offset += chunk.length;\n  }\n\n  const result: DecodedStream = { text, bytes, segments };\n  if (structuredAppend !== undefined) result.structuredAppend = structuredAppend;\n  if (fnc1 !== undefined) result.fnc1 = fnc1;\n  return result;\n}\n","import { DecodeError } from '../errors.js';\nimport type { DecodedMatrix } from '../types.js';\nimport type { BitMatrix } from './bit-matrix.js';\nimport { correctAndExtractData, readCodewords } from './codewords.js';\nimport { readFormatInformation } from './format.js';\nimport { decodeSegments } from './segments.js';\nimport { versionForSize } from './version.js';\n\n/**\n * Decodes a sampled QR bit matrix (true = dark module) into its payload.\n * This is the pure logical half of the scanner: detection/sampling from an\n * image happens upstream and produces the BitMatrix consumed here.\n */\nexport function decodeMatrix(matrix: BitMatrix): DecodedMatrix {\n  const version = versionForSize(matrix.size);\n  if (version === null) {\n    throw new DecodeError('invalid-dimension', `invalid QR matrix size ${matrix.size}`);\n  }\n\n  const { errorCorrectionLevel, mask } = readFormatInformation(matrix);\n  const rawCodewords = readCodewords(matrix, version, mask);\n  const {\n    bytes: data,\n    blocks,\n    codewordsCorrected,\n  } = correctAndExtractData(rawCodewords, version, errorCorrectionLevel);\n  const stream = decodeSegments(data, version);\n\n  const result: DecodedMatrix = {\n    text: stream.text,\n    bytes: stream.bytes,\n    version,\n    errorCorrectionLevel,\n    mask,\n    segments: stream.segments,\n    ecc: { blocks, codewordsCorrected },\n  };\n  if (stream.structuredAppend !== undefined) result.structuredAppend = stream.structuredAppend;\n  if (stream.fnc1 !== undefined) result.fnc1 = stream.fnc1;\n  return result;\n}\n","/** Rectangular 1-bit image; truthy means a dark pixel. */\nexport class BitImage {\n  readonly width: number;\n  readonly height: number;\n  readonly bits: Uint8Array;\n\n  constructor(width: number, height: number, bits?: Uint8Array) {\n    this.width = width;\n    this.height = height;\n    this.bits = bits ?? new Uint8Array(width * height);\n  }\n\n  get(x: number, y: number): boolean {\n    return this.bits[y * this.width + x] !== 0;\n  }\n\n  set(x: number, y: number, value: boolean): void {\n    this.bits[y * this.width + x] = value ? 1 : 0;\n  }\n\n  inverted(): BitImage {\n    const bits = new Uint8Array(this.bits.length);\n    for (let i = 0; i < bits.length; i++) bits[i] = this.bits[i] ? 0 : 1;\n    return new BitImage(this.width, this.height, bits);\n  }\n}\n","import { BitImage } from './bit-image.js';\nimport type { GrayImage } from './grayscale.js';\n\n/**\n * Adaptive thresholding built on an integral image (summed-area table): every\n * pixel is compared against the mean luminance of a sliding square window\n * around it, sized from the frame dimensions. A pixel is dark when it sits\n * clearly below its window mean — which adapts across illumination gradients\n * — or when it is far below the global Otsu threshold, which keeps the\n * inside of large ink regions (finder cores wider than the window) dark.\n * Tiny frames skip the windowing and use the Otsu threshold directly.\n */\n\n/** Frames whose global luminance span is below this are treated as blank. */\nconst FLAT_SPAN = 16;\n/** Frames with a side shorter than this are thresholded globally. */\nconst TINY_SIDE = 48;\n/** Window half-size = shorter side / this divisor (clamped below). */\nconst WINDOW_DIVISOR = 10;\nconst WINDOW_HALF_MIN = 8;\nconst WINDOW_HALF_MAX = 40;\n\nexport function binarize(gray: GrayImage): BitImage {\n  const { luma, width, height } = gray;\n  const out = new BitImage(width, height);\n\n  const tinyFrame = Math.min(width, height) < TINY_SIDE;\n\n  // The histogram drives Otsu, whose optimum is a population statistic; on\n  // frames big enough for the sliding window a quarter of the pixels\n  // characterize it just as well.\n  const histogramStep = tinyFrame ? 1 : 2;\n  const histogram = new Uint32Array(256);\n  let sampled = 0;\n  for (let y = 0; y < height; y += histogramStep) {\n    const row = y * width;\n    for (let x = 0; x < width; x += histogramStep) {\n      histogram[luma[row + x]!]!++;\n      sampled++;\n    }\n  }\n  let darkest = 0;\n  while (darkest < 255 && histogram[darkest] === 0) darkest++;\n  let brightest = 255;\n  while (brightest > 0 && histogram[brightest] === 0) brightest--;\n  // A featureless frame stays all-light rather than amplifying sensor noise.\n  if (brightest - darkest < FLAT_SPAN) return out;\n\n  const global = otsuThreshold(histogram, sampled);\n\n  if (tinyFrame) {\n    for (let i = 0; i < luma.length; i++) {\n      if (luma[i]! < global) out.bits[i] = 1;\n    }\n    return out;\n  }\n\n  // Summed-area table over a 2×2-summed grid, with an implicit zero\n  // row/column at the top/left so any rectangle sum is four lookups. The\n  // window mean only varies at window scale, so half-resolution statistics\n  // are indistinguishable at a quarter of the memory traffic. Uint32 is\n  // exact below ~16.8 MP source pixels (1020 · cells < 2³²); larger frames\n  // fall back to doubles.\n  const gridWidth = width >> 1;\n  const gridHeight = height >> 1;\n  const stride = gridWidth + 1;\n  const sat =\n    width * height < 16_000_000\n      ? new Uint32Array(stride * (gridHeight + 1))\n      : new Float64Array(stride * (gridHeight + 1));\n  for (let gy = 0; gy < gridHeight; gy++) {\n    const rowA = 2 * gy * width;\n    const rowB = rowA + width;\n    const satRow = (gy + 1) * stride;\n    const satAbove = gy * stride;\n    let rowSum = 0;\n    for (let gx = 0; gx < gridWidth; gx++) {\n      const x = 2 * gx;\n      rowSum += luma[rowA + x]! + luma[rowA + x + 1]! + luma[rowB + x]! + luma[rowB + x + 1]!;\n      sat[satRow + gx + 1] = sat[satAbove + gx + 1]! + rowSum;\n    }\n  }\n\n  const half = Math.min(\n    WINDOW_HALF_MAX,\n    Math.max(WINDOW_HALF_MIN, Math.round(Math.min(width, height) / WINDOW_DIVISOR)),\n  );\n  const deepDark = global >> 1;\n  const bits = out.bits;\n\n  // The threshold field varies on the scale of the window, so it is\n  // evaluated once per small tile (a fraction of the window) rather than per\n  // pixel; every pixel in the tile compares against its tile's cut. Window\n  // bounds live in grid (half-resolution) coordinates.\n  const gridHalf = Math.max(2, half >> 1);\n  const tile = Math.max(2, half >> 3);\n  for (let tileY = 0; tileY < height; tileY += tile) {\n    const tileBottom = Math.min(tileY + tile, height);\n    const gridCenterY = (tileY + (tile >> 1)) >> 1;\n    const top = Math.max(0, gridCenterY - gridHalf);\n    const bottom = Math.min(gridHeight, gridCenterY + gridHalf + 1);\n    const satTop = top * stride;\n    const satBottom = bottom * stride;\n    const rowSpan = bottom - top;\n\n    // #region snippet: binarize\n    for (let tileX = 0; tileX < width; tileX += tile) {\n      const tileRight = Math.min(tileX + tile, width);\n      const gridCenterX = (tileX + (tile >> 1)) >> 1;\n      const left = Math.max(0, gridCenterX - gridHalf);\n      const right = Math.min(gridWidth, gridCenterX + gridHalf + 1);\n      const windowSum =\n        sat[satBottom + right]! -\n        sat[satTop + right]! -\n        sat[satBottom + left]! +\n        sat[satTop + left]!;\n      // Dark = 12.5% below the window mean, or deep below the global split.\n      const mean = windowSum / (4 * (right - left) * rowSpan);\n      const cut = Math.max((mean * 7) / 8, deepDark);\n\n      for (let y = tileY; y < tileBottom; y++) {\n        const row = y * width;\n        for (let x = tileX; x < tileRight; x++) {\n          if (luma[row + x]! < cut) bits[row + x] = 1;\n        }\n      }\n    }\n    // #endregion snippet\n  }\n  return out;\n}\n\n/**\n * Otsu's method (1979), from the definition: pick the threshold that\n * maximizes the between-class variance w₀·w₁·(μ₀−μ₁)² of the split. On a\n * clean bimodal histogram every cut through the empty valley scores the\n * same, so the midpoint of the optimal plateau is used.\n */\nfunction otsuThreshold(histogram: Uint32Array, total: number): number {\n  let sumAll = 0;\n  for (let v = 0; v < 256; v++) sumAll += v * histogram[v]!;\n\n  let plateauStart = 127;\n  let plateauEnd = 127;\n  let bestSpread = -1;\n  let countBelow = 0;\n  let sumBelow = 0;\n  for (let t = 0; t < 256; t++) {\n    countBelow += histogram[t]!;\n    if (countBelow === 0) continue;\n    const countAbove = total - countBelow;\n    if (countAbove === 0) break;\n    sumBelow += t * histogram[t]!;\n    const gap = sumBelow / countBelow - (sumAll - sumBelow) / countAbove;\n    const spread = countBelow * countAbove * gap * gap;\n    if (spread > bestSpread) {\n      bestSpread = spread;\n      plateauStart = t;\n      plateauEnd = t;\n    } else if (spread === bestSpread) {\n      plateauEnd = t;\n    }\n  }\n  return ((plateauStart + plateauEnd) >> 1) + 1;\n}\n","import type { Point } from '../types.js';\nimport type { BitImage } from './bit-image.js';\n\n/**\n * Alignment-pattern search (ISO/IEC 18004 §7.3.5): the pattern is a 5×5\n * square whose central row reads dark–light–dark with every run one module\n * wide. Rows of a bounded window around the predicted position are\n * run-length scanned for that signature; hits are confirmed by the same\n * measurement turned vertical, and the confirmed center closest to the\n * prediction wins.\n */\n\n/** Accepted summed relative deviation from the 1:1:1 profile. */\nconst CORE_CUTOFF = 0.45;\n\n/**\n * Finds the alignment-pattern center near `expected`, searching a square\n * window of ±radius modules. Returns null when nothing convincing is there.\n */\nexport function findAlignmentPattern(\n  image: BitImage,\n  expected: Point,\n  moduleSize: number,\n  radiusModules: number,\n): Point | null {\n  const radius = Math.max(2, Math.round(radiusModules * moduleSize));\n  const left = Math.max(0, Math.round(expected.x - radius));\n  const right = Math.min(image.width - 1, Math.round(expected.x + radius));\n  const top = Math.max(0, Math.round(expected.y - radius));\n  const bottom = Math.min(image.height - 1, Math.round(expected.y + radius));\n  if (right - left < 2 || bottom - top < 2) return null;\n\n  let best: Point | null = null;\n  let bestOffset = Number.POSITIVE_INFINITY;\n\n  for (let y = top; y <= bottom; y++) {\n    // Dark runs inside the window row, tracked as [start, end).\n    let x = left;\n    while (x <= right) {\n      if (!image.get(x, y)) {\n        x++;\n        continue;\n      }\n      const darkStart = x;\n      while (x <= right + 1 && x < image.width && image.get(x, y)) x++;\n      const darkEnd = x;\n\n      const center = coreMatches(image, darkStart, darkEnd, y, moduleSize);\n      if (center === null) continue;\n\n      const refined = confirmColumn(image, Math.floor(center), y, moduleSize);\n      if (refined === null) continue;\n\n      const offset = Math.hypot(center - expected.x, refined - expected.y);\n      if (offset < bestOffset) {\n        bestOffset = offset;\n        best = { x: center, y: refined };\n      }\n    }\n  }\n  return best;\n}\n\n/**\n * Checks that a dark run and its flanking light runs form a plausible\n * module-sized 1:1:1 core; returns the dark run's midpoint on success.\n */\nfunction coreMatches(\n  image: BitImage,\n  darkStart: number,\n  darkEnd: number,\n  y: number,\n  moduleSize: number,\n): number | null {\n  const dark = darkEnd - darkStart;\n  let lightLeft = 0;\n  for (let x = darkStart - 1; x >= 0 && !image.get(x, y); x--) lightLeft++;\n  let lightRight = 0;\n  for (let x = darkEnd; x < image.width && !image.get(x, y); x++) lightRight++;\n  if (lightLeft === 0 || lightRight === 0) return null;\n  // The ring is one module; runs beyond one module mean this is not the core.\n  const clampedLeft = Math.min(lightLeft, moduleSize * 2);\n  const clampedRight = Math.min(lightRight, moduleSize * 2);\n  const score =\n    (Math.abs(dark - moduleSize) +\n      Math.abs(clampedLeft - moduleSize) +\n      Math.abs(clampedRight - moduleSize)) /\n    (3 * moduleSize);\n  return score <= CORE_CUTOFF ? (darkStart + darkEnd) / 2 : null;\n}\n\n/** Vertical version of the core check through (x, y); returns center y. */\nfunction confirmColumn(image: BitImage, x: number, y: number, moduleSize: number): number | null {\n  if (!image.get(x, y)) return null;\n  const height = image.height;\n  let top = y;\n  while (top >= 0 && image.get(x, top)) top--;\n  let bottom = y + 1;\n  while (bottom < height && image.get(x, bottom)) bottom++;\n  const dark = bottom - top - 1;\n\n  let lightAbove = 0;\n  for (let yy = top; yy >= 0 && !image.get(x, yy); yy--) lightAbove++;\n  let lightBelow = 0;\n  for (let yy = bottom; yy < height && !image.get(x, yy); yy++) lightBelow++;\n  if (lightAbove === 0 || lightBelow === 0) return null;\n\n  const clampedAbove = Math.min(lightAbove, moduleSize * 2);\n  const clampedBelow = Math.min(lightBelow, moduleSize * 2);\n  const score =\n    (Math.abs(dark - moduleSize) +\n      Math.abs(clampedAbove - moduleSize) +\n      Math.abs(clampedBelow - moduleSize)) /\n    (3 * moduleSize);\n  return score <= CORE_CUTOFF ? (top + 1 + bottom) / 2 : null;\n}\n","import type { BitImage } from './bit-image.js';\n\n/**\n * Finder-pattern location. Each scan row is run-length encoded and every\n * five-run dark window is tested against the 1:1:3:1:1 profile of ISO/IEC\n * 18004 §7.3.2 using a summed relative-deviation score. Horizontal hits are\n * confirmed by measuring the same profile vertically through the candidate\n * center, and confirmed sightings accumulate into clusters whose centroids\n * become the reported patterns. Triples of patterns are ranked by how well\n * they form the right-isosceles corner layout of a QR symbol.\n */\n\n/** A confirmed 1:1:3:1:1 finder-pattern center in image coordinates. */\nexport interface FinderPattern {\n  x: number;\n  y: number;\n  moduleSize: number;\n  /** Number of scan rows that confirmed this center. */\n  count: number;\n}\n\n/** A finder triple arranged as the corners of an upright symbol. */\nexport interface OrderedPatterns {\n  topLeft: FinderPattern;\n  topRight: FinderPattern;\n  bottomLeft: FinderPattern;\n}\n\n/**\n * Largest accepted profile score: the summed absolute deviation of the five\n * runs from ideal 1:1:3:1:1, as a fraction of the total width.\n */\nconst PROFILE_CUTOFF = 0.25;\n/** Horizontal and vertical module estimates may differ by this factor. */\nconst AXIS_AGREEMENT = 1.6;\n/** Sightings required before a cluster counts as a pattern. */\nconst MIN_SIGHTINGS = 2;\n/** Candidate pool size for triple ranking (strongest clusters first). */\nconst RANKING_POOL = 12;\n\ninterface Cluster {\n  sumX: number;\n  sumY: number;\n  sumModule: number;\n  count: number;\n}\n\n/** Scans the whole image and returns every plausible finder-pattern center. */\nexport function findFinderPatterns(image: BitImage): FinderPattern[] {\n  const clusters: Cluster[] = [];\n  const boundaries: number[] = [];\n  for (let y = 0; y < image.height; y++) {\n    scanRow(image, y, boundaries, clusters);\n  }\n  const patterns: FinderPattern[] = [];\n  for (const cluster of clusters) {\n    if (cluster.count < MIN_SIGHTINGS) continue;\n    patterns.push({\n      x: cluster.sumX / cluster.count,\n      y: cluster.sumY / cluster.count,\n      moduleSize: cluster.sumModule / cluster.count,\n      count: cluster.count,\n    });\n  }\n  return patterns;\n}\n\n/** Best triple of the candidate set, or null when none forms a symbol. */\nexport function selectBestPatterns(patterns: FinderPattern[]): OrderedPatterns | null {\n  return rankTriples(patterns)[0] ?? null;\n}\n\n/** All plausible triples, best-scoring first. */\nexport function rankTriples(patterns: FinderPattern[]): OrderedPatterns[] {\n  if (patterns.length < 3) return [];\n  const pool = [...patterns]\n    .sort((a, b) => b.count * b.moduleSize - a.count * a.moduleSize)\n    .slice(0, RANKING_POOL);\n\n  const scored: Array<{ score: number; ordered: OrderedPatterns }> = [];\n  for (let i = 0; i < pool.length; i++) {\n    for (let j = i + 1; j < pool.length; j++) {\n      for (let k = j + 1; k < pool.length; k++) {\n        const ordered = orderAsCorners(pool[i]!, pool[j]!, pool[k]!);\n        const score = tripleScore(ordered);\n        if (score !== null) scored.push({ score, ordered });\n      }\n    }\n  }\n  scored.sort((a, b) => a.score - b.score);\n  return scored.map((entry) => entry.ordered);\n}\n\n/**\n * Run-length encodes one row and feeds every dark 5-run window through the\n * profile check plus vertical confirmation.\n */\nfunction scanRow(image: BitImage, y: number, boundaries: number[], clusters: Cluster[]): void {\n  const width = image.width;\n  const rowBits = image.bits.subarray(y * width, (y + 1) * width);\n  boundaries.length = 0;\n  boundaries.push(0);\n  let previous = rowBits[0]!;\n  const rowStartsDark = previous !== 0;\n  for (let x = 1; x < width; x++) {\n    const bit = rowBits[x]!;\n    if (bit !== previous) {\n      boundaries.push(x);\n      previous = bit;\n    }\n  }\n  boundaries.push(width);\n\n  const runCount = boundaries.length - 1;\n  const firstDark = rowStartsDark ? 0 : 1;\n  for (let run = firstDark; run + 5 <= runCount; run += 2) {\n    const b0 = boundaries[run]!;\n    const b1 = boundaries[run + 1]!;\n    const b2 = boundaries[run + 2]!;\n    const b3 = boundaries[run + 3]!;\n    const b4 = boundaries[run + 4]!;\n    const b5 = boundaries[run + 5]!;\n    if (profileScore(b1 - b0, b2 - b1, b3 - b2, b4 - b3, b5 - b4) > PROFILE_CUTOFF) continue;\n\n    const centerX = (b2 + b3) / 2;\n    const horizontalSpan = b5 - b0;\n    // A stray light pixel in the walked column would sink the whole\n    // candidate, so nearby columns get a chance too.\n    let confirmed: { centerY: number; span: number } | null = null;\n    for (const jitter of [0, -1, 1, -2, 2]) {\n      confirmed = confirmVertically(image, Math.floor(centerX) + jitter, y, horizontalSpan);\n      if (confirmed !== null) break;\n    }\n    if (confirmed === null) continue;\n\n    const moduleSize = (horizontalSpan + confirmed.span) / 14;\n    recordSighting(clusters, centerX, confirmed.centerY, moduleSize);\n  }\n}\n\n// #region snippet: finder-profile\n/**\n * Relative deviation of five run lengths from 1:1:3:1:1 — the sum of\n * per-run absolute errors against a shared unit of total/7, normalized by\n * the total. 0 is a perfect match.\n */\nfunction profileScore(a: number, b: number, c: number, d: number, e: number): number {\n  const total = a + b + c + d + e;\n  if (total < 7) return Number.POSITIVE_INFINITY;\n  const unit = total / 7;\n  const deviation =\n    Math.abs(a - unit) +\n    Math.abs(b - unit) +\n    Math.abs(c - 3 * unit) +\n    Math.abs(d - unit) +\n    Math.abs(e - unit);\n  return deviation / total;\n}\n// #endregion snippet\n\n/**\n * Measures the five vertical runs through (x, y) — center dark run plus the\n * light and dark runs above and below it — and accepts when they match the\n * profile and roughly agree with the horizontal measurement.\n */\nfunction confirmVertically(\n  image: BitImage,\n  x: number,\n  y: number,\n  horizontalSpan: number,\n): { centerY: number; span: number } | null {\n  if (!image.get(x, y)) return null;\n  const height = image.height;\n\n  // Walk up from y (inclusive) and down from y+1 through dark/light/dark.\n  let top = y;\n  while (top >= 0 && image.get(x, top)) top--;\n  let lightTop = top;\n  while (lightTop >= 0 && !image.get(x, lightTop)) lightTop--;\n  let darkTop = lightTop;\n  while (darkTop >= 0 && image.get(x, darkTop)) darkTop--;\n\n  let bottom = y + 1;\n  while (bottom < height && image.get(x, bottom)) bottom++;\n  let lightBottom = bottom;\n  while (lightBottom < height && !image.get(x, lightBottom)) lightBottom++;\n  let darkBottom = lightBottom;\n  while (darkBottom < height && image.get(x, darkBottom)) darkBottom++;\n\n  const outerAbove = lightTop - darkTop;\n  const lightAbove = top - lightTop;\n  const center = bottom - top - 1;\n  const lightBelow = lightBottom - bottom;\n  const outerBelow = darkBottom - lightBottom;\n  if (outerAbove === 0 || lightAbove === 0 || lightBelow === 0 || outerBelow === 0) return null;\n\n  if (profileScore(outerAbove, lightAbove, center, lightBelow, outerBelow) > PROFILE_CUTOFF) {\n    return null;\n  }\n  const span = outerAbove + lightAbove + center + lightBelow + outerBelow;\n  const disagreement = Math.max(span, horizontalSpan) / Math.min(span, horizontalSpan);\n  if (disagreement > AXIS_AGREEMENT) return null;\n\n  // Continuous-coordinate midpoint of the central dark run.\n  return { centerY: (top + 1 + bottom) / 2, span };\n}\n\n/** Folds a confirmed sighting into a nearby cluster, or starts a new one. */\nfunction recordSighting(clusters: Cluster[], x: number, y: number, moduleSize: number): void {\n  for (const cluster of clusters) {\n    const cx = cluster.sumX / cluster.count;\n    const cy = cluster.sumY / cluster.count;\n    const cm = cluster.sumModule / cluster.count;\n    if (\n      Math.abs(x - cx) <= cm &&\n      Math.abs(y - cy) <= cm &&\n      Math.abs(moduleSize - cm) <= cm * 0.5 + 0.5\n    ) {\n      cluster.sumX += x;\n      cluster.sumY += y;\n      cluster.sumModule += moduleSize;\n      cluster.count++;\n      return;\n    }\n  }\n  clusters.push({ sumX: x, sumY: y, sumModule: moduleSize, count: 1 });\n}\n\n/**\n * Arranges three patterns as symbol corners: the pattern opposite the\n * longest side is the top-left, and the cross product orients the other two\n * (image y grows downward).\n */\nfunction orderAsCorners(a: FinderPattern, b: FinderPattern, c: FinderPattern): OrderedPatterns {\n  const ab = squaredDistance(a, b);\n  const bc = squaredDistance(b, c);\n  const ac = squaredDistance(a, c);\n  let corner: FinderPattern;\n  let first: FinderPattern;\n  let second: FinderPattern;\n  if (bc >= ab && bc >= ac) {\n    corner = a;\n    first = b;\n    second = c;\n  } else if (ac >= ab) {\n    corner = b;\n    first = a;\n    second = c;\n  } else {\n    corner = c;\n    first = a;\n    second = b;\n  }\n  const cross =\n    (first.x - corner.x) * (second.y - corner.y) - (first.y - corner.y) * (second.x - corner.x);\n  return cross > 0\n    ? { topLeft: corner, topRight: first, bottomLeft: second }\n    : { topLeft: corner, topRight: second, bottomLeft: first };\n}\n\n// #region snippet: triple-score\n/**\n * Plausibility score for an ordered triple — lower is better, null rejects.\n * Combines module-size agreement, leg balance, the diagonal/leg ratio of a\n * right isosceles triangle, and the corner angle.\n */\nfunction tripleScore(ordered: OrderedPatterns): number | null {\n  const { topLeft, topRight, bottomLeft } = ordered;\n  const sizes = [topLeft.moduleSize, topRight.moduleSize, bottomLeft.moduleSize];\n  const meanSize = (sizes[0]! + sizes[1]! + sizes[2]!) / 3;\n  const sizeSpread = (Math.max(...sizes) - Math.min(...sizes)) / meanSize;\n  if (sizeSpread > 0.5) return null;\n\n  const legTop = Math.hypot(topRight.x - topLeft.x, topRight.y - topLeft.y);\n  const legSide = Math.hypot(bottomLeft.x - topLeft.x, bottomLeft.y - topLeft.y);\n  const diagonal = Math.hypot(topRight.x - bottomLeft.x, topRight.y - bottomLeft.y);\n  const legMean = (legTop + legSide) / 2;\n\n  // Center spacing is dimension − 7 modules: 14 for version 1 up to 170.\n  const spacingModules = legMean / meanSize;\n  if (spacingModules < 9 || spacingModules > 185) return null;\n\n  const legImbalance = Math.abs(legTop - legSide) / legMean;\n  if (legImbalance > 0.6) return null;\n\n  const diagonalError = Math.abs(diagonal - Math.SQRT2 * legMean) / diagonal;\n  const cornerCos =\n    ((topRight.x - topLeft.x) * (bottomLeft.x - topLeft.x) +\n      (topRight.y - topLeft.y) * (bottomLeft.y - topLeft.y)) /\n    (legTop * legSide);\n  if (Math.abs(cornerCos) > 0.5) return null;\n\n  return sizeSpread + legImbalance + 2 * diagonalError + Math.abs(cornerCos);\n}\n// #endregion snippet\n\nfunction squaredDistance(a: FinderPattern, b: FinderPattern): number {\n  return (a.x - b.x) ** 2 + (a.y - b.y) ** 2;\n}\n","import type { Point } from '../types.js';\n\n/**\n * Plane-to-plane projective mapping between two quadrilaterals. The 3×3\n * homography H (bottom-right entry pinned to 1) is found by writing the four\n * corner correspondences as the standard system of eight linear equations in\n * H's remaining entries and solving it with Gaussian elimination — the\n * direct-linear-transformation approach described in textbooks on projective\n * geometry (e.g. Hartley & Zisserman, \"Multiple View Geometry in Computer\n * Vision\", §4.1).\n */\n\nexport type Quad = readonly [Point, Point, Point, Point];\n\n/** Row-major 3×3 matrix; h[8] is always 1. */\nexport type Homography = Float64Array;\n\n// #region snippet: homography\n/**\n * Homography taking each `from[i]` to `to[i]`. Returns null for degenerate\n * input (e.g. three collinear corners), where no projective map exists.\n */\nexport function computeHomography(from: Quad, to: Quad): Homography | null {\n  // A correspondence (x,y) → (u,v) linearizes to two equations in the\n  // unknown vector [h0 … h7]:\n  //   x·h0 + y·h1 + h2 − u·x·h6 − u·y·h7 = u\n  //   x·h3 + y·h4 + h5 − v·x·h6 − v·y·h7 = v\n  const rows: number[][] = [];\n  for (let i = 0; i < 4; i++) {\n    const { x, y } = from[i]!;\n    const { x: u, y: v } = to[i]!;\n    rows.push([x, y, 1, 0, 0, 0, -u * x, -u * y, u]);\n    rows.push([0, 0, 0, x, y, 1, -v * x, -v * y, v]);\n  }\n  const solution = solveLinearSystem(rows);\n  if (solution === null) return null;\n\n  const h = new Float64Array(9);\n  h.set(solution);\n  h[8] = 1;\n  return h;\n}\n// #endregion snippet\n\n/** Applies the homography to a point (perspective divide included). */\nexport function applyHomography(h: Homography, x: number, y: number): Point {\n  const w = h[6]! * x + h[7]! * y + 1;\n  return {\n    x: (h[0]! * x + h[1]! * y + h[2]!) / w,\n    y: (h[3]! * x + h[4]! * y + h[5]!) / w,\n  };\n}\n\n/**\n * Solves an n×n system given as n rows of n+1 augmented coefficients, by\n * Gaussian elimination with partial pivoting. Returns null when singular.\n * The input rows are consumed (modified in place).\n */\nfunction solveLinearSystem(rows: number[][]): number[] | null {\n  const n = rows.length;\n  for (let col = 0; col < n; col++) {\n    let pivotRow = col;\n    for (let r = col + 1; r < n; r++) {\n      if (Math.abs(rows[r]![col]!) > Math.abs(rows[pivotRow]![col]!)) pivotRow = r;\n    }\n    const pivot = rows[pivotRow]![col]!;\n    if (Math.abs(pivot) < 1e-12) return null;\n    if (pivotRow !== col) {\n      const swap = rows[col]!;\n      rows[col] = rows[pivotRow]!;\n      rows[pivotRow] = swap;\n    }\n    const lead = rows[col]!;\n    for (let r = col + 1; r < n; r++) {\n      const row = rows[r]!;\n      const factor = row[col]! / pivot;\n      if (factor === 0) continue;\n      for (let c = col; c <= n; c++) {\n        row[c]! -= factor * lead[c]!;\n      }\n    }\n  }\n  const solution = new Array<number>(n);\n  for (let r = n - 1; r >= 0; r--) {\n    const row = rows[r]!;\n    let value = row[n]!;\n    for (let c = r + 1; c < n; c++) {\n      value -= row[c]! * solution[c]!;\n    }\n    solution[r] = value / row[r]!;\n  }\n  return solution;\n}\n","import { BitMatrix } from '../core/bit-matrix.js';\nimport { readVersionInformation } from '../core/format.js';\nimport { sizeForVersion } from '../core/version.js';\nimport { DecodeError } from '../errors.js';\nimport type { Point } from '../types.js';\nimport { findAlignmentPattern } from './alignment.js';\nimport type { BitImage } from './bit-image.js';\nimport { type OrderedPatterns, findFinderPatterns, rankTriples } from './finder.js';\nimport { type Homography, type Quad, applyHomography, computeHomography } from './perspective.js';\n\n/**\n * Turns a binarized image into sampled QR bit matrices. For each ranked\n * finder triple: the symbol version is estimated from the center spacing\n * (centers sit dimension − 7 modules apart), the timing patterns are sampled\n * as a validity check, the bottom-right alignment pattern (versions ≥ 2)\n * anchors the fourth homography correspondence with a parallelogram\n * fallback, and module centers are sampled through the homography.\n */\n\nexport interface DetectionResult {\n  matrix: BitMatrix;\n  /** Symbol outline: top-left, top-right, bottom-right, bottom-left. */\n  cornerPoints: [Point, Point, Point, Point];\n  moduleSize: number;\n  patterns: OrderedPatterns;\n}\n\n/** Finder centers sit 3.5 modules inside the symbol corners (§7.3.2). */\nconst FINDER_INSET = 3.5;\n/** The bottom-right alignment center sits 6.5 modules inside (Annex E). */\nconst ALIGNMENT_INSET = 6.5;\n/** Modules of slack between the estimated and nominal dimension. */\nconst DIMENSION_SLACK = 2.5;\n/** Search radius around the predicted alignment position, in modules. */\nconst ALIGNMENT_RADIUS = 5;\n/** Minimum fraction of timing-pattern modules that must alternate. */\nconst TIMING_AGREEMENT = 0.7;\n\n/** Decodes the most promising symbol candidate or throws DecodeError. */\nexport function detect(image: BitImage): DetectionResult {\n  for (const detection of iterateDetections(image, 4)) {\n    return detection;\n  }\n  throw new DecodeError('detect', 'no qr symbol found in the image');\n}\n\n/** Up to maxCandidates distinct symbol candidates, best first. */\nexport function detectCandidates(image: BitImage, maxCandidates: number): DetectionResult[] {\n  const results: DetectionResult[] = [];\n  for (const detection of iterateDetections(image, Math.max(4, maxCandidates * 2))) {\n    results.push(detection);\n    if (results.length >= maxCandidates) break;\n  }\n  return results;\n}\n\n/**\n * Lazily yields detections for ranked finder triples, spending at most\n * maxTriples attempts. The FinderPattern objects inside each result come\n * from one findFinderPatterns pass, so callers can use them as stable keys.\n */\nexport function* iterateDetections(\n  image: BitImage,\n  maxTriples: number,\n): Generator<DetectionResult> {\n  const patterns = findFinderPatterns(image);\n  const triples = rankTriples(patterns);\n  const budget = Math.min(triples.length, maxTriples);\n  for (let i = 0; i < budget; i++) {\n    const detection = assembleDetection(image, triples[i]!);\n    if (detection !== null) yield detection;\n  }\n}\n\nfunction assembleDetection(image: BitImage, patterns: OrderedPatterns): DetectionResult | null {\n  const { topLeft, topRight, bottomLeft } = patterns;\n\n  // Module size measured along each symbol axis: scan-line estimates are\n  // stretched by rotation, but the finder's edge profile along the line\n  // toward the opposite finder is not.\n  const moduleAcross =\n    axisModuleSize(image, topLeft, topRight) ?? (topLeft.moduleSize + topRight.moduleSize) / 2;\n  const moduleDown =\n    axisModuleSize(image, topLeft, bottomLeft) ?? (topLeft.moduleSize + bottomLeft.moduleSize) / 2;\n  const moduleSize = (moduleAcross + moduleDown) / 2;\n  if (moduleSize < 1) return null;\n\n  // Version from center spacing: distance / moduleSize ≈ dimension − 7.\n  const acrossModules = Math.hypot(topRight.x - topLeft.x, topRight.y - topLeft.y) / moduleAcross;\n  const downModules = Math.hypot(bottomLeft.x - topLeft.x, bottomLeft.y - topLeft.y) / moduleDown;\n  const estimatedDimension = (acrossModules + downModules) / 2 + 7;\n\n  // The measurement error grows with the module count, so nearby versions\n  // are tried closest-first; the timing-pattern gate arbitrates.\n  for (const version of candidateVersions(estimatedDimension)) {\n    const detection = buildAtVersion(image, patterns, moduleSize, version);\n    if (detection !== null) return detection;\n  }\n  return null;\n}\n\n/** Valid versions whose nominal dimension is near the estimate, nearest first. */\nfunction candidateVersions(estimatedDimension: number): number[] {\n  const nearest = Math.round((estimatedDimension - 17) / 4);\n  const versions: number[] = [];\n  for (const version of [nearest, nearest - 1, nearest + 1]) {\n    if (version < 1 || version > 40) continue;\n    if (Math.abs(estimatedDimension - sizeForVersion(version)) > DIMENSION_SLACK) continue;\n    versions.push(version);\n  }\n  return versions;\n}\n\n/**\n * Walks from a finder center toward the other finder, reading the distances\n * of the core→ring→rim→outside transitions, which sit at 1.5, 2.5 and 3.5\n * modules along a symbol axis. Averages the walks from both ends.\n */\nfunction axisModuleSize(image: BitImage, from: Point, to: Point): number | null {\n  const forward = edgeProfileModule(image, from, to);\n  const backward = edgeProfileModule(image, to, from);\n  if (forward === null || backward === null) return forward ?? backward;\n  return (forward + backward) / 2;\n}\n\n// #region snippet: module-size\nfunction edgeProfileModule(image: BitImage, from: Point, to: Point): number | null {\n  const distance = Math.hypot(to.x - from.x, to.y - from.y);\n  if (distance === 0) return null;\n  const stepX = (to.x - from.x) / distance;\n  const stepY = (to.y - from.y) / distance;\n  const limit = Math.min(distance / 2, image.width + image.height);\n\n  // Transition distances from the center: 3 dark→light or light→dark flips.\n  const flips: number[] = [];\n  let previous = true; // walking out of the dark core\n  for (let t = 0.5; t < limit && flips.length < 3; t += 0.5) {\n    const x = Math.floor(from.x + stepX * t);\n    const y = Math.floor(from.y + stepY * t);\n    if (x < 0 || x >= image.width || y < 0 || y >= image.height) break;\n    const dark = image.get(x, y);\n    if (dark !== previous) {\n      flips.push(t - 0.25);\n      previous = dark;\n    }\n  }\n  if (flips.length < 3) return null;\n  // flips = [1.5, 2.5, 3.5] modules from the center.\n  return (flips[0]! / 1.5 + (flips[1]! - flips[0]!) + (flips[2]! - flips[1]!)) / 3;\n}\n// #endregion snippet\n\nfunction buildAtVersion(\n  image: BitImage,\n  patterns: OrderedPatterns,\n  moduleSize: number,\n  version: number,\n): DetectionResult | null {\n  const { topLeft, topRight, bottomLeft } = patterns;\n  const dimension = sizeForVersion(version);\n\n  // Fourth correspondence: alignment pattern if the version has one and it\n  // shows up near its predicted spot, else the parallelogram completion.\n  let sourceBottomRight: Point = {\n    x: dimension - FINDER_INSET,\n    y: dimension - FINDER_INSET,\n  };\n  let imageBottomRight: Point = {\n    x: topRight.x + bottomLeft.x - topLeft.x,\n    y: topRight.y + bottomLeft.y - topLeft.y,\n  };\n  if (version >= 2) {\n    // Fraction of the finder-to-finder span at which the alignment center\n    // sits, applied along both symbol axes.\n    const fraction = (dimension - FINDER_INSET - ALIGNMENT_INSET) / (dimension - 7);\n    const predicted: Point = {\n      x: topLeft.x + fraction * (topRight.x - topLeft.x + bottomLeft.x - topLeft.x),\n      y: topLeft.y + fraction * (topRight.y - topLeft.y + bottomLeft.y - topLeft.y),\n    };\n    const found = findAlignmentPattern(image, predicted, moduleSize, ALIGNMENT_RADIUS);\n    if (found !== null) {\n      sourceBottomRight = { x: dimension - ALIGNMENT_INSET, y: dimension - ALIGNMENT_INSET };\n      imageBottomRight = found;\n    }\n  }\n\n  const moduleQuad: Quad = [\n    { x: FINDER_INSET, y: FINDER_INSET },\n    { x: dimension - FINDER_INSET, y: FINDER_INSET },\n    sourceBottomRight,\n    { x: FINDER_INSET, y: dimension - FINDER_INSET },\n  ];\n  const imageQuad: Quad = [\n    { x: topLeft.x, y: topLeft.y },\n    { x: topRight.x, y: topRight.y },\n    imageBottomRight,\n    { x: bottomLeft.x, y: bottomLeft.y },\n  ];\n  const homography = computeHomography(moduleQuad, imageQuad);\n  if (homography === null) return null;\n\n  if (!timingPatternsAgree(image, homography, dimension)) return null;\n\n  const matrix = sampleModules(image, homography, dimension);\n  if (matrix === null) return null;\n\n  // Versions 7+ declare their version in two BCH-protected blocks (§8.10).\n  // A legible disagreement means the triple was fit at the wrong dimension;\n  // unreadable blocks fall back to the timing gate that already passed.\n  if (version >= 7) {\n    const declared = readVersionInformation(matrix);\n    if (declared !== null && declared !== version) return null;\n  }\n\n  const cornerPoints: [Point, Point, Point, Point] = [\n    applyHomography(homography, 0, 0),\n    applyHomography(homography, dimension, 0),\n    applyHomography(homography, dimension, dimension),\n    applyHomography(homography, 0, dimension),\n  ];\n  for (const corner of cornerPoints) {\n    if (!Number.isFinite(corner.x) || !Number.isFinite(corner.y)) return null;\n  }\n\n  return { matrix, cornerPoints, moduleSize, patterns };\n}\n\n/**\n * Samples the horizontal and vertical timing patterns (row/column 6, §7.3.4)\n * and checks that enough modules carry the expected dark/light alternation —\n * a cheap witness that the triple really spans one symbol at this version.\n */\nfunction timingPatternsAgree(image: BitImage, h: Homography, dimension: number): boolean {\n  let agreements = 0;\n  let total = 0;\n  for (let module = 8; module <= dimension - 9; module++) {\n    const expectDark = module % 2 === 0;\n    if (sampleAt(image, h, module + 0.5, 6.5) === expectDark) agreements++;\n    if (sampleAt(image, h, 6.5, module + 0.5) === expectDark) agreements++;\n    total += 2;\n  }\n  return total === 0 || agreements >= total * TIMING_AGREEMENT;\n}\n\nfunction sampleAt(image: BitImage, h: Homography, mx: number, my: number): boolean {\n  const point = applyHomography(h, mx, my);\n  const x = Math.floor(point.x);\n  const y = Math.floor(point.y);\n  if (x < 0 || x >= image.width || y < 0 || y >= image.height) return false;\n  return image.get(x, y);\n}\n\n// #region snippet: sample-grid\n/**\n * Reads every module center through the homography. Gives up when too many\n * centers land outside the frame (a wildly wrong fit, not a symbol).\n */\nfunction sampleModules(image: BitImage, h: Homography, dimension: number): BitMatrix | null {\n  const matrix = new BitMatrix(dimension);\n  const width = image.width;\n  const height = image.height;\n  let escaped = 0;\n  const escapeLimit = Math.ceil((dimension * dimension) / 8);\n  for (let my = 0; my < dimension; my++) {\n    for (let mx = 0; mx < dimension; mx++) {\n      const point = applyHomography(h, mx + 0.5, my + 0.5);\n      let x = Math.floor(point.x);\n      let y = Math.floor(point.y);\n      if (x < 0 || x >= width || y < 0 || y >= height) {\n        if (++escaped > escapeLimit) return null;\n        x = Math.min(width - 1, Math.max(0, x));\n        y = Math.min(height - 1, Math.max(0, y));\n      }\n      matrix.set(mx, my, image.get(x, y));\n    }\n  }\n  return matrix;\n}\n// #endregion snippet\n","import type { GrayImage } from './grayscale.js';\n\n/**\n * Integer-factor box downsampling. Besides speeding up huge frames, the\n * averaging acts as a low-pass filter, which often *recovers* blurry or\n * oversampled codes the full-resolution pass misses.\n */\nexport function downscaleGray(gray: GrayImage, factor: number): GrayImage {\n  const width = Math.floor(gray.width / factor);\n  const height = Math.floor(gray.height / factor);\n  const luma = new Uint8Array(width * height);\n  const area = factor * factor;\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      let sum = 0;\n      const srcY = y * factor;\n      const srcX = x * factor;\n      for (let dy = 0; dy < factor; dy++) {\n        const rowOffset = (srcY + dy) * gray.width + srcX;\n        for (let dx = 0; dx < factor; dx++) {\n          sum += gray.luma[rowOffset + dx]!;\n        }\n      }\n      luma[y * width + x] = sum / area;\n    }\n  }\n  return { luma, width, height };\n}\n","import type { ImageDataLike } from '../types.js';\n\nexport interface GrayImage {\n  luma: Uint8Array;\n  width: number;\n  height: number;\n}\n\n// #region snippet: grayscale\n/**\n * RGBA → luminance using integer BT.601 weights\n * (0.299 R + 0.587 G + 0.114 B), the standard for barcode luminance sources.\n */\nexport function toGrayscale(image: ImageDataLike): GrayImage {\n  const { data, width, height } = image;\n  // Checked before the length guard, which a NaN dimension slips through\n  // (every comparison against NaN is false) to report \"no code found\" for what\n  // is really malformed input.\n  if (!Number.isInteger(width) || !Number.isInteger(height) || width < 0 || height < 0) {\n    throw new RangeError(`invalid image dimensions ${width}x${height}`);\n  }\n  if (data.length < width * height * 4) {\n    throw new RangeError('image data too short for RGBA dimensions');\n  }\n  const luma = new Uint8Array(width * height);\n  for (let i = 0, p = 0; i < luma.length; i++, p += 4) {\n    luma[i] = (77 * data[p]! + 150 * data[p + 1]! + 29 * data[p + 2]!) >> 8;\n  }\n  return { luma, width, height };\n}\n// #endregion snippet\n","import { parseContent } from './content/parse.js';\nimport { decodeMatrix } from './core/decode-matrix.js';\nimport { binarize } from './detect/binarizer.js';\nimport type { BitImage } from './detect/bit-image.js';\nimport { iterateDetections } from './detect/detector.js';\nimport { downscaleGray } from './detect/downscale.js';\nimport type { FinderPattern } from './detect/finder.js';\nimport { type GrayImage, toGrayscale } from './detect/grayscale.js';\nimport { DecodeError } from './errors.js';\nimport type {\n  DecodeImageOptions,\n  DetectImageOptions,\n  Detection,\n  ImageDataLike,\n  Point,\n  QrResult,\n} from './types.js';\n\n/** Frames larger than this (longest side) get an automatic downscale pass. */\nconst AUTO_DOWNSCALE_THRESHOLD = 1000;\nconst MIN_DECODABLE_SIZE = 21;\n/** Finder-triple budget per pass when hunting for every symbol in the frame. */\nconst MULTI_TRIPLE_LIMIT = 16;\nconst DEFAULT_MAX_DETECTIONS = 8;\n\n/** Options for scanning one frame; the superset the scanner loop uses. */\nexport interface ScanFrameOptions extends DecodeImageOptions {\n  /** Decode every symbol in the frame instead of stopping at the first. */\n  multiple?: boolean;\n}\n\n/** Everything one pipeline run learned about a frame. */\nexport interface FrameScan {\n  results: QrResult[];\n  detections: Detection[];\n}\n\n/**\n * Finds and decodes a QR code in an RGBA image (e.g. a canvas ImageData).\n * Returns null when no decodable QR code is present; throws only on invalid\n * input (malformed dimensions).\n */\nexport function decode(image: ImageDataLike, options: DecodeImageOptions = {}): QrResult | null {\n  return scanImage(image, options, singleMode(options)).results[0] ?? null;\n}\n\n/**\n * Finds and decodes every QR code in the frame. Unlike decode(), this always\n * runs the full pass plan (all scales, plus inverted when enabled) and merges\n * the passes, so it costs roughly what a failing decode() costs even when the\n * frame contains a code.\n */\nexport function decodeAll(image: ImageDataLike, options: DecodeImageOptions = {}): QrResult[] {\n  const mode: ScanMode = {\n    decode: true,\n    multiple: true,\n    maxTriples: MULTI_TRIPLE_LIMIT,\n    maxDetections: DEFAULT_MAX_DETECTIONS,\n  };\n  return scanImage(image, options, mode).results;\n}\n\n/**\n * Locates QR symbol candidates without decoding them — corner points and\n * module size only. Cheaper than decode() and useful for live outline\n * overlays and framing feedback; candidates are plausibility-ranked and may\n * include finder-like decoys that would not survive a decode.\n */\nexport function detect(image: ImageDataLike, options: DetectImageOptions = {}): Detection[] {\n  const mode: ScanMode = {\n    decode: false,\n    multiple: false,\n    maxTriples: MULTI_TRIPLE_LIMIT,\n    maxDetections: options.maxCandidates ?? 4,\n  };\n  return scanImage(image, options, mode).detections;\n}\n\n/**\n * One scan-loop iteration: decode result(s) plus the symbol candidates seen\n * along the way (populated even when nothing decodes — that is what live\n * overlays track). Scanner/worker entry point; decode()/decodeAll()/detect()\n * are the stable public faces of this.\n */\nexport function scanFrame(image: ImageDataLike, options: ScanFrameOptions = {}): FrameScan {\n  const mode: ScanMode =\n    options.multiple === true\n      ? {\n          decode: true,\n          multiple: true,\n          maxTriples: MULTI_TRIPLE_LIMIT,\n          maxDetections: DEFAULT_MAX_DETECTIONS,\n        }\n      : singleMode(options);\n  return scanImage(image, options, mode);\n}\n\ninterface ScanMode {\n  /** Attempt decodeMatrix on candidates (false = locate only). */\n  decode: boolean;\n  /** Keep going after the first decoded symbol and merge all passes. */\n  multiple: boolean;\n  /** Finder-triple budget per binarization pass. */\n  maxTriples: number;\n  /** Cap on distinct detection candidates reported. */\n  maxDetections: number;\n}\n\nfunction singleMode(options: DecodeImageOptions): ScanMode {\n  return {\n    decode: true,\n    multiple: false,\n    maxTriples: options.tryHarder === true ? 4 : 1,\n    maxDetections: 4,\n  };\n}\n\nfunction scanImage(image: ImageDataLike, options: ScanFrameOptions, mode: ScanMode): FrameScan {\n  const gray = toGrayscale(image);\n  const tryInverted = options.tryInverted !== false;\n  const results: QrResult[] = [];\n  const detections: Detection[] = [];\n\n  for (const factor of planScales(gray, options)) {\n    const scaled = factor === 1 ? gray : downscaleGray(gray, factor);\n    const bits = binarize(scaled);\n    for (let polarity = 0; polarity < (tryInverted ? 2 : 1); polarity++) {\n      scanPass(polarity === 0 ? bits : bits.inverted(), factor, mode, results, detections);\n      if (mode.decode && !mode.multiple && results.length > 0) {\n        finalize(results, options);\n        return { results, detections };\n      }\n    }\n  }\n  finalize(results, options);\n  return { results, detections };\n}\n\n/**\n * Runs detection (and optionally decoding) over one binarized image,\n * appending to the shared result/detection lists. Multi-code partitioning:\n * once a triple decodes, its three finder patterns are consumed and any\n * later triple touching them is skipped, so each physical symbol is decoded\n * at most once per pass. Cross-pass duplicates are filtered by position.\n */\nfunction scanPass(\n  bits: BitImage,\n  factor: number,\n  mode: ScanMode,\n  results: QrResult[],\n  detections: Detection[],\n): void {\n  /** Finder patterns of successfully decoded symbols (skip their triples). */\n  const consumed = new Set<FinderPattern>();\n  /** Finder patterns already represented in the detections list. */\n  const listed = new Set<FinderPattern>();\n\n  for (const detection of iterateDetections(bits, mode.maxTriples)) {\n    const { topLeft, topRight, bottomLeft } = detection.patterns;\n    if (consumed.has(topLeft) || consumed.has(topRight) || consumed.has(bottomLeft)) continue;\n\n    if (\n      detections.length < mode.maxDetections &&\n      !(listed.has(topLeft) || listed.has(topRight) || listed.has(bottomLeft))\n    ) {\n      const candidate: Detection = {\n        cornerPoints: scaleCorners(detection.cornerPoints, factor),\n        moduleSize: detection.moduleSize * factor,\n      };\n      if (!detections.some((d) => sameLocation(d.cornerPoints, candidate.cornerPoints))) {\n        detections.push(candidate);\n      }\n      listed.add(topLeft);\n      listed.add(topRight);\n      listed.add(bottomLeft);\n    }\n\n    if (!mode.decode) continue;\n    let decoded: ReturnType<typeof decodeMatrix>;\n    try {\n      decoded = decodeMatrix(detection.matrix);\n    } catch (error) {\n      if (error instanceof DecodeError) continue;\n      throw error;\n    }\n    const result: QrResult = {\n      ...decoded,\n      cornerPoints: scaleCorners(detection.cornerPoints, factor),\n      moduleSize: detection.moduleSize * factor,\n    };\n    if (\n      !results.some(\n        (r) => r.text === result.text && sameLocation(r.cornerPoints, result.cornerPoints),\n      )\n    ) {\n      results.push(result);\n    }\n    consumed.add(topLeft);\n    consumed.add(topRight);\n    consumed.add(bottomLeft);\n    if (!mode.multiple) return;\n  }\n}\n\nfunction finalize(results: QrResult[], options: DecodeImageOptions): void {\n  if (options.parseContent === false) return;\n  for (const result of results) {\n    result.content = parseContent(result.text, { gs1: result.fnc1?.position === 'first' });\n  }\n}\n\nfunction scaleCorners(\n  corners: readonly [Point, Point, Point, Point],\n  factor: number,\n): [Point, Point, Point, Point] {\n  return [\n    { x: corners[0].x * factor, y: corners[0].y * factor },\n    { x: corners[1].x * factor, y: corners[1].y * factor },\n    { x: corners[2].x * factor, y: corners[2].y * factor },\n    { x: corners[3].x * factor, y: corners[3].y * factor },\n  ];\n}\n\n/** Same physical symbol: outline centers closer than half the larger diagonal. */\nfunction sameLocation(a: readonly Point[], b: readonly Point[]): boolean {\n  const size = Math.max(\n    Math.hypot(a[2]!.x - a[0]!.x, a[2]!.y - a[0]!.y),\n    Math.hypot(b[2]!.x - b[0]!.x, b[2]!.y - b[0]!.y),\n  );\n  const ax = (a[0]!.x + a[1]!.x + a[2]!.x + a[3]!.x) / 4;\n  const ay = (a[0]!.y + a[1]!.y + a[2]!.y + a[3]!.y) / 4;\n  const bx = (b[0]!.x + b[1]!.x + b[2]!.x + b[3]!.x) / 4;\n  const by = (b[0]!.y + b[1]!.y + b[2]!.y + b[3]!.y) / 4;\n  return Math.hypot(ax - bx, ay - by) < size / 2;\n}\n\n// #region snippet: pass-plan\n/**\n * Which resolutions to attempt, in order. Downscaled passes are cheaper AND\n * act as a low-pass filter, so for huge frames they run first; full\n * resolution always remains in the list. tryHarder adds a 2× pass for\n * normal-sized frames to catch blurry/oversampled codes.\n */\nfunction planScales(gray: GrayImage, options: DecodeImageOptions): number[] {\n  const maxDownscale = Math.max(1, Math.floor(options.maxDownscale ?? 1));\n  const longestSide = Math.max(gray.width, gray.height);\n  const shortestSide = Math.min(gray.width, gray.height);\n\n  const scales: number[] = [];\n  let auto = 1;\n  while (auto * 2 <= maxDownscale && longestSide / auto > AUTO_DOWNSCALE_THRESHOLD) {\n    auto *= 2;\n  }\n  if (auto > 1) scales.push(auto);\n  scales.push(1);\n  if (options.tryHarder === true && !scales.includes(2) && shortestSide / 2 >= MIN_DECODABLE_SIZE) {\n    scales.push(2);\n  }\n  return scales;\n}\n// #endregion snippet\n","import type { Point } from '../types.js';\n\n/**\n * Maps points from video pixel coordinates (as reported in QrResult and\n * Detection corner points) to CSS pixel coordinates relative to the video\n * element's top-left corner, accounting for object-fit scaling, letterboxing,\n * and cropping. Assumes the default centered object-position. Use this to\n * place an overlay element laid out on top of the video; a canvas sized to\n * videoWidth×videoHeight and CSS-stretched with the same object-fit does not\n * need it.\n */\nexport function videoToElementCoordinates(\n  points: readonly Point[],\n  video: HTMLVideoElement,\n): Point[] {\n  const { videoWidth, videoHeight, clientWidth, clientHeight } = video;\n  if (videoWidth === 0 || videoHeight === 0) {\n    return points.map((point) => ({ x: point.x, y: point.y }));\n  }\n  const fitX = clientWidth / videoWidth;\n  const fitY = clientHeight / videoHeight;\n  let scaleX = fitX;\n  let scaleY = fitY;\n  const objectFit =\n    typeof getComputedStyle === 'function' ? getComputedStyle(video).objectFit || 'fill' : 'fill';\n  switch (objectFit) {\n    case 'contain':\n      scaleX = scaleY = Math.min(fitX, fitY);\n      break;\n    case 'cover':\n      scaleX = scaleY = Math.max(fitX, fitY);\n      break;\n    case 'none':\n      scaleX = scaleY = 1;\n      break;\n    case 'scale-down':\n      scaleX = scaleY = Math.min(1, fitX, fitY);\n      break;\n    default:\n      break; // 'fill' stretches both axes independently\n  }\n  const offsetX = (clientWidth - videoWidth * scaleX) / 2;\n  const offsetY = (clientHeight - videoHeight * scaleY) / 2;\n  return points.map((point) => ({\n    x: point.x * scaleX + offsetX,\n    y: point.y * scaleY + offsetY,\n  }));\n}\n","export interface CameraCapabilities {\n  torch: boolean;\n  zoom: { min: number; max: number; step: number } | null;\n}\n\n/** Torch/zoom live in vendor extensions the DOM types don't know about. */\ntype ExtendedCapabilities = {\n  torch?: boolean;\n  zoom?: { min?: number; max?: number; step?: number };\n};\n\nexport function getTrackCapabilities(track: MediaStreamTrack): CameraCapabilities {\n  let raw: ExtendedCapabilities = {};\n  try {\n    if (typeof track.getCapabilities === 'function') {\n      raw = track.getCapabilities() as ExtendedCapabilities;\n    }\n  } catch {\n    // Some implementations throw on an ended track; \"no capabilities\" is the\n    // honest answer, and this accessor is documented never to throw.\n  }\n  const zoom = raw.zoom;\n  return {\n    torch: raw.torch === true,\n    zoom:\n      zoom && typeof zoom.min === 'number' && typeof zoom.max === 'number'\n        ? { min: zoom.min, max: zoom.max, step: zoom.step ?? 0.1 }\n        : null,\n  };\n}\n\n/**\n * Applies one advanced constraint, reporting success as a boolean. Rejection\n * counts as \"not applied\", never as a throw: plenty of devices advertise a\n * capability and then refuse the constraint (`OverconstrainedError`,\n * `NotSupportedError`), and an ended track refuses everything.\n */\nasync function applyAdvanced(\n  track: MediaStreamTrack,\n  constraint: MediaTrackConstraintSet,\n): Promise<boolean> {\n  try {\n    await track.applyConstraints({ advanced: [constraint] });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Turns the torch on/off. Resolves to false (without throwing) when the\n * device has no controllable torch — or advertises one it will not actually\n * apply — so callers can no-op gracefully.\n */\nexport async function applyTorch(track: MediaStreamTrack, on: boolean): Promise<boolean> {\n  if (!getTrackCapabilities(track).torch) return false;\n  return applyAdvanced(track, { torch: on } as MediaTrackConstraintSet);\n}\n\n/** Sets zoom, clamped to the supported range. False when unsupported. */\nexport async function applyZoom(track: MediaStreamTrack, zoom: number): Promise<boolean> {\n  const range = getTrackCapabilities(track).zoom;\n  if (range === null) return false;\n  const clamped = Math.min(range.max, Math.max(range.min, zoom));\n  return applyAdvanced(track, { zoom: clamped } as MediaTrackConstraintSet);\n}\n","import type { ImageDataLike } from '../types.js';\n\nexport interface Region {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/** Produces RGBA frames from a live source; a scanner-internal seam. */\nexport interface FrameSource {\n  /**\n   * Returns the current frame (cropped to region), or null if not ready. The\n   * region is clamped to the frame bounds via `clampRegion` — the scanner maps\n   * decode coordinates back by that same clamp, so an implementation must not\n   * crop to some other rectangle.\n   */\n  grab(region?: Region): ImageDataLike | null;\n  destroy(): void;\n}\n\n/**\n * Default frame source: draws the video onto a reused canvas and reads the\n * pixels back. Uses OffscreenCanvas when available (no DOM node churn).\n */\nexport function createCanvasFrameSource(video: HTMLVideoElement): FrameSource {\n  let canvas: OffscreenCanvas | HTMLCanvasElement | null = null;\n  let context: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D | null = null;\n\n  function ensureContext(width: number, height: number): typeof context {\n    if (!canvas) {\n      canvas =\n        typeof OffscreenCanvas !== 'undefined'\n          ? new OffscreenCanvas(width, height)\n          : document.createElement('canvas');\n    }\n    if (canvas.width !== width) canvas.width = width;\n    if (canvas.height !== height) canvas.height = height;\n    if (!context) {\n      context = (canvas as HTMLCanvasElement).getContext('2d', {\n        willReadFrequently: true,\n      }) as CanvasRenderingContext2D | null;\n    }\n    return context;\n  }\n\n  return {\n    grab(region?: Region): ImageDataLike | null {\n      const videoWidth = video.videoWidth;\n      const videoHeight = video.videoHeight;\n      if (!videoWidth || !videoHeight) return null;\n\n      const crop = clampRegion(region, videoWidth, videoHeight);\n      const ctx = ensureContext(crop.width, crop.height);\n      if (!ctx) return null;\n      ctx.drawImage(video, crop.x, crop.y, crop.width, crop.height, 0, 0, crop.width, crop.height);\n      return ctx.getImageData(0, 0, crop.width, crop.height);\n    },\n    destroy(): void {\n      canvas = null;\n      context = null;\n    },\n  };\n}\n\nexport function clampRegion(region: Region | undefined, width: number, height: number): Region {\n  if (!region) return { x: 0, y: 0, width, height };\n  const x = Math.max(0, Math.min(Math.floor(region.x), width - 1));\n  const y = Math.max(0, Math.min(Math.floor(region.y), height - 1));\n  return {\n    x,\n    y,\n    width: Math.max(1, Math.min(Math.floor(region.width), width - x)),\n    height: Math.max(1, Math.min(Math.floor(region.height), height - y)),\n  };\n}\n","/**\n * Suppresses repeat results while a code stays in front of the camera: a\n * payload re-fires only after it has been out of sight for the whole window\n * (each sighting refreshes its timer). Payloads are tracked independently,\n * so several codes visible at once (multiple mode) each dedupe on their own\n * clock and cannot displace each other into re-firing.\n */\nexport class Deduper {\n  private readonly seen = new Map<string, number>();\n\n  constructor(private windowMs: number) {}\n\n  setWindow(windowMs: number): void {\n    this.windowMs = windowMs;\n  }\n\n  shouldEmit(text: string, now: number): boolean {\n    if (this.windowMs <= 0) return true;\n    const lastSeenAt = this.seen.get(text);\n    // Delete + set keeps the map insertion-ordered by recency, so pruning\n    // can stop at the first still-fresh entry.\n    this.seen.delete(text);\n    this.seen.set(text, now);\n    this.prune(now);\n    return lastSeenAt === undefined || now - lastSeenAt >= this.windowMs;\n  }\n\n  private prune(now: number): void {\n    for (const [text, seenAt] of this.seen) {\n      if (now - seenAt < this.windowMs) break;\n      this.seen.delete(text);\n    }\n  }\n\n  reset(): void {\n    this.seen.clear();\n  }\n}\n","import { parseContent } from '../content/parse.js';\nimport type { FrameScan, ScanFrameOptions } from '../decode.js';\nimport type { Detection, ImageDataLike, Point, QrResult } from '../types.js';\nimport type { DecodeRunner } from './runner.js';\n\n/** Minimal structural view of the Shape Detection API. */\ninterface DetectedBarcode {\n  rawValue: string;\n  cornerPoints: Point[];\n}\ninterface BarcodeDetectorLike {\n  detect(source: unknown): Promise<DetectedBarcode[]>;\n}\ntype BarcodeDetectorCtor = new (options: { formats: string[] }) => BarcodeDetectorLike;\n\n/**\n * Opt-in fast path over the browser's BarcodeDetector. Returns null when the\n * API is missing; if detection fails at runtime (e.g. Chromium builds without\n * a shape-detection backend), the runner permanently hands over to `fallback`\n * — our own engine — so a scanner started with useNativeDetector never stops\n * decoding.\n *\n * Native results carry text/bytes/cornerPoints/content only. Codec metadata\n * the API does not expose uses placeholders: version 0, mask -1, zero ecc\n * counts, EC level 'M', a single synthetic byte segment, and a moduleSize\n * estimated from the outline.\n */\nexport function tryCreateNativeRunner(fallback: () => DecodeRunner): DecodeRunner | null {\n  const Ctor = (globalThis as { BarcodeDetector?: BarcodeDetectorCtor }).BarcodeDetector;\n  if (typeof Ctor !== 'function') return null;\n  let detector: BarcodeDetectorLike;\n  try {\n    detector = new Ctor({ formats: ['qr_code'] });\n  } catch {\n    return null;\n  }\n\n  let fallbackRunner: DecodeRunner | null = null;\n  return {\n    async scan(image: ImageDataLike, options: ScanFrameOptions): Promise<FrameScan> {\n      if (fallbackRunner) return fallbackRunner.scan(image, options);\n      try {\n        const detected = await detector.detect(toImageData(image));\n        return toFrameScan(detected, options);\n      } catch {\n        fallbackRunner = fallback();\n        return fallbackRunner.scan(image, options);\n      }\n    },\n    destroy(): void {\n      fallbackRunner?.destroy();\n    },\n  };\n}\n\nfunction toImageData(image: ImageDataLike): ImageData {\n  const data =\n    image.data instanceof Uint8ClampedArray ? image.data : new Uint8ClampedArray(image.data);\n  // Frame buffers are never SharedArrayBuffer-backed here; satisfy the\n  // ArrayBuffer-only ImageData constructor signature.\n  return new ImageData(data as Uint8ClampedArray<ArrayBuffer>, image.width, image.height);\n}\n\nfunction toFrameScan(detected: DetectedBarcode[], options: ScanFrameOptions): FrameScan {\n  const detections: Detection[] = [];\n  const results: QrResult[] = [];\n  const limit = options.multiple === true ? detected.length : Math.min(detected.length, 1);\n\n  for (const barcode of detected) {\n    const cornerPoints = normalizeCorners(barcode.cornerPoints);\n    if (!cornerPoints) continue;\n    const moduleSize = estimateModuleSize(cornerPoints);\n    detections.push({ cornerPoints, moduleSize });\n    if (results.length >= limit) continue;\n\n    const bytes = new TextEncoder().encode(barcode.rawValue);\n    const result: QrResult = {\n      text: barcode.rawValue,\n      bytes,\n      cornerPoints,\n      moduleSize,\n      version: 0,\n      errorCorrectionLevel: 'M',\n      mask: -1,\n      segments: [{ mode: 'byte', bytes, text: barcode.rawValue }],\n      ecc: { blocks: 0, codewordsCorrected: 0 },\n    };\n    if (options.parseContent !== false) result.content = parseContent(result.text);\n    results.push(result);\n  }\n  return { results, detections };\n}\n\nfunction normalizeCorners(points: Point[]): [Point, Point, Point, Point] | null {\n  if (points.length !== 4) return null;\n  return [\n    { x: points[0]!.x, y: points[0]!.y },\n    { x: points[1]!.x, y: points[1]!.y },\n    { x: points[2]!.x, y: points[2]!.y },\n    { x: points[3]!.x, y: points[3]!.y },\n  ];\n}\n\n/** Rough estimate assuming a mid-size symbol; good enough for overlay scale. */\nfunction estimateModuleSize(corners: [Point, Point, Point, Point]): number {\n  const top = Math.hypot(corners[1].x - corners[0].x, corners[1].y - corners[0].y);\n  const left = Math.hypot(corners[3].x - corners[0].x, corners[3].y - corners[0].y);\n  return (top + left) / 2 / 25;\n}\n","import { type FrameScan, type ScanFrameOptions, scanFrame } from '../decode.js';\nimport { DecodeError } from '../errors.js';\nimport type { ImageDataLike } from '../types.js';\nimport { tryCreateNativeRunner } from './native.js';\n\n/** Executes frame scans, on a worker or inline; a scanner-internal seam. */\nexport interface DecodeRunner {\n  scan(image: ImageDataLike, options: ScanFrameOptions): Promise<FrameScan>;\n  destroy(): void;\n}\n\ninterface WorkerResponse {\n  id: number;\n  results?: FrameScan['results'];\n  detections?: FrameScan['detections'];\n  error?: string;\n}\n\n/**\n * Prefers a module worker (decoding off the main thread) and falls back to\n * inline decoding wherever workers aren't available (Node, old browsers,\n * CJS bundles without import.meta support). With useNativeDetector, the\n * browser's BarcodeDetector runs first and hands over to our engine when\n * missing or failing (see native.ts).\n */\nexport function createDecodeRunner(useWorker: boolean, useNativeDetector = false): DecodeRunner {\n  const engine = () => createEngineRunner(useWorker);\n  if (useNativeDetector) {\n    const native = tryCreateNativeRunner(engine);\n    if (native) return native;\n  }\n  return engine();\n}\n\nfunction createEngineRunner(useWorker: boolean): DecodeRunner {\n  if (useWorker) {\n    const worker = tryCreateWorker();\n    if (worker) return createWorkerRunner(worker, createInlineRunner);\n  }\n  return createInlineRunner();\n}\n\n/** Synchronous, main-thread decode — the always-available fallback. */\nfunction createInlineRunner(): DecodeRunner {\n  return {\n    scan: (image, options) => Promise.resolve(scanFrame(image, options)),\n    destroy(): void {},\n  };\n}\n\nfunction tryCreateWorker(): Worker | null {\n  try {\n    if (typeof Worker === 'undefined') return null;\n    // Bundlers (Vite, webpack, …) statically recognize this exact pattern\n    // and take care of serving the worker chunk.\n    return new Worker(new URL('./worker.js', import.meta.url), { type: 'module' });\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Runs scans on a module worker, but self-heals: if the worker fails at\n * runtime (`onerror` — a 404 on the chunk, a CSP block, an offline\n * precache miss), it terminates the worker and permanently hands over to the\n * inline engine, re-running any in-flight scans there instead of rejecting\n * them forever. This mirrors the native-detector fallback in native.ts, so a\n * scanner started with useWorker never gets stuck emitting errors.\n */\nfunction createWorkerRunner(worker: Worker, fallback: () => DecodeRunner): DecodeRunner {\n  let nextId = 0;\n  const pending = new Map<\n    number,\n    {\n      image: ImageDataLike;\n      options: ScanFrameOptions;\n      resolve: (r: FrameScan) => void;\n      reject: (e: Error) => void;\n    }\n  >();\n  let inline: DecodeRunner | null = null;\n\n  worker.onmessage = (event: MessageEvent<WorkerResponse>) => {\n    const { id, results, detections, error } = event.data;\n    const entry = pending.get(id);\n    if (!entry) return;\n    pending.delete(id);\n    // A per-message `error` is the worker reporting a single frame threw — a\n    // decode fault, not a worker failure. Reject so it surfaces like the inline\n    // engine's throw would; it does not trigger the self-heal fallback.\n    if (error !== undefined) entry.reject(new Error(error));\n    else entry.resolve({ results: results ?? [], detections: detections ?? [] });\n  };\n  worker.onerror = () => {\n    if (inline) return;\n    // The worker itself died: switch to the inline engine and rescue every\n    // in-flight scan by re-running it there instead of rejecting it.\n    inline = fallback();\n    worker.terminate();\n    const inflight = [...pending.values()];\n    pending.clear();\n    for (const entry of inflight) {\n      inline.scan(entry.image, entry.options).then(entry.resolve, entry.reject);\n    }\n  };\n\n  return {\n    scan(image, options): Promise<FrameScan> {\n      if (inline) return inline.scan(image, options);\n      const id = nextId++;\n      // Copy into a transferable buffer: the caller's frame may be reused.\n      // The original `image` is kept intact so a self-heal can re-run inline.\n      const buffer = new Uint8ClampedArray(image.data).buffer;\n      return new Promise((resolve, reject) => {\n        pending.set(id, { image, options, resolve, reject });\n        worker.postMessage({ id, buffer, width: image.width, height: image.height, options }, [\n          buffer,\n        ]);\n      });\n    },\n    destroy(): void {\n      if (!inline) worker.terminate();\n      inline?.destroy();\n      // Reject rather than drop: a scan promise that never settles strands its\n      // awaiting caller (and the frame it captured) for the life of the page,\n      // so a mount/unmount cycle leaks one of each.\n      const inflight = [...pending.values()];\n      pending.clear();\n      for (const entry of inflight) {\n        entry.reject(new DecodeError('runner-failed', 'decode runner was destroyed'));\n      }\n    },\n  };\n}\n","import { parseContent } from '../content/parse.js';\nimport type { QrResult, StructuredAppend } from '../types.js';\n\n/** How long a partial sequence waits for its remaining symbols. */\nconst DEFAULT_PART_TTL_MS = 30_000;\n\n/**\n * Whether a header can actually address a slot in a sequence worth waiting\n * for. A symbol carrying a degenerate header (a one-symbol \"sequence\", or an\n * index past the end — reachable through a miscorrection, since the header is\n * only RS-protected) is a complete payload on its own and must be emitted\n * rather than withheld for parts that will never arrive.\n */\nexport function isReassemblable(header: StructuredAppend | undefined): header is StructuredAppend {\n  return header !== undefined && header.total >= 2 && header.index < header.total;\n}\n\n/**\n * Collects structured-append symbols across scan ticks and joins a sequence\n * once every part has been seen and the parity byte (XOR of all payload\n * bytes) checks out. Parts re-seen while in view refresh their sequence and\n * replace earlier sightings, so a transiently misdecoded part heals itself.\n * A completed sequence keeps returning its joined result on later sightings;\n * the scanner's deduper decides when that re-fires.\n */\nexport class StructuredAppendAssembler {\n  private readonly sequences = new Map<\n    string,\n    { parts: Map<number, QrResult>; lastSeenAt: number }\n  >();\n\n  constructor(private readonly ttlMs = DEFAULT_PART_TTL_MS) {}\n\n  /**\n   * Records one symbol carrying a structured-append header. Returns the\n   * joined result when its sequence is complete and parity-valid, else null.\n   */\n  add(result: QrResult, now: number): QrResult | null {\n    const header = result.structuredAppend;\n    if (!isReassemblable(header)) return null;\n    this.expire(now);\n\n    const key = `${header.total}:${header.parity}`;\n    let sequence = this.sequences.get(key);\n    if (!sequence) {\n      sequence = { parts: new Map(), lastSeenAt: now };\n      this.sequences.set(key, sequence);\n    }\n    sequence.parts.set(header.index, result);\n    sequence.lastSeenAt = now;\n    return joinParts(sequence.parts, header);\n  }\n\n  reset(): void {\n    this.sequences.clear();\n  }\n\n  private expire(now: number): void {\n    for (const [key, sequence] of this.sequences) {\n      if (now - sequence.lastSeenAt > this.ttlMs) this.sequences.delete(key);\n    }\n  }\n}\n\nfunction joinParts(parts: Map<number, QrResult>, header: StructuredAppend): QrResult | null {\n  const ordered: QrResult[] = [];\n  for (let i = 0; i < header.total; i++) {\n    const part = parts.get(i);\n    if (!part) return null;\n    ordered.push(part);\n  }\n\n  let totalBytes = 0;\n  for (const part of ordered) totalBytes += part.bytes.length;\n  const bytes = new Uint8Array(totalBytes);\n  let offset = 0;\n  let parity = 0;\n  for (const part of ordered) {\n    bytes.set(part.bytes, offset);\n    offset += part.bytes.length;\n    for (const byte of part.bytes) parity ^= byte;\n  }\n  // A parity mismatch means a misdecoded part or two interleaved sequences\n  // sharing a bucket — withhold and let re-sightings replace the bad part.\n  if (parity !== header.parity) return null;\n\n  const text = ordered.map((part) => part.text).join('');\n  // Geometry and symbol metadata come from the sequence's final symbol.\n  const last = ordered[ordered.length - 1]!;\n  return {\n    ...last,\n    text,\n    bytes,\n    segments: ordered.flatMap((part) => part.segments),\n    ecc: {\n      blocks: ordered.reduce((sum, part) => sum + part.ecc.blocks, 0),\n      codewordsCorrected: ordered.reduce((sum, part) => sum + part.ecc.codewordsCorrected, 0),\n    },\n    content: parseContent(text, { gs1: last.fnc1?.position === 'first' }),\n  };\n}\n","import {\n  type CameraCapabilities,\n  applyTorch,\n  applyZoom,\n  getTrackCapabilities,\n} from '../camera/capabilities.js';\nimport { CameraError } from '../camera/errors.js';\nimport {\n  type FrameSource,\n  type Region,\n  clampRegion,\n  createCanvasFrameSource,\n} from '../camera/frame-grabber.js';\nimport { type CameraOptions, startStream, stopStream } from '../camera/stream.js';\nimport { DecodeError } from '../errors.js';\nimport type { Detection, QrResult } from '../types.js';\nimport { Deduper } from './dedupe.js';\nimport { type DecodeRunner, createDecodeRunner } from './runner.js';\nimport { StructuredAppendAssembler, isReassemblable } from './structured-append.js';\n\nexport interface QrScannerOptions {\n  camera?: CameraOptions;\n  /** Decode attempts per second; frames in between are skipped. Default 15. */\n  maxScansPerSecond?: number;\n  /** Restrict decoding to a sub-rectangle of the video (a big CPU saver). */\n  scanRegion?: Region | ((video: HTMLVideoElement) => Region);\n  /** Decode in a Web Worker when available. Default true. */\n  useWorker?: boolean;\n  /**\n   * Use the browser's BarcodeDetector when available, falling back to our\n   * engine when it is missing or fails at runtime. Faster on supporting\n   * Chromium, but native results carry placeholder codec metadata (version,\n   * mask, ecc, EC level) — see the README. Off by default; fixed at start().\n   */\n  useNativeDetector?: boolean;\n  /** Pause scanning while the page is hidden. Default true. */\n  pauseOnHidden?: boolean;\n  /** Also try inverted (light-on-dark) symbols. Default true. */\n  tryInverted?: boolean;\n  /** Extra decode passes per frame (see DecodeImageOptions). Default false. */\n  tryHarder?: boolean;\n  /** Downscale huge frames by up to this factor before decoding. Default 2. */\n  maxDownscale?: number;\n  /**\n   * Quiet period before the same payload fires again, timed from when the code\n   * was last *seen* — not from when it last fired. Every frame the symbol stays\n   * in view refreshes its timer, so a code held steadily in front of the camera\n   * fires **once**: it has to leave the frame for longer than this window before\n   * it can fire again. `0` disables deduping entirely (every decoded frame\n   * fires). Default 1500 ms.\n   */\n  dedupeWindowMs?: number;\n  /** Stop the camera after the first successful decode. Default false. */\n  stopOnDecode?: boolean;\n  /**\n   * Decode every code in the frame instead of stopping at the first; each\n   * decoded symbol fires its own decode event (deduped per payload).\n   * Default false.\n   */\n  multiple?: boolean;\n  /**\n   * How to handle structured-append sequences (one payload split across\n   * several symbols): 'reassemble' (default) withholds the parts and fires a\n   * single decode event with the joined payload once every symbol has been\n   * seen (combine with `multiple` when all symbols share the frame);\n   * 'individual' fires each symbol as its own result.\n   */\n  structuredAppend?: 'reassemble' | 'individual';\n  onDecode?: (result: QrResult) => void;\n  /**\n   * Fires on every scanned frame with the located symbol candidates (video\n   * pixel coordinates, before/regardless of a successful decode), or null\n   * when the frame contains none — drive live outline overlays with this.\n   */\n  onDetect?: (detections: Detection[] | null) => void;\n  onError?: (error: ScannerError) => void;\n}\n\n/**\n * The `error` event carries either flavor of the typed contract: `CameraError`\n * for camera/stream faults (permission, device, stream setup) and `DecodeError`\n * for decode-runner faults (a frame failing to decode, the Web Worker\n * crashing). Match on `error.name` (or `instanceof`) to tell them apart.\n */\nexport type ScannerError = CameraError | DecodeError;\n\n/** Options changeable while the scanner runs (via update()). */\nexport type QrScannerUpdate = Pick<\n  QrScannerOptions,\n  | 'maxScansPerSecond'\n  | 'scanRegion'\n  | 'tryInverted'\n  | 'tryHarder'\n  | 'maxDownscale'\n  | 'dedupeWindowMs'\n  | 'stopOnDecode'\n  | 'multiple'\n  | 'structuredAppend'\n>;\n\nexport interface ScannerEventMap {\n  decode: QrResult;\n  detect: Detection[] | null;\n  error: ScannerError;\n  start: undefined;\n  stop: undefined;\n}\n\n/**\n * Internal dependency seams, injectable for tests (fake camera, manual\n * scheduling, controlled clock). Not part of the supported public API.\n */\nexport interface ScannerInternals {\n  mediaDevices?: MediaDevices;\n  createFrameSource?: (video: HTMLVideoElement) => FrameSource;\n  createRunner?: (useWorker: boolean, useNativeDetector: boolean) => DecodeRunner;\n  now?: () => number;\n  /** Schedules the next tick; returns a cancel function. */\n  schedule?: (video: HTMLVideoElement, callback: () => void) => () => void;\n}\n\ntype ScannerState = 'idle' | 'starting' | 'scanning' | 'paused' | 'destroyed';\n\nexport class QrScanner {\n  private readonly video: HTMLVideoElement;\n  private readonly options: Required<\n    Pick<\n      QrScannerOptions,\n      | 'maxScansPerSecond'\n      | 'useWorker'\n      | 'useNativeDetector'\n      | 'pauseOnHidden'\n      | 'tryInverted'\n      | 'tryHarder'\n      | 'maxDownscale'\n      | 'dedupeWindowMs'\n      | 'stopOnDecode'\n      | 'multiple'\n      | 'structuredAppend'\n    >\n  > & { camera: CameraOptions; scanRegion: QrScannerOptions['scanRegion'] };\n  private readonly internals: Required<ScannerInternals>;\n  private readonly deduper: Deduper;\n  private readonly assembler = new StructuredAppendAssembler();\n  private readonly listeners = new Map<keyof ScannerEventMap, Set<(payload: never) => void>>();\n\n  private state: ScannerState = 'idle';\n  private stream: MediaStream | null = null;\n  /**\n   * Generation token invalidating in-flight stream acquisitions. Every\n   * acquisition takes a new generation, and stop()/destroy() bump it; an\n   * awaited getUserMedia that resolves under a stale generation no longer\n   * owns the scanner — it must stop the stream it acquired and bail instead\n   * of resurrecting state that was torn down behind its back.\n   */\n  private startGen = 0;\n  private frameSource: FrameSource | null = null;\n  private runner: DecodeRunner | null = null;\n  private cancelTick: (() => void) | null = null;\n  private lastDecodeAt = Number.NEGATIVE_INFINITY;\n  private decoding = false;\n  /**\n   * Set only while the *automatic* hidden-page pause owns the suspension, so\n   * returning to the page resumes it. Any explicit pause()/resume()/stop()\n   * clears it — a caller who paused on purpose while the page was in the\n   * background must not be resumed behind their back when it comes forward.\n   */\n  private hiddenPause = false;\n  /** A pause requested during the async 'starting' window, honored at start. */\n  private pendingPause = false;\n  private readonly onVisibilityChange = (): void => {\n    if (!this.options.pauseOnHidden || typeof document === 'undefined') return;\n    if (document.visibilityState === 'hidden') {\n      if (this.state === 'scanning') {\n        this.pause();\n        // Claimed *after* pause(), which clears the flag: ownership of the\n        // suspension goes to whichever of the two paused last.\n        this.hiddenPause = true;\n      }\n    } else if (this.hiddenPause) {\n      this.hiddenPause = false;\n      this.resume();\n    }\n  };\n\n  constructor(\n    video: HTMLVideoElement,\n    options: QrScannerOptions = {},\n    internals: ScannerInternals = {},\n  ) {\n    this.video = video;\n    this.options = {\n      camera: options.camera ?? {},\n      maxScansPerSecond: options.maxScansPerSecond ?? 15,\n      scanRegion: options.scanRegion,\n      useWorker: options.useWorker ?? true,\n      useNativeDetector: options.useNativeDetector ?? false,\n      pauseOnHidden: options.pauseOnHidden ?? true,\n      tryInverted: options.tryInverted ?? true,\n      tryHarder: options.tryHarder ?? false,\n      maxDownscale: options.maxDownscale ?? 2,\n      dedupeWindowMs: options.dedupeWindowMs ?? 1500,\n      stopOnDecode: options.stopOnDecode ?? false,\n      multiple: options.multiple ?? false,\n      structuredAppend: options.structuredAppend ?? 'reassemble',\n    };\n    this.internals = {\n      mediaDevices: internals.mediaDevices ?? (undefined as unknown as MediaDevices),\n      createFrameSource: internals.createFrameSource ?? createCanvasFrameSource,\n      createRunner: internals.createRunner ?? createDecodeRunner,\n      now: internals.now ?? (() => Date.now()),\n      schedule: internals.schedule ?? defaultSchedule,\n    };\n    this.deduper = new Deduper(this.options.dedupeWindowMs);\n    if (options.onDecode) this.on('decode', options.onDecode);\n    if (options.onDetect) this.on('detect', options.onDetect);\n    if (options.onError) this.on('error', options.onError);\n  }\n\n  /** Requests the camera, attaches it to the video, and starts scanning. */\n  async start(): Promise<void> {\n    if (this.state === 'destroyed') throw new Error('scanner was destroyed');\n    if (this.state === 'scanning' || this.state === 'starting') return;\n    if (this.state === 'paused' && this.stream) {\n      this.resume();\n      return;\n    }\n\n    this.state = 'starting';\n    const gen = ++this.startGen;\n    try {\n      const stream = await startStream(this.options.camera, this.internals.mediaDevices);\n      if (gen !== this.startGen) {\n        // stop()/destroy() (or a newer acquisition) superseded us mid-await;\n        // the stream we just got has no owner, so release it and stay down.\n        stopStream(stream);\n        return;\n      }\n      this.stream = stream;\n      await this.attachStream();\n    } catch (error) {\n      if (gen === this.startGen) {\n        this.state = 'idle';\n        this.releaseStream();\n      }\n      throw CameraError.from(error);\n    }\n    // Superseded during attach: whoever bumped the generation already\n    // released this.stream (stop/destroy) or took it over (a new acquisition).\n    if (gen !== this.startGen) return;\n\n    this.frameSource ??= this.internals.createFrameSource(this.video);\n    this.runner ??= this.internals.createRunner(\n      this.options.useWorker,\n      this.options.useNativeDetector,\n    );\n    if (this.options.pauseOnHidden && typeof document !== 'undefined') {\n      document.addEventListener('visibilitychange', this.onVisibilityChange);\n    }\n    this.state = 'scanning';\n    this.deduper.reset();\n    this.assembler.reset();\n    this.emit('start', undefined);\n    // A pause() (or resume()) issued while we were 'starting' is applied now\n    // that scanning has actually begun, so an initial suspend lands.\n    if (this.pendingPause) {\n      this.pendingPause = false;\n      this.pause();\n      return;\n    }\n    this.scheduleNext();\n  }\n\n  /** Stops scanning and releases the camera. */\n  stop(): void {\n    if (this.state === 'idle' || this.state === 'destroyed') return;\n    this.startGen++; // invalidate any in-flight stream acquisition\n    this.pendingPause = false;\n    this.hiddenPause = false; // else a later start() inherits a stale claim\n    this.cancelLoop();\n    this.releaseStream();\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('visibilitychange', this.onVisibilityChange);\n    }\n    this.state = 'idle';\n    this.emit('stop', undefined);\n  }\n\n  /** Suspends decoding but keeps the camera stream alive. */\n  pause(): void {\n    // A pause requested mid-startup is remembered and honored once start()\n    // reaches 'scanning' — otherwise the initial suspend would silently no-op.\n    if (this.state === 'starting') {\n      this.pendingPause = true;\n      return;\n    }\n    // Taken before the state check on purpose: pausing a scanner the hidden-page\n    // handler already suspended is not a no-op, it transfers ownership of the\n    // suspension, so returning to the page leaves it paused.\n    this.hiddenPause = false;\n    if (this.state !== 'scanning') return;\n    this.cancelLoop();\n    this.state = 'paused';\n  }\n\n  /** Resumes decoding after pause(). */\n  resume(): void {\n    // Mirror pause(): a resume during startup cancels a pending initial pause.\n    if (this.state === 'starting') {\n      this.pendingPause = false;\n      return;\n    }\n    this.hiddenPause = false;\n    if (this.state !== 'paused') return;\n    this.state = 'scanning';\n    this.scheduleNext();\n  }\n\n  /** Full teardown; the instance cannot be reused afterwards. */\n  destroy(): void {\n    this.stop();\n    this.startGen++; // stop() no-ops from 'idle'; in-flight acquisitions must still die\n    this.runner?.destroy();\n    this.runner = null;\n    this.frameSource?.destroy();\n    this.frameSource = null;\n    this.listeners.clear();\n    this.state = 'destroyed';\n  }\n\n  /** Switches cameras (facing mode or explicit device) without stopping. */\n  async setCamera(camera: CameraOptions): Promise<void> {\n    if (this.state === 'destroyed') throw new Error('scanner was destroyed');\n    this.options.camera = camera;\n    // A switch requested while start() is still awaiting getUserMedia has to\n    // supersede that acquisition rather than queue behind it: `this.stream` is\n    // not assigned yet, so the early return below would leave the scanner\n    // coming up on the *previous* camera while reporting success.\n    if (this.state === 'starting') {\n      this.startGen++; // the superseded acquisition releases whatever it got\n      this.cancelLoop();\n      this.releaseStream(); // a stream already assigned mid-attach is ours to stop\n      this.state = 'idle';\n      await this.start();\n      return;\n    }\n    if (!this.stream) return;\n    const wasScanning = this.state === 'scanning';\n    this.cancelLoop();\n    this.releaseStream();\n    const gen = ++this.startGen;\n    try {\n      const stream = await startStream(camera, this.internals.mediaDevices);\n      if (gen !== this.startGen) {\n        // destroy()/stop() during the switch: the replacement stream has no\n        // owner — release it and leave the teardown in place.\n        stopStream(stream);\n        return;\n      }\n      this.stream = stream;\n      await this.attachStream();\n    } catch (error) {\n      // The old stream is already gone; a half-switched scanner would report\n      // 'scanning' with no camera and no loop, so tear down cleanly instead.\n      if (gen === this.startGen) this.stop();\n      throw CameraError.from(error);\n    }\n    if (gen !== this.startGen) return;\n    if (wasScanning) {\n      this.state = 'scanning';\n      this.scheduleNext();\n    }\n  }\n\n  /** True if the torch was toggled; false when unsupported. */\n  async setTorch(on: boolean): Promise<boolean> {\n    const track = this.videoTrack();\n    return track ? applyTorch(track, on) : false;\n  }\n\n  /** True if zoom was applied (clamped to range); false when unsupported. */\n  async setZoom(zoom: number): Promise<boolean> {\n    const track = this.videoTrack();\n    return track ? applyZoom(track, zoom) : false;\n  }\n\n  getCapabilities(): CameraCapabilities {\n    const track = this.videoTrack();\n    return track ? getTrackCapabilities(track) : { torch: false, zoom: null };\n  }\n\n  /** Adjusts runtime options without restarting the camera. */\n  update(options: QrScannerUpdate): void {\n    if (options.maxScansPerSecond !== undefined) {\n      this.options.maxScansPerSecond = options.maxScansPerSecond;\n    }\n    if ('scanRegion' in options) this.options.scanRegion = options.scanRegion;\n    if (options.tryInverted !== undefined) this.options.tryInverted = options.tryInverted;\n    if (options.tryHarder !== undefined) this.options.tryHarder = options.tryHarder;\n    if (options.maxDownscale !== undefined) this.options.maxDownscale = options.maxDownscale;\n    if (options.dedupeWindowMs !== undefined) {\n      this.options.dedupeWindowMs = options.dedupeWindowMs;\n      this.deduper.setWindow(options.dedupeWindowMs);\n    }\n    if (options.stopOnDecode !== undefined) this.options.stopOnDecode = options.stopOnDecode;\n    if (options.multiple !== undefined) this.options.multiple = options.multiple;\n    if (options.structuredAppend !== undefined) {\n      this.options.structuredAppend = options.structuredAppend;\n    }\n  }\n\n  on<E extends keyof ScannerEventMap>(\n    event: E,\n    listener: (payload: ScannerEventMap[E]) => void,\n  ): void {\n    let set = this.listeners.get(event);\n    if (!set) {\n      set = new Set();\n      this.listeners.set(event, set);\n    }\n    set.add(listener as (payload: never) => void);\n  }\n\n  off<E extends keyof ScannerEventMap>(\n    event: E,\n    listener: (payload: ScannerEventMap[E]) => void,\n  ): void {\n    this.listeners.get(event)?.delete(listener as (payload: never) => void);\n  }\n\n  private emit<E extends keyof ScannerEventMap>(event: E, payload: ScannerEventMap[E]): void {\n    const set = this.listeners.get(event);\n    if (!set) return;\n    for (const listener of set) {\n      (listener as (p: ScannerEventMap[E]) => void)(payload);\n    }\n  }\n\n  private async attachStream(): Promise<void> {\n    // playsinline + muted are required for autoplay on iOS Safari.\n    this.video.muted = true;\n    if (typeof this.video.setAttribute === 'function') {\n      this.video.setAttribute('playsinline', '');\n    }\n    this.video.srcObject = this.stream;\n    await this.video.play();\n  }\n\n  private releaseStream(): void {\n    if (this.stream) {\n      stopStream(this.stream);\n      this.stream = null;\n    }\n    this.video.srcObject = null;\n  }\n\n  private videoTrack(): MediaStreamTrack | null {\n    return this.stream?.getVideoTracks()[0] ?? null;\n  }\n\n  private cancelLoop(): void {\n    this.cancelTick?.();\n    this.cancelTick = null;\n  }\n\n  private scheduleNext(): void {\n    if (this.state !== 'scanning') return;\n    this.cancelTick = this.internals.schedule(this.video, () => {\n      void this.tick();\n    });\n  }\n\n  private async tick(): Promise<void> {\n    if (this.state !== 'scanning') return;\n    const now = this.internals.now();\n    const interval = 1000 / this.options.maxScansPerSecond;\n    if (this.decoding || now - this.lastDecodeAt < interval) {\n      this.scheduleNext();\n      return;\n    }\n\n    const region = this.resolveRegion();\n    const frame = this.frameSource?.grab(region) ?? null;\n    if (!frame) {\n      this.scheduleNext();\n      return;\n    }\n    // grab() captures the region clamped to the frame bounds, so results must\n    // be offset by the rectangle actually captured. Offsetting by the raw\n    // request instead shifts every corner point whenever the region runs off\n    // the frame or carries a fractional origin (a centered square from\n    // videoWidth commonly does).\n    const origin = region\n      ? clampRegion(region, this.video.videoWidth, this.video.videoHeight)\n      : null;\n\n    this.lastDecodeAt = now;\n    this.decoding = true;\n    try {\n      const scan = await this.runner!.scan(frame, {\n        tryInverted: this.options.tryInverted,\n        tryHarder: this.options.tryHarder,\n        maxDownscale: this.options.maxDownscale,\n        multiple: this.options.multiple,\n      });\n      if (this.state === 'scanning') {\n        if (origin) {\n          for (const item of [...scan.results, ...scan.detections]) {\n            for (const point of item.cornerPoints) {\n              point.x += origin.x;\n              point.y += origin.y;\n            }\n          }\n        }\n        this.emit('detect', scan.detections.length > 0 ? scan.detections : null);\n        for (const result of scan.results) {\n          // Only a header that can actually address a sequence slot goes to the\n          // assembler. A degenerate one (total 1, or index past the end) would\n          // be withheld forever, silently swallowing a symbol that decoded\n          // fine, so it fires on its own instead.\n          const emitted =\n            this.options.structuredAppend === 'reassemble' &&\n            isReassemblable(result.structuredAppend)\n              ? this.assembler.add(result, this.internals.now())\n              : result;\n          if (!emitted) continue;\n          if (!this.deduper.shouldEmit(emitted.text, this.internals.now())) continue;\n          this.emit('decode', emitted);\n          if (this.options.stopOnDecode) {\n            this.decoding = false;\n            this.stop();\n            return;\n          }\n        }\n      }\n    } catch (error) {\n      // A throw here comes from the decode runner (a frame that failed to\n      // decode, or the Web Worker crashing) — not the camera stream, so it\n      // surfaces as a DecodeError rather than being mislabeled stream-failed.\n      this.emit('error', DecodeError.from(error));\n    } finally {\n      this.decoding = false;\n    }\n    this.scheduleNext();\n  }\n\n  private resolveRegion(): Region | undefined {\n    const { scanRegion } = this.options;\n    if (!scanRegion) return undefined;\n    return typeof scanRegion === 'function' ? scanRegion(this.video) : scanRegion;\n  }\n}\n\n/** requestVideoFrameCallback → requestAnimationFrame → setTimeout. */\nfunction defaultSchedule(video: HTMLVideoElement, callback: () => void): () => void {\n  const withRvfc = video as HTMLVideoElement & {\n    requestVideoFrameCallback?: (cb: () => void) => number;\n    cancelVideoFrameCallback?: (id: number) => void;\n  };\n  if (typeof withRvfc.requestVideoFrameCallback === 'function') {\n    const id = withRvfc.requestVideoFrameCallback(callback);\n    return () => withRvfc.cancelVideoFrameCallback?.(id);\n  }\n  if (typeof requestAnimationFrame === 'function') {\n    const id = requestAnimationFrame(callback);\n    return () => cancelAnimationFrame(id);\n  }\n  const id = setTimeout(callback, 16);\n  return () => clearTimeout(id);\n}\n"]}