matsci-parse 0.8.4 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +933 -440
- package/dist/index.js.map +1 -1
- package/dist/stats.html +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../lib/core/structure/operations/canonicalize.ts","../lib/core/structure/operations/hashStructure.ts","../lib/core/structure/operations/sites/appendSite.ts","../lib/core/structure/operations/sites/insertSite.ts","../lib/core/structure/operations/sites/removeSite.ts","../lib/core/structure/operations/sites/replaceSite.ts","../lib/core/matrix/matrix.ts","../lib/core/lattice/lattice.ts","../lib/core/matrix/operations/vector/dot.ts","../lib/core/matrix/operations/vector/norm.ts","../lib/core/lattice/angles.ts","../lib/core/matrix/operations/inverse/inverse3x3.ts","../lib/core/lattice/inverse.ts","../lib/core/lattice/lengths.ts","../lib/core/matrix/operations/transpose.ts","../lib/core/matrix/operations/mul.ts","../lib/core/lattice/metricTensor.ts","../lib/core/lattice/parameters.ts","../lib/core/lattice/reciprocalLattice.ts","../lib/core/lattice/reciprocalLatticeCrystallographic.ts","../lib/core/lattice/create/fromParameters.ts","../lib/core/lattice/create/cubic.ts","../lib/core/lattice/create/hexagonal.ts","../lib/core/lattice/create/monoclinic.ts","../lib/core/lattice/create/orthorhombic.ts","../lib/core/lattice/create/rhombohedral.ts","../lib/core/lattice/create/tetragonal.ts","../lib/core/structure/operations/symmetry/spglib.ts","../lib/core/structure/operations/supercell.ts","../lib/core/matrix/operations/determinant.ts","../lib/core/lattice/volume.ts","../lib/core/structure/properties/volume.ts","../lib/core/structure/properties/formula.ts","../lib/core/data/periodictable/atomicData.ts","../lib/core/structure/properties/cellMass.ts","../lib/core/structure/properties/density.ts","../lib/core/site/site.ts","../lib/core/site/cartesian.ts","../lib/core/site/fractional.ts","../lib/core/site/distance.ts","../lib/core/site/wrap.ts","../lib/core/species/species.ts","../lib/core/io/cif.ts","../lib/core/io/poscar.ts","../lib/core/io/structuredata.ts","../lib/core/io/xsf.ts","../lib/core/io/xyz.ts","../lib/core/io/optimade.ts","../lib/core/io/json.ts","../lib/core/units/converter.ts","../lib/core/units/length.ts","../lib/core/units/energy.ts","../lib/core/units/angle.ts"],"sourcesContent":["import { Structure } from \"../../structure/structure\";\n\nconst EPS = 1e-12;\n\nfunction wrap(x: number): number {\n const v = x - Math.floor(x);\n return Math.abs(v) < EPS ? 0 : v;\n}\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function canonicalize(structure: Structure): Structure {\n return {\n ...structure,\n sites: structure.sites.map((site) => ({\n ...site,\n frac: new Float64Array([\n wrap(clean(site.frac[0])),\n wrap(clean(site.frac[1])),\n wrap(clean(site.frac[2])),\n ]),\n })),\n };\n}\n","import { Structure } from \"../structure\";\nimport { canonicalize } from \"./canonicalize\";\nimport { Vec3 } from \"@/main\";\n\nfunction toFixedArray(v: Vec3, precision = 8): string {\n return Array.from(v)\n .map((x) => x.toFixed(precision))\n .join(\",\");\n}\n\nfunction fnv1a(str: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash *= 16777619;\n }\n\n return hash >>> 0;\n}\n\nexport function hashStructure(structure: Structure): number {\n const s = canonicalize(structure);\n\n const lattice = s.lattice.basis.data;\n const latticeKey = toFixedArray(lattice);\n\n const sitesKey = s.sites\n .map((site) => {\n return site.species + \":\" + toFixedArray(site.frac);\n })\n .sort()\n .join(\"|\");\n\n const key = latticeKey + \"::\" + sitesKey;\n\n return fnv1a(key);\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function appendSite(structure: Structure, site: Site): Structure {\n return {\n ...structure,\n sites: [...structure.sites, site],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function insertSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: [\n ...structure.sites.slice(0, index),\n site,\n ...structure.sites.slice(index),\n ],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function removeSite(structure: Structure, index: number): Structure {\n return {\n ...structure,\n sites: structure.sites.filter((_, i) => i !== index),\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function replaceSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n return {\n ...structure,\n sites: structure.sites.map((s, i) => (i === index ? site : s)),\n };\n}\n","export interface Matrix {\n readonly rows: number;\n readonly cols: number;\n readonly data: Float64Array;\n}\n\nexport function createMatrix(\n rows: number,\n cols: number,\n data?: Iterable<number>,\n): Matrix {\n const size = rows * cols;\n\n const buffer = data ? Float64Array.from(data) : new Float64Array(size);\n\n if (buffer.length !== size) {\n throw new Error(`Expected ${size} values, got ${buffer.length}`);\n }\n\n return {\n rows,\n cols,\n data: buffer,\n };\n}\n\nexport function identity(size: number): Matrix {\n const data = new Float64Array(size * size);\n\n for (let i = 0; i < size; i++) {\n data[i * size + i] = 1;\n }\n\n return {\n rows: size,\n cols: size,\n data,\n };\n}\n\nexport function clone(matrix: Matrix): Matrix {\n return {\n rows: matrix.rows,\n cols: matrix.cols,\n data: new Float64Array(matrix.data),\n };\n}\n\nexport function index(cols: number, row: number, col: number): number {\n return row * cols + col;\n}\n","import { createMatrix, Matrix } from \"../matrix/matrix\";\n\nconst EPS = 1e-12;\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function createLattice(data: number[] | Float64Array | Matrix): Lattice {\n const values =\n data instanceof Float64Array ? data : \"data\" in data ? data.data : data;\n\n if (values.length !== 9) {\n throw new Error(\"Lattice requires 9 values (3x3)\");\n }\n\n const cleaned = new Float64Array(9);\n\n for (let i = 0; i < 9; i++) {\n cleaned[i] = clean(values[i]);\n }\n\n return {\n basis: createMatrix(3, 3, cleaned),\n };\n}\n","import { Vector } from \"../../vector\";\n\nexport function dot(a: Vector, b: Vector): number {\n if (a.length !== b.length) {\n throw new Error(\"Dot product requires same-length vectors\");\n }\n\n let sum = 0;\n\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n","import { Vector } from \"../../vector\";\n\nconst EPS = 1e-12;\n\nexport function norm(v: Vector): number {\n let sum = 0;\n\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n sum += x * x;\n }\n\n return Math.sqrt(sum);\n}\n","import { dot } from \"../matrix/operations/vector/dot\";\nimport { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\n\nimport { Vector } from \"../matrix/vector\";\n\nfunction angle(u: Vector, v: Vector) {\n const denom = norm(u) * norm(v);\n if (denom === 0) throw new Error(\"Zero-length lattice vector\");\n\n const c = dot(u, v) / denom;\n const clamped = Math.max(-1, Math.min(1, c));\n\n return Math.acos(clamped);\n}\n\nexport function angles(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Vector = new Float64Array([m[0], m[1], m[2]]);\n const b: Vector = new Float64Array([m[3], m[4], m[5]]);\n const c: Vector = new Float64Array([m[6], m[7], m[8]]);\n\n const alpha = angle(b, c);\n const beta = angle(a, c);\n const gamma = angle(a, b);\n\n return [alpha, beta, gamma];\n}\n","import { Matrix, createMatrix } from \"../../matrix\";\n\nexport function inverse3x3(m: Matrix): Matrix {\n if (m.rows !== 3 || m.cols !== 3) {\n throw new Error(\"Expected 3x3 matrix\");\n }\n\n const a00 = m.data[0],\n a01 = m.data[1],\n a02 = m.data[2];\n const a10 = m.data[3],\n a11 = m.data[4],\n a12 = m.data[5];\n const a20 = m.data[6],\n a21 = m.data[7],\n a22 = m.data[8];\n\n const c00 = a11 * a22 - a12 * a21;\n const c01 = a12 * a20 - a10 * a22;\n const c02 = a10 * a21 - a11 * a20;\n\n const c10 = a02 * a21 - a01 * a22;\n const c11 = a00 * a22 - a02 * a20;\n const c12 = a01 * a20 - a00 * a21;\n\n const c20 = a01 * a12 - a02 * a11;\n const c21 = a02 * a10 - a00 * a12;\n const c22 = a00 * a11 - a01 * a10;\n\n const det = a00 * c00 + a01 * c01 + a02 * c02;\n\n if (det === 0) {\n throw new Error(\"Singular matrix\");\n }\n\n const invDet = 1 / det;\n\n const out = createMatrix(3, 3);\n\n out.data[0] = c00 * invDet;\n out.data[1] = c10 * invDet;\n out.data[2] = c20 * invDet;\n\n out.data[3] = c01 * invDet;\n out.data[4] = c11 * invDet;\n out.data[5] = c21 * invDet;\n\n out.data[6] = c02 * invDet;\n out.data[7] = c12 * invDet;\n out.data[8] = c22 * invDet;\n\n return out;\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse3x3 } from \"../matrix/operations/inverse/inverse3x3\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function inverse(lattice: Lattice): Matrix {\n return inverse3x3(lattice.basis);\n}\n","import { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\nexport function lengths(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Float64Array = new Float64Array([m[0], m[1], m[2]]);\n const b: Float64Array = new Float64Array([m[3], m[4], m[5]]);\n const c: Float64Array = new Float64Array([m[6], m[7], m[8]]);\n\n return [norm(a), norm(b), norm(c)];\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function transpose(matrix: Matrix): Matrix {\n const out = createMatrix(matrix.cols, matrix.rows);\n\n for (let row = 0; row < matrix.rows; row++) {\n for (let col = 0; col < matrix.cols; col++) {\n out.data[index(out.cols, col, row)] =\n matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function mul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\"Invalid matrix multiplication dimensions\");\n }\n\n const out = createMatrix(a.rows, b.cols);\n\n const aRows = a.rows;\n const aCols = a.cols;\n const bCols = b.cols;\n\n for (let row = 0; row < aRows; row++) {\n for (let col = 0; col < bCols; col++) {\n let sum = 0;\n\n for (let k = 0; k < aCols; k++) {\n sum += a.data[index(a.cols, row, k)] * b.data[index(b.cols, k, col)];\n }\n\n out.data[index(out.cols, row, col)] = sum;\n }\n }\n\n return out;\n}\n","import { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Lattice } from \"./lattice\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function metricTensor(lattice: Lattice): Matrix {\n const A = lattice.basis;\n\n const AT = transpose(A);\n return mul(AT, A);\n}\n","import { lengths } from \"./lengths\";\nimport { angles } from \"./angles\";\nimport { Lattice } from \"./lattice\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport function parameters(\n lattice: Lattice,\n): [number, number, number, number, number, number] {\n const [a, b, c] = lengths(lattice);\n const [alpha, beta, gamma] = angles(lattice);\n\n return [a, b, c, alpha * RAD2DEG, beta * RAD2DEG, gamma * RAD2DEG];\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { createLattice } from \"./lattice\";\n\nconst TWO_PI = 2 * Math.PI;\n\nexport function reciprocalLattice(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const data = invT.data.map((v) => v * TWO_PI);\n\n return createLattice(data);\n}\n","import { Lattice, createLattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nexport function reciprocalLatticeCrystallographic(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n return createLattice(invT.data);\n}\n","import { createLattice } from \"../lattice\";\n\nconst DEG2RAD = Math.PI / 180;\nconst EPS = 1e-12;\n\nfunction clean(x: number) {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function fromParameters(\n a: number,\n b: number,\n c: number,\n alpha: number,\n beta: number,\n gamma: number,\n) {\n const alphaR = alpha * DEG2RAD;\n const betaR = beta * DEG2RAD;\n const gammaR = gamma * DEG2RAD;\n\n const cosA = Math.cos(alphaR);\n const cosB = Math.cos(betaR);\n const cosG = Math.cos(gammaR);\n const sinG = Math.sin(gammaR);\n\n // lattice vectors\n const v1 = [a, 0, 0];\n\n const v2 = [b * cosG, b * sinG, 0];\n\n // guard against degenerate gamma\n if (Math.abs(sinG) < EPS) {\n throw new Error(\"Invalid lattice: gamma too close to 0 or 180 degrees\");\n }\n\n const cx = c * cosB;\n\n const cy = (c * (cosA - cosB * cosG)) / sinG;\n\n const czSquared = c * c - cx * cx - cy * cy;\n\n const cz = Math.sqrt(Math.max(0, czSquared));\n\n return createLattice([\n clean(v1[0]),\n clean(v1[1]),\n clean(v1[2]),\n clean(v2[0]),\n clean(v2[1]),\n clean(v2[2]),\n clean(cx),\n clean(cy),\n clean(cz),\n ]);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function cubic(a: number) {\n return fromParameters(a, a, a, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function hexagonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 120);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function monoclinic(a: number, b: number, c: number, beta: number) {\n return fromParameters(a, b, c, 90, beta, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function orthorhombic(a: number, b: number, c: number) {\n return fromParameters(a, b, c, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function rhombohedral(a: number, alpha: number) {\n return fromParameters(a, a, a, alpha, alpha, alpha);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function tetragonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 90);\n}\n","import init, { analyze_cell, type MoyoDataset } from \"@spglib/moyo-wasm\";\n\nimport { createLattice } from \"@/core/lattice\";\nimport { Structure } from \"../../structure\";\n\nlet ready: Promise<void> | null = null;\n\nexport function initMoyo() {\n if (!ready) {\n ready = (async () => {\n // In Node.js (tests), load from filesystem\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const { readFileSync } = await import(\"fs\");\n const { join } = await import(\"path\");\n const wasmPath = join(\n process.cwd(),\n \"node_modules/@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n );\n const wasmBuffer = readFileSync(wasmPath);\n await init(wasmBuffer);\n } catch (e) {\n console.error(\"Failed to load WASM in Node:\", e);\n throw e;\n }\n } else {\n // In browser, use dynamic import to get the URL\n const wasmUrl = new URL(\n \"@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n import.meta.url,\n ).toString();\n\n await init(wasmUrl);\n }\n })();\n }\n return ready;\n}\n\nexport async function getSymmetry(\n structure: Structure,\n tolerance = 1e-4,\n setting = \"Standard\",\n): Promise<{\n primitive: Structure;\n conventional: Structure;\n calculationResults: any;\n}> {\n await initMoyo();\n\n // -----------------------------\n // 1. Build reversible mapping\n // -----------------------------\n const symbolToId = new Map<string, number>();\n const idToSymbol = new Map<number, string>();\n\n let counter = 0;\n\n const positions: number[][] = [];\n const numbers: number[] = [];\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!symbolToId.has(symbol)) {\n symbolToId.set(symbol, counter);\n idToSymbol.set(counter, symbol);\n counter++;\n }\n\n positions.push(Array.from(site.frac));\n numbers.push(symbolToId.get(symbol)!);\n }\n\n // -----------------------------\n // 2. Build Moyo input\n // -----------------------------\n const moyoInput = {\n lattice: {\n basis: Array.from(structure.lattice.basis.data),\n },\n positions,\n numbers,\n };\n\n // -----------------------------\n // 3. Run symmetry engine\n // -----------------------------\n const results = await analyze_cell(\n JSON.stringify(moyoInput),\n tolerance,\n setting,\n );\n\n // -----------------------------\n // 4. Convert Moyo cell → Structure\n // -----------------------------\n function build(cell: {\n lattice: { basis: number[] };\n positions: number[][];\n numbers: number[];\n }): Structure {\n const { lattice, positions, numbers } = cell;\n\n const species = [...new Set(numbers)].map((n: number) => ({\n symbol: idToSymbol.get(n)!,\n }));\n\n const sites = positions.map((pos: number[], i: number) => ({\n species: {\n symbol: idToSymbol.get(numbers[i])!,\n },\n frac: new Float64Array(pos),\n }));\n\n return {\n lattice: createLattice(lattice.basis),\n species,\n sites,\n };\n }\n\n // -----------------------------\n // 5. Return both structures\n // -----------------------------\n return {\n primitive: build(results.prim_std_cell),\n conventional: build(results.std_cell),\n calculationResults: results,\n };\n}\n","import { createLattice } from \"@/core/lattice/lattice\";\nimport type { Structure } from \"../structure\";\nimport type { Site } from \"@/core/site/site\";\n\ntype SupercellSize = number | [number, number, number];\n\nexport function supercell(\n structure: Structure,\n size: SupercellSize,\n): Structure {\n const [nx, ny, nz] = typeof size === \"number\" ? [size, size, size] : size;\n\n if (\n nx < 1 ||\n ny < 1 ||\n nz < 1 ||\n !Number.isInteger(nx) ||\n !Number.isInteger(ny) ||\n !Number.isInteger(nz)\n ) {\n throw new Error(\"Supercell dimensions must be positive integers\");\n }\n\n const m = structure.lattice.basis.data;\n\n // row-major scaling\n const newBasis = [\n m[0] * nx,\n m[1] * nx,\n m[2] * nx,\n\n m[3] * ny,\n m[4] * ny,\n m[5] * ny,\n\n m[6] * nz,\n m[7] * nz,\n m[8] * nz,\n ];\n\n const sites: Site[] = [];\n\n for (const site of structure.sites) {\n const [x, y, z] = site.frac;\n\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < ny; j++) {\n for (let k = 0; k < nz; k++) {\n sites.push({\n species: site.species,\n\n frac: new Float64Array([(x + i) / nx, (y + j) / ny, (z + k) / nz]),\n });\n }\n }\n }\n }\n\n return {\n lattice: createLattice(newBasis),\n sites,\n };\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nfunction minor(matrix: Matrix, skipRow: number, skipCol: number): Matrix {\n const out = createMatrix(matrix.rows - 1, matrix.cols - 1);\n\n let ptr = 0;\n\n for (let row = 0; row < matrix.rows; row++) {\n if (row === skipRow) continue;\n\n for (let col = 0; col < matrix.cols; col++) {\n if (col === skipCol) continue;\n\n out.data[ptr++] = matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n\nexport function determinant(matrix: Matrix): number {\n if (matrix.rows !== matrix.cols) {\n throw new Error(\"Determinant requires a square matrix\");\n }\n\n const n = matrix.rows;\n\n // fast path for BZ / geometry\n if (n === 3) {\n const m = matrix.data;\n\n return (\n m[0] * (m[4] * m[8] - m[5] * m[7]) -\n m[1] * (m[3] * m[8] - m[5] * m[6]) +\n m[2] * (m[3] * m[7] - m[4] * m[6])\n );\n }\n\n if (n === 1) {\n return matrix.data[0];\n }\n\n if (n === 2) {\n return matrix.data[0] * matrix.data[3] - matrix.data[1] * matrix.data[2];\n }\n\n let det = 0;\n\n for (let col = 0; col < n; col++) {\n const sign = col % 2 === 0 ? 1 : -1;\n\n det += sign * matrix.data[col] * determinant(minor(matrix, 0, col));\n }\n\n return det;\n}\n","import { determinant } from \"../matrix/operations/determinant\";\nimport { Lattice } from \"./lattice\";\n\nexport function volume(lattice: Lattice): number {\n return Math.abs(determinant(lattice.basis));\n}\n","import { Structure } from \"../structure\";\nimport { volume as latticeVolume } from \"../../lattice/volume\";\n\nexport function volume(structure: Structure): number {\n return latticeVolume(structure.lattice);\n}\n","import { Structure } from \"../structure\";\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) {\n [a, b] = [b, a % b];\n }\n\n return Math.abs(a);\n}\n\nexport function composition(structure: Structure): Record<string, number> {\n const out: Record<string, number> = {};\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n out[symbol] ??= 0;\n out[symbol]++;\n }\n\n return out;\n}\n\nfunction compositionGCD(comp: Record<string, number>): number {\n const values = Object.values(comp);\n\n return values.reduce((a, b) => gcd(a, b));\n}\n\nfunction hillOrder(elements: string[]): string[] {\n if (!elements.includes(\"C\")) {\n return [...elements].sort();\n }\n\n const rest = elements.filter((e) => e !== \"C\" && e !== \"H\").sort();\n\n return [\"C\", ...(elements.includes(\"H\") ? [\"H\"] : []), ...rest];\n}\n\nfunction formulaFromComposition(\n comp: Record<string, number>,\n ordering: (elements: string[]) => string[],\n): string {\n const elements = ordering(Object.keys(comp));\n\n return elements\n .map((el) => {\n const count = comp[el];\n\n return count === 1 ? el : `${el}${count}`;\n })\n .join(\"\");\n}\n\nfunction reducedComposition(\n comp: Record<string, number>,\n): Record<string, number> {\n const factor = compositionGCD(comp);\n\n const out: Record<string, number> = {};\n\n for (const [element, count] of Object.entries(comp)) {\n out[element] = count / factor;\n }\n\n return out;\n}\n\nexport function hillFormula(structure: Structure): string {\n return formulaFromComposition(composition(structure), hillOrder);\n}\n\nexport function reducedFormula(structure: Structure): string {\n return formulaFromComposition(\n reducedComposition(composition(structure)),\n hillOrder,\n );\n}\n","export interface ElementInfo {\n atomicNumber: number;\n symbol: string;\n name: string;\n mass: number;\n [key: string]: unknown;\n}\n\nexport const PeriodicTable: Record<number, ElementInfo> = {\n 1: { atomicNumber: 1, symbol: \"H\", name: \"Hydrogen\", mass: 1.008 },\n 2: { atomicNumber: 2, symbol: \"He\", name: \"Helium\", mass: 4.0026 },\n 3: { atomicNumber: 3, symbol: \"Li\", name: \"Lithium\", mass: 6.94 },\n 4: { atomicNumber: 4, symbol: \"Be\", name: \"Beryllium\", mass: 9.0122 },\n 5: { atomicNumber: 5, symbol: \"B\", name: \"Boron\", mass: 10.81 },\n 6: { atomicNumber: 6, symbol: \"C\", name: \"Carbon\", mass: 12.011 },\n 7: { atomicNumber: 7, symbol: \"N\", name: \"Nitrogen\", mass: 14.007 },\n 8: { atomicNumber: 8, symbol: \"O\", name: \"Oxygen\", mass: 15.999 },\n 9: { atomicNumber: 9, symbol: \"F\", name: \"Fluorine\", mass: 18.998 },\n 10: { atomicNumber: 10, symbol: \"Ne\", name: \"Neon\", mass: 20.18 },\n 11: { atomicNumber: 11, symbol: \"Na\", name: \"Sodium\", mass: 22.99 },\n 12: { atomicNumber: 12, symbol: \"Mg\", name: \"Magnesium\", mass: 24.305 },\n 13: { atomicNumber: 13, symbol: \"Al\", name: \"Aluminum\", mass: 26.982 },\n 14: { atomicNumber: 14, symbol: \"Si\", name: \"Silicon\", mass: 28.085 },\n 15: { atomicNumber: 15, symbol: \"P\", name: \"Phosphorus\", mass: 30.974 },\n 16: { atomicNumber: 16, symbol: \"S\", name: \"Sulfur\", mass: 32.06 },\n 17: { atomicNumber: 17, symbol: \"Cl\", name: \"Chlorine\", mass: 35.45 },\n 18: { atomicNumber: 18, symbol: \"Ar\", name: \"Argon\", mass: 39.948 },\n 19: { atomicNumber: 19, symbol: \"K\", name: \"Potassium\", mass: 39.098 },\n 20: { atomicNumber: 20, symbol: \"Ca\", name: \"Calcium\", mass: 40.078 },\n 21: { atomicNumber: 21, symbol: \"Sc\", name: \"Scandium\", mass: 44.956 },\n 22: { atomicNumber: 22, symbol: \"Ti\", name: \"Titanium\", mass: 47.867 },\n 23: { atomicNumber: 23, symbol: \"V\", name: \"Vanadium\", mass: 50.942 },\n 24: { atomicNumber: 24, symbol: \"Cr\", name: \"Chromium\", mass: 51.996 },\n 25: { atomicNumber: 25, symbol: \"Mn\", name: \"Manganese\", mass: 54.938 },\n 26: { atomicNumber: 26, symbol: \"Fe\", name: \"Iron\", mass: 55.845 },\n 27: { atomicNumber: 27, symbol: \"Co\", name: \"Cobalt\", mass: 58.933 },\n 28: { atomicNumber: 28, symbol: \"Ni\", name: \"Nickel\", mass: 58.693 },\n 29: { atomicNumber: 29, symbol: \"Cu\", name: \"Copper\", mass: 63.546 },\n 30: { atomicNumber: 30, symbol: \"Zn\", name: \"Zinc\", mass: 65.38 },\n 31: { atomicNumber: 31, symbol: \"Ga\", name: \"Gallium\", mass: 69.723 },\n 32: { atomicNumber: 32, symbol: \"Ge\", name: \"Germanium\", mass: 72.63 },\n 33: { atomicNumber: 33, symbol: \"As\", name: \"Arsenic\", mass: 74.922 },\n 34: { atomicNumber: 34, symbol: \"Se\", name: \"Selenium\", mass: 78.971 },\n 35: { atomicNumber: 35, symbol: \"Br\", name: \"Bromine\", mass: 79.904 },\n 36: { atomicNumber: 36, symbol: \"Kr\", name: \"Krypton\", mass: 83.798 },\n 37: { atomicNumber: 37, symbol: \"Rb\", name: \"Rubidium\", mass: 85.468 },\n 38: { atomicNumber: 38, symbol: \"Sr\", name: \"Strontium\", mass: 87.62 },\n 39: { atomicNumber: 39, symbol: \"Y\", name: \"Yttrium\", mass: 88.906 },\n 40: { atomicNumber: 40, symbol: \"Zr\", name: \"Zirconium\", mass: 91.224 },\n 41: { atomicNumber: 41, symbol: \"Nb\", name: \"Niobium\", mass: 92.906 },\n 42: { atomicNumber: 42, symbol: \"Mo\", name: \"Molybdenum\", mass: 95.95 },\n 43: { atomicNumber: 43, symbol: \"Tc\", name: \"Technetium\", mass: 98 },\n 44: { atomicNumber: 44, symbol: \"Ru\", name: \"Ruthenium\", mass: 101.07 },\n 45: { atomicNumber: 45, symbol: \"Rh\", name: \"Rhodium\", mass: 102.91 },\n 46: { atomicNumber: 46, symbol: \"Pd\", name: \"Palladium\", mass: 106.42 },\n 47: { atomicNumber: 47, symbol: \"Ag\", name: \"Silver\", mass: 107.868 },\n 48: { atomicNumber: 48, symbol: \"Cd\", name: \"Cadmium\", mass: 112.414 },\n 49: { atomicNumber: 49, symbol: \"In\", name: \"Indium\", mass: 114.818 },\n 50: { atomicNumber: 50, symbol: \"Sn\", name: \"Tin\", mass: 118.71 },\n 51: { atomicNumber: 51, symbol: \"Sb\", name: \"Antimony\", mass: 121.76 },\n 52: { atomicNumber: 52, symbol: \"Te\", name: \"Tellurium\", mass: 127.6 },\n 53: { atomicNumber: 53, symbol: \"I\", name: \"Iodine\", mass: 126.904 },\n 54: { atomicNumber: 54, symbol: \"Xe\", name: \"Xenon\", mass: 131.293 },\n 55: { atomicNumber: 55, symbol: \"Cs\", name: \"Cesium\", mass: 132.905 },\n 56: { atomicNumber: 56, symbol: \"Ba\", name: \"Barium\", mass: 137.33 },\n 57: { atomicNumber: 57, symbol: \"La\", name: \"Lanthanum\", mass: 138.905 },\n 58: { atomicNumber: 58, symbol: \"Ce\", name: \"Cerium\", mass: 140.12 },\n 59: { atomicNumber: 59, symbol: \"Pr\", name: \"Praseodymium\", mass: 140.91 },\n 60: { atomicNumber: 60, symbol: \"Nd\", name: \"Neodymium\", mass: 144.24 },\n 61: { atomicNumber: 61, symbol: \"Pm\", name: \"Promethium\", mass: 145 },\n 62: { atomicNumber: 62, symbol: \"Sm\", name: \"Samarium\", mass: 150.36 },\n 63: { atomicNumber: 63, symbol: \"Eu\", name: \"Europium\", mass: 151.964 },\n 64: { atomicNumber: 64, symbol: \"Gd\", name: \"Gadolinium\", mass: 157.25 },\n 65: { atomicNumber: 65, symbol: \"Tb\", name: \"Terbium\", mass: 158.93 },\n 66: { atomicNumber: 66, symbol: \"Dy\", name: \"Dysprosium\", mass: 162.5 },\n 67: { atomicNumber: 67, symbol: \"Ho\", name: \"Holmium\", mass: 164.93 },\n 68: { atomicNumber: 68, symbol: \"Er\", name: \"Erbium\", mass: 167.26 },\n 69: { atomicNumber: 69, symbol: \"Tm\", name: \"Thulium\", mass: 168.93 },\n 70: { atomicNumber: 70, symbol: \"Yb\", name: \"Ytterbium\", mass: 173.05 },\n 71: { atomicNumber: 71, symbol: \"Lu\", name: \"Lutetium\", mass: 174.97 },\n 72: { atomicNumber: 72, symbol: \"Hf\", name: \"Hafnium\", mass: 178.49 },\n 73: { atomicNumber: 73, symbol: \"Ta\", name: \"Tantalum\", mass: 180.95 },\n 74: { atomicNumber: 74, symbol: \"W\", name: \"Tungsten\", mass: 183.84 },\n 75: { atomicNumber: 75, symbol: \"Re\", name: \"Rhenium\", mass: 186.207 },\n 76: { atomicNumber: 76, symbol: \"Os\", name: \"Osmium\", mass: 190.23 },\n 77: { atomicNumber: 77, symbol: \"Ir\", name: \"Iridium\", mass: 192.217 },\n 78: { atomicNumber: 78, symbol: \"Pt\", name: \"Platinum\", mass: 195.084 },\n 79: { atomicNumber: 79, symbol: \"Au\", name: \"Gold\", mass: 196.967 },\n 80: { atomicNumber: 80, symbol: \"Hg\", name: \"Mercury\", mass: 200.592 },\n 81: { atomicNumber: 81, symbol: \"Tl\", name: \"Thallium\", mass: 204.38 },\n 82: { atomicNumber: 82, symbol: \"Pb\", name: \"Lead\", mass: 207.2 },\n 83: { atomicNumber: 83, symbol: \"Bi\", name: \"Bismuth\", mass: 208.98 },\n 84: { atomicNumber: 84, symbol: \"Po\", name: \"Polonium\", mass: 209 },\n 85: { atomicNumber: 85, symbol: \"At\", name: \"Astatine\", mass: 210 },\n 86: { atomicNumber: 86, symbol: \"Rn\", name: \"Radon\", mass: 222 },\n 87: { atomicNumber: 87, symbol: \"Fr\", name: \"Francium\", mass: 223 },\n 88: { atomicNumber: 88, symbol: \"Ra\", name: \"Radium\", mass: 226 },\n 89: { atomicNumber: 89, symbol: \"Ac\", name: \"Actinium\", mass: 227 },\n 90: { atomicNumber: 90, symbol: \"Th\", name: \"Thorium\", mass: 232.04 },\n 91: { atomicNumber: 91, symbol: \"Pa\", name: \"Protactinium\", mass: 231.04 },\n 92: { atomicNumber: 92, symbol: \"U\", name: \"Uranium\", mass: 238.03 },\n 93: { atomicNumber: 93, symbol: \"Np\", name: \"Neptunium\", mass: 237 },\n 94: { atomicNumber: 94, symbol: \"Pu\", name: \"Plutonium\", mass: 244 },\n 95: { atomicNumber: 95, symbol: \"Am\", name: \"Americium\", mass: 243 },\n 96: { atomicNumber: 96, symbol: \"Cm\", name: \"Curium\", mass: 247 },\n 97: { atomicNumber: 97, symbol: \"Bk\", name: \"Berkelium\", mass: 247 },\n 98: { atomicNumber: 98, symbol: \"Cf\", name: \"Californium\", mass: 251 },\n 99: { atomicNumber: 99, symbol: \"Es\", name: \"Einsteinium\", mass: 252 },\n 100: { atomicNumber: 100, symbol: \"Fm\", name: \"Fermium\", mass: 257 },\n 101: { atomicNumber: 101, symbol: \"Md\", name: \"Mendelevium\", mass: 258 },\n 102: { atomicNumber: 102, symbol: \"No\", name: \"Nobelium\", mass: 259 },\n 103: { atomicNumber: 103, symbol: \"Lr\", name: \"Lawrencium\", mass: 262 },\n 104: { atomicNumber: 104, symbol: \"Rf\", name: \"Rutherfordium\", mass: 267 },\n 105: { atomicNumber: 105, symbol: \"Db\", name: \"Dubnium\", mass: 270 },\n 106: { atomicNumber: 106, symbol: \"Sg\", name: \"Seaborgium\", mass: 269 },\n 107: { atomicNumber: 107, symbol: \"Bh\", name: \"Bohrium\", mass: 270 },\n 108: { atomicNumber: 108, symbol: \"Hs\", name: \"Hassium\", mass: 277 },\n 109: { atomicNumber: 109, symbol: \"Mt\", name: \"Meitnerium\", mass: 278 },\n 110: { atomicNumber: 110, symbol: \"Ds\", name: \"Darmstadtium\", mass: 281 },\n 111: { atomicNumber: 111, symbol: \"Rg\", name: \"Roentgenium\", mass: 282 },\n 112: { atomicNumber: 112, symbol: \"Cn\", name: \"Copernicium\", mass: 285 },\n 113: { atomicNumber: 113, symbol: \"Nh\", name: \"Nihonium\", mass: 286 },\n 114: { atomicNumber: 114, symbol: \"Fl\", name: \"Flerovium\", mass: 289 },\n 115: { atomicNumber: 115, symbol: \"Mc\", name: \"Moscovium\", mass: 289 },\n 116: { atomicNumber: 116, symbol: \"Lv\", name: \"Livermorium\", mass: 293 },\n 117: { atomicNumber: 117, symbol: \"Ts\", name: \"Tennessine\", mass: 294 },\n 118: { atomicNumber: 118, symbol: \"Og\", name: \"Oganesson\", mass: 294 },\n};\n\nexport const elementBySymbol = Object.values(PeriodicTable).reduce(\n (acc, el) => {\n acc[el.symbol] = el;\n return acc;\n },\n {} as Record<string, ElementInfo>,\n);\n\nexport function getElement(symbol: string): ElementInfo | undefined {\n return elementBySymbol[symbol];\n}\n\n/**\n * Symbol → atomic number lookup (fast + safe)\n */\nexport const SymbolToAtomicNumber = new Map<string, number>(\n Object.values(PeriodicTable).map((el) => [el.symbol, el.atomicNumber]),\n);\n\nexport const AtomicNumberToSymbol = new Map<number, string>(\n Object.values(PeriodicTable).map((el) => [el.atomicNumber, el.symbol]),\n);\n","import { Structure } from \"../structure\";\nimport { Site } from \"../../site/site\";\nimport { getElement } from \"@/core/data/periodictable/atomicData\";\n\nfunction siteMass(site: Site): number {\n const siteMass = site.properties?.mass;\n\n if (typeof siteMass === \"number\") {\n return siteMass;\n }\n\n const speciesMass = site.species.properties?.mass;\n\n if (typeof speciesMass === \"number\") {\n return speciesMass;\n }\n\n const element = getElement(site.species.symbol);\n\n if (!element) {\n throw new Error(`Unknown element: ${site.species.symbol}`);\n }\n\n return element.mass;\n}\n\nexport function cellMass(structure: Structure): number {\n let mass = 0;\n\n for (const site of structure.sites) {\n mass += siteMass(site);\n }\n\n return mass;\n}\n","import { Structure } from \"../structure\";\nimport { volume } from \"./volume\";\nimport { cellMass } from \"./cellMass\";\n\n// in units amu / Ang^3'd\nexport function density(structure: Structure): number {\n return cellMass(structure) / volume(structure);\n}\n","import { Species } from \"../species/species\";\n\nexport type SiteProperties = Record<string, any>;\n\nexport type Vec3 = [number, number, number] | Float64Array | number[];\n\nexport type Site<P extends SiteProperties = SiteProperties> = {\n species: Species;\n frac: Vec3;\n properties?: P;\n};\n\nexport function createSite<P extends SiteProperties>(\n species: Species,\n frac: Vec3,\n properties?: P,\n): Site<P> {\n return {\n species,\n frac,\n properties,\n };\n}\n","import { mul } from \"../matrix/operations/mul\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nimport { Site } from \"./site\";\nimport { Lattice } from \"../lattice/lattice\";\nimport { Vector } from \"../matrix/vector\";\n\nexport function cartesian(lattice: Lattice, site: Site): Vector {\n const [x, y, z] = site.frac;\n\n const frac = {\n rows: 3,\n cols: 1,\n data: new Float64Array([x, y, z]),\n };\n\n const basisT = transpose(lattice.basis);\n const result = mul(basisT, frac);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { inverse } from \"../lattice/inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Vector } from \"../matrix/vector\";\nimport { Lattice } from \"../lattice/lattice\";\n\nexport function fractional(lattice: Lattice, cart: Vector): Vector {\n const vec = {\n rows: 3,\n cols: 1,\n data: cart,\n };\n\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const result = mul(invT, vec);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { Lattice } from \"../lattice/lattice\";\nimport { Site } from \"./site\";\nimport { cartesian } from \"./cartesian\";\n\nimport { norm } from \"../matrix/operations/vector/norm\";\n\nexport function distance(lattice: Lattice, a: Site, b: Site): number {\n const dFrac: [number, number, number] = [\n b.frac[0] - a.frac[0],\n b.frac[1] - a.frac[1],\n b.frac[2] - a.frac[2],\n ];\n\n for (let i = 0; i < 3; i++) {\n dFrac[i] -= Math.round(dFrac[i]);\n }\n\n const displaced: Site = {\n species: a.species,\n frac: dFrac,\n };\n\n const dCart = cartesian(lattice, displaced);\n\n return norm(dCart);\n}\n","import { Site, SiteProperties } from \"./site\";\n\nfunction wrapValue(x: number): number {\n return ((x % 1) + 1) % 1;\n}\n\nexport function wrap<T extends SiteProperties>(site: Site<T>): Site<T> {\n return {\n ...site,\n frac: [\n wrapValue(site.frac[0]),\n wrapValue(site.frac[1]),\n wrapValue(site.frac[2]),\n ],\n };\n}\n","export type Species<P extends Record<string, any> = Record<string, any>> = {\n symbol: string;\n properties?: P;\n};\n\nexport function createSpecies<P extends Record<string, any>>(\n symbol: string,\n properties?: P,\n): Species<P> {\n return { symbol, properties };\n}\n","import { fromParameters } from \"../lattice/create/fromParameters\";\nimport { parameters } from \"../lattice/parameters\";\nimport { Structure } from \"../structure/structure\";\n\nfunction cleanValue(value: string): number {\n // remove uncertainty notation:\n // 5.432(1) -> 5.432\n return Number(value.replace(/\\(.+\\)/, \"\"));\n}\n\nfunction tokenize(line: string): string[] {\n return line.match(/'[^']*'|\"[^\"]*\"|\\S+/g) ?? [];\n}\n\nfunction warnUnsupportedSymmetry(spaceGroup: string) {\n console.warn(\n `Space group \"${spaceGroup}\" detected. ` +\n `Symmetry operations are not currently applied; ` +\n `only asymmetric-unit sites will be parsed.`,\n );\n}\n\nexport function fromCIF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n let a = 0;\n let b = 0;\n let c = 0;\n\n let alpha = 0;\n let beta = 0;\n let gamma = 0;\n\n let spaceGroup = \"P1\";\n\n let atomHeaders: string[] = [];\n const atomRows: string[][] = [];\n\n let inLoop = false;\n let currentHeaders: string[] = [];\n let collectingAtoms = false;\n\n for (const line of lines) {\n if (line.startsWith(\"_symmetry_space_group_name_H-M\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_space_group_name_H-M_alt\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_cell_length_a\")) {\n a = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_b\")) {\n b = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_c\")) {\n c = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_alpha\")) {\n alpha = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_beta\")) {\n beta = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_gamma\")) {\n gamma = cleanValue(tokenize(line)[1]);\n } else if (line === \"loop_\") {\n inLoop = true;\n currentHeaders = [];\n collectingAtoms = false;\n continue;\n }\n\n if (inLoop && line.startsWith(\"_\")) {\n currentHeaders.push(line);\n\n if (line.includes(\"_atom_site_\")) {\n collectingAtoms = true;\n }\n\n continue;\n }\n\n if (inLoop && collectingAtoms) {\n if (atomHeaders.length === 0) {\n atomHeaders = [...currentHeaders];\n }\n\n atomRows.push(tokenize(line));\n }\n }\n\n const isP1 = /^P\\s*1$/i.test(spaceGroup);\n\n if (!isP1) {\n warnUnsupportedSymmetry(spaceGroup);\n }\n\n const lattice = fromParameters(a, b, c, alpha, beta, gamma);\n\n const ix = atomHeaders.findIndex((x) => x.includes(\"fract_x\"));\n\n const iy = atomHeaders.findIndex((x) => x.includes(\"fract_y\"));\n\n const iz = atomHeaders.findIndex((x) => x.includes(\"fract_z\"));\n\n const ispecies = atomHeaders.findIndex((x) => x.includes(\"type_symbol\"));\n\n if (ix < 0 || iy < 0 || iz < 0 || ispecies < 0) {\n throw new Error(\"Missing required atom site columns\");\n }\n\n const sites = atomRows.map((row) => ({\n species: {\n symbol: row[ispecies],\n },\n\n frac: new Float64Array([\n cleanValue(row[ix]),\n cleanValue(row[iy]),\n cleanValue(row[iz]),\n ]),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toCIF(structure: Structure, precision = 6): string {\n const p = parameters(structure.lattice);\n\n const lines: string[] = [];\n\n lines.push(\"data_matsci-parse\");\n lines.push(\"\");\n\n lines.push(\"_symmetry_space_group_name_H-M 'P 1'\");\n lines.push(\"_symmetry_Int_Tables_number 1\");\n\n lines.push(\"\");\n\n lines.push(`_cell_length_a ${p[0].toFixed(precision)}`);\n\n lines.push(`_cell_length_b ${p[1].toFixed(precision)}`);\n\n lines.push(`_cell_length_c ${p[2].toFixed(precision)}`);\n\n lines.push(`_cell_angle_alpha ${p[3].toFixed(precision)}`);\n\n lines.push(`_cell_angle_beta ${p[4].toFixed(precision)}`);\n\n lines.push(`_cell_angle_gamma ${p[5].toFixed(precision)}`);\n\n lines.push(\"\");\n\n lines.push(\"loop_\");\n lines.push(\"_atom_site_label\");\n lines.push(\"_atom_site_type_symbol\");\n lines.push(\"_atom_site_fract_x\");\n lines.push(\"_atom_site_fract_y\");\n lines.push(\"_atom_site_fract_z\");\n\n for (let i = 0; i < structure.sites.length; i++) {\n const site = structure.sites[i];\n\n lines.push(\n `${site.species.symbol}${i + 1} ` +\n `${site.species.symbol} ` +\n `${site.frac[0].toFixed(precision)} ` +\n `${site.frac[1].toFixed(precision)} ` +\n `${site.frac[2].toFixed(precision)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { inverse } from \"../lattice/inverse\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\nimport { fractional } from \"../site/fractional\";\n\nimport { cartesian } from \"../site\";\n\nfunction isSelective(line: string): boolean {\n return line.toLowerCase().startsWith(\"selective\");\n}\n\nfunction isCartesian(line: string): boolean {\n const l = line.trim().toLowerCase();\n return l.startsWith(\"c\") || l.startsWith(\"k\");\n}\n\n// TODO: Currently nukes the selective dynamics flag from the input file.\n// It would be good to restore this.\n// TODO: would be good to ensure that the title is also optionally\n// maintained.\n/**\n * Parses a crystal structure from POSCAR (VASP) format.\n *\n * Reads lattice vectors, atomic positions, and species from VASP's POSCAR/CONTCAR format.\n * Supports both Cartesian and fractional coordinates.\n *\n * @param text - The POSCAR file content as a string\n * @returns A Structure object parsed from the POSCAR data\n * @throws Error if required POSCAR fields are missing or malformed\n *\n * @remarks\n * - Line 1: Comment/title line (ignored)\n * - Line 2: Scaling factor\n * - Lines 3-5: Lattice vectors (in Ångströms or scaled units)\n * - Line 6: Element symbols\n * - Line 7: Number of atoms per element\n * - Line 8+: Atomic positions (Cartesian or fractional)\n * - Selective dynamics flags are currently stripped\n * - Structure title is not preserved in the output\n *\n * @example\n * ```typescript\n * const poscarText = `Cubic structure\n * 1.0\n * 4.05 0 0\n * 0 4.05 0\n * 0 0 4.05\n * Al\n * 2\n * Fractional\n * 0 0 0\n * 0.5 0.5 0.5`;\n * const structure = fromPOSCAR(poscarText);\n * ```\n */\nexport function fromPOSCAR(text: string): Structure {\n const lines = text.split(\"\\n\").map((x) => x.trim());\n\n let cursor = 0;\n\n // comment/title\n cursor++;\n\n // scale factor\n const scale = Number(lines[cursor++]);\n\n // lattice vectors (row-major)\n const latticeData: number[] = [];\n\n for (let i = 0; i < 3; i++) {\n const v = lines[cursor++].split(/\\s+/).map(Number);\n\n if (v.length !== 3) {\n throw new Error(\"Invalid POSCAR lattice\");\n }\n\n latticeData.push(v[0] * scale, v[1] * scale, v[2] * scale);\n }\n\n const lattice = createLattice(latticeData);\n\n // VASP5 species names\n const symbols = lines[cursor++].split(/\\s+/);\n\n // atom counts\n const counts = lines[cursor++].split(/\\s+/).map(Number);\n\n if (symbols.length !== counts.length) {\n throw new Error(\"Species/count mismatch\");\n }\n\n // optional selective dynamics\n if (isSelective(lines[cursor])) {\n cursor++;\n }\n\n // direct is true unless cartesian is.\n let direct = true;\n direct = !isCartesian(lines[cursor]);\n\n cursor++;\n\n const sites: Site[] = [];\n\n let speciesIndex = 0;\n let remaining = counts[0];\n\n const latticeInv = !direct ? inverse(lattice) : null;\n\n const totalAtoms = counts.reduce((a, b) => a + b, 0);\n\n for (let i = 0; i < totalAtoms; i++) {\n const tokens = lines[cursor++].split(/\\s+/);\n\n const coords = tokens.slice(0, 3).map(Number);\n\n const frac = direct\n ? new Float64Array(coords)\n : fractional(lattice, new Float64Array(coords));\n\n sites.push({\n species: {\n symbol: symbols[speciesIndex],\n },\n frac,\n });\n\n remaining--;\n\n if (remaining === 0 && speciesIndex < counts.length - 1) {\n speciesIndex++;\n remaining = counts[speciesIndex];\n }\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toPOSCAR(\n structure: Structure,\n options?: {\n title?: string;\n scale?: number;\n direct?: boolean;\n },\n): string {\n const title = options?.title ?? \"Generated by matsci-parse\";\n const scale = options?.scale ?? 1.0;\n const direct = options?.direct ?? true;\n\n const lines: string[] = [];\n\n lines.push(title);\n lines.push(String(scale));\n\n // lattice\n const m = structure.lattice.basis.data;\n\n lines.push(`${m[0]} ${m[1]} ${m[2]}`);\n lines.push(`${m[3]} ${m[4]} ${m[5]}`);\n lines.push(`${m[6]} ${m[7]} ${m[8]}`);\n\n // preserve order of first appearance\n const grouped = new Map<string, typeof structure.sites>();\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!grouped.has(symbol)) {\n grouped.set(symbol, []);\n }\n\n grouped.get(symbol)!.push(site);\n }\n\n const species = [...grouped.keys()];\n const sites = [...grouped.values()].flat();\n\n lines.push(species.join(\" \"));\n lines.push(species.map((s) => grouped.get(s)!.length).join(\" \"));\n\n lines.push(direct ? \"Direct\" : \"Cartesian\");\n\n for (const site of sites) {\n const coords = direct ? site.frac : cartesian(structure.lattice, site);\n\n lines.push(`${coords[0]} ${coords[1]} ${coords[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\nimport { cartesian } from \"../site/cartesian\";\nimport { fractional } from \"../site/fractional\";\n\nexport interface AiiDASite {\n position: [number, number, number];\n kind_name: string[];\n}\n\nexport interface StructureData {\n cell: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ];\n kinds: [];\n sites: AiiDASite[];\n}\n\nexport function fromStructureData(data: StructureData): Structure {\n const lattice = createLattice([\n ...data.cell[0],\n ...data.cell[1],\n ...data.cell[2],\n ]);\n\n const kindMap = new Map(data.kinds.map((kind: any) => [kind.name, kind]));\n\n const sites = data.sites.map((site: any) => {\n const kind = kindMap.get(site.kind_name);\n\n if (!kind) {\n throw new Error(`Unknown kind \"${site.kind_name}\"`);\n }\n\n return {\n species: {\n symbol: kind.symbols[0],\n },\n\n frac: fractional(lattice, new Float64Array(site.position)),\n };\n });\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toStructureData(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const symbols = [...new Set(structure.sites.map((s) => s.species.symbol))];\n\n const kinds = symbols.map((symbol) => ({\n name: symbol,\n symbols: [symbol],\n }));\n\n return {\n cell: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n kinds,\n\n sites: structure.sites.map((site) => ({\n kind_name: site.species.symbol,\n\n position: Array.from(cartesian(structure.lattice, site)),\n })),\n\n pbc1: true,\n pbc2: true,\n pbc3: true,\n };\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { fractional } from \"../site/fractional\";\nimport { cartesian } from \"../site/cartesian\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\nfunction findSection(lines: string[], section: string): number {\n const idx = lines.findIndex((line) => line.trim().toUpperCase() === section);\n\n if (idx === -1) {\n throw new Error(`Missing ${section}`);\n }\n\n return idx;\n}\n\n// TODO: support atomic numbers instead of symbols in primvec.\n\nexport function fromXSF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n const vecStart = findSection(lines, \"PRIMVEC\");\n\n const lattice = createLattice([\n ...lines[vecStart + 1].split(/\\s+/).map(Number),\n ...lines[vecStart + 2].split(/\\s+/).map(Number),\n ...lines[vecStart + 3].split(/\\s+/).map(Number),\n ]);\n\n const coordStart = findSection(lines, \"PRIMCOORD\");\n\n const [nAtoms] = lines[coordStart + 1].split(/\\s+/).map(Number);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < nAtoms; i++) {\n const tokens = lines[coordStart + 2 + i].split(/\\s+/);\n\n const symbol = tokens[0];\n\n const x = Number(tokens[1]);\n const y = Number(tokens[2]);\n const z = Number(tokens[3]);\n\n const frac = fractional(lattice, new Float64Array([x, y, z]));\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nfunction formatVec(v: number[]): string {\n return `${v[0]} ${v[1]} ${v[2]}`;\n}\n\nfunction formatLattice(lattice: Structure[\"lattice\"]): string[] {\n const m = lattice.basis.data;\n\n return [\n formatVec([m[0], m[1], m[2]]),\n formatVec([m[3], m[4], m[5]]),\n formatVec([m[6], m[7], m[8]]),\n ];\n}\n\nexport function toXSF(structure: Structure): string {\n const lines: string[] = [];\n\n lines.push(\"CRYSTAL\");\n lines.push(\"PRIMVEC\");\n\n const latticeLines = formatLattice(structure.lattice);\n lines.push(...latticeLines);\n lines.push(\"PRIMCOORD\");\n lines.push(`${structure.sites.length} 1`);\n\n for (const site of structure.sites) {\n const c = cartesian(structure.lattice, site);\n lines.push(`${site.species.symbol} ${c[0]} ${c[1]} ${c[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice, Lattice } from \"../lattice/lattice\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\ntype ExtendedXYZInfo = Record<string, string>;\n\nfunction parseHeader(comment: string): ExtendedXYZInfo {\n const info: ExtendedXYZInfo = {};\n const kvRegex = /(\\w+)=(\".*?\"|\\S+)/g;\n\n for (const match of comment.matchAll(kvRegex)) {\n let value = match[2];\n if (value.startsWith('\"')) value = value.slice(1, -1);\n info[match[1]] = value;\n }\n\n return info;\n}\n\nfunction parseLattice(info: ExtendedXYZInfo) {\n if (!info.Lattice) {\n throw new Error(\"Extended XYZ must contain Lattice\");\n }\n\n const v = info.Lattice.split(/\\s+/).map(Number);\n if (v.length !== 9) throw new Error(\"Invalid Lattice\");\n\n return createLattice([v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]]);\n}\n\n/**\n * Parses a crystal structure from extended XYZ format.\n *\n * Reads atomic structure from XYZ format with extended headers containing\n * lattice information (Extended XYZ format used by ASE and other tools).\n *\n * @param text - The XYZ file content as a string\n * @returns A Structure object parsed from the XYZ data\n * @throws Error if lattice information or required fields are missing\n *\n * @remarks\n * - First line: number of atoms\n * - Second line: properties header in key=value format (must include \"Lattice\")\n * - Remaining lines: atomic species and Cartesian positions\n * - Lattice must be specified in extended header as 9 space-separated values\n * - Standard XYZ format (without lattice) is not supported\n *\n * @example\n * ```typescript\n * const xyzText = `2\n * Lattice=\"4.05 0 0 0 4.05 0 0 0 4.05\" Properties=species:S:1:pos:R:3\n * Al 0.0 0.0 0.0\n * Al 2.025 2.025 2.025`;\n * const structure = fromXYZ(xyzText);\n * ```\n */\nexport function fromXYZ(text: string) {\n const lines = text.trim().split(\"\\n\");\n\n const n = Number(lines[0]);\n const comment = lines[1];\n\n const info = parseHeader(comment);\n const lattice = parseLattice(info);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < n; i++) {\n const [symbol, x, y, z] = lines[2 + i].split(/\\s+/);\n\n sites.push({\n species: { symbol },\n frac: new Float64Array([+x, +y, +z]),\n });\n }\n\n return { lattice, sites };\n}\n\nfunction formatLattice(lattice: Lattice): string {\n const m = lattice.basis.data;\n\n // row-major flattening assumption (consistent with your matrix code)\n return `${m[0]} ${m[1]} ${m[2]} ${m[3]} ${m[4]} ${m[5]} ${m[6]} ${m[7]} ${m[8]}`;\n}\n\n/**\n * Serializes a structure to extended XYZ format.\n *\n * Converts a Structure to extended XYZ format suitable for visualization\n * and exchange with other materials science tools (ASE, OVITO, etc.).\n *\n * @param structure - The structure to serialize\n * @returns The structure as an extended XYZ formatted string\n *\n * @remarks\n * - Line 1: Number of atoms\n * - Line 2: Header with lattice information in extended XYZ format\n * - Remaining lines: Atomic species and fractional coordinates\n * - Lattice is specified as 9 space-separated values in row-major order\n * - The output uses fractional coordinates as given in the structure\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4.05), sites: [...] };\n * const xyzString = toXYZ(structure);\n * // Output can be written to file and opened in visualization software\n * ```\n */\nexport function toXYZ(structure: Structure): string {\n const sites = structure.sites;\n\n const lines: string[] = [];\n\n lines.push(String(sites.length));\n\n const latticeStr = formatLattice(structure.lattice);\n\n lines.push(`Lattice=\"${latticeStr}\"`);\n\n for (const site of sites) {\n const f = site.frac;\n\n lines.push(`${site.species.symbol} ${f[0]} ${f[1]} ${f[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice\";\n\nimport { fractional, cartesian } from \"../site\";\nimport { Structure } from \"../structure\";\n\nexport function fromOptimade(data: any): Structure {\n const lattice = createLattice([\n ...data.attributes.lattice_vectors[0],\n ...data.attributes.lattice_vectors[1],\n ...data.attributes.lattice_vectors[2],\n ]);\n\n const positions = data.attributes.cartesian_site_positions;\n const species = data.attributes.species_at_sites;\n\n const sites = positions.map((position: number[], i: number) => ({\n species: {\n symbol: species[i],\n },\n\n frac: fractional(lattice, new Float64Array(position)),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toOptimade(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const species_at_sites = structure.sites.map((site) => site.species.symbol);\n\n const elements = [...new Set(species_at_sites)].sort();\n\n return {\n attributes: {\n lattice_vectors: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n species_at_sites,\n\n cartesian_site_positions: structure.sites.map((site) =>\n Array.from(cartesian(structure.lattice, site)),\n ),\n\n dimension_types: [1, 1, 1],\n\n nsites: structure.sites.length,\n\n nelements: elements.length,\n\n elements,\n },\n };\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\n/**\n * Serializes a structure to JSON format.\n *\n * Converts a Structure to a plain JavaScript object suitable for JSON stringification.\n *\n * @param structure - The structure to serialize\n * @returns An object with `lattice` (flattened array) and `sites` (with species and fractional coordinates)\n *\n * @remarks\n * - Lattice is serialized as a flat array [a1x, a1y, a1z, ...]\n * - Fractional coordinates are converted from Float64Array to regular arrays\n * - Use with JSON.stringify() for string serialization\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4), sites: [...] };\n * const json = toJSON(structure);\n * const jsonString = JSON.stringify(json);\n * ```\n */\nexport function toJSON(structure: Structure) {\n return {\n lattice: structure.lattice.basis.data,\n sites: structure.sites.map((s) => ({\n species: s.species,\n frac: Array.from(s.frac),\n })),\n };\n}\n\n/**\n * Deserializes a structure from JSON format.\n *\n * Reconstructs a Structure from a JSON object (typically parsed from JSON string).\n *\n * @param data - An object with `lattice` (9-element array) and `sites` array\n * @returns A new Structure object\n *\n * @remarks\n * - Lattice array must have exactly 9 elements\n * - Fractional coordinates are converted to Float64Array\n * - Inverse operation of toJSON()\n * - No validation is performed on the input data\n *\n * @example\n * ```typescript\n * const jsonData = {\n * lattice: [4, 0, 0, 0, 4, 0, 0, 0, 4],\n * sites: [{ species: 'Al', frac: [0, 0, 0] }]\n * };\n * const structure = fromJSON(jsonData);\n * ```\n */\nexport function fromJSON(data: any): Structure {\n return {\n lattice: createLattice(data.lattice),\n sites: data.sites.map((s: any) => ({\n species: s.species,\n frac: new Float64Array(s.frac),\n })),\n };\n}\n","export function convertMeasurement<T extends string>(\n value: number,\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number {\n const resolve = (u: string) => (aliases?.[u] ?? u) as T;\n\n const fromUnit = resolve(from);\n const toUnit = resolve(to);\n\n if (fromUnit === toUnit) return value;\n\n const valueInBase = value * conversions[fromUnit];\n return valueInBase / conversions[toUnit];\n}\n\nexport function convertMeasurementArray<T extends string>(\n arr: number[],\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number[] {\n return arr.map((v) => convertMeasurement(v, from, to, conversions, aliases));\n}\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type LengthUnits =\n | \"angstrom\"\n | \"bohr\"\n | \"nm\"\n | \"pm\"\n | \"cm\"\n | \"m\"\n | \"um\"\n | \"fm\";\n\nconst LengthConversions: Record<LengthUnits, number> = {\n angstrom: 1,\n bohr: 0.529177,\n nm: 10,\n pm: 0.01,\n um: 1e4,\n cm: 1e8,\n m: 1e10,\n fm: 1e-5,\n};\n\nconst LengthAliases: Record<string, LengthUnits> = {\n Å: \"angstrom\",\n μm: \"um\",\n};\n\nexport const LengthUnitSystem = {\n conversions: LengthConversions,\n aliases: LengthAliases,\n\n convert(value: number, from: LengthUnits | string, to: LengthUnits | string) {\n return convertMeasurement(\n value,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: LengthUnits | string,\n to: LengthUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type EnergyUnits = \"eV\" | \"Hartree\" | \"kJ/mol\" | \"kcal/mol\";\n\nconst EnergyConversions: Record<EnergyUnits, number> = {\n eV: 1,\n Hartree: 27.2114,\n \"kJ/mol\": 0.0103643,\n \"kcal/mol\": 0.0433641,\n};\n\nconst EnergyAliases: Record<string, EnergyUnits> = {\n Ha: \"Hartree\",\n ev: \"eV\",\n electronvolt: \"eV\",\n};\n\nexport const EnergyUnitSystem = {\n conversions: EnergyConversions,\n aliases: EnergyAliases,\n\n convert(value: number, from: EnergyUnits | string, to: EnergyUnits | string) {\n return convertMeasurement(\n value,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: EnergyUnits | string,\n to: EnergyUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type AngleUnits = \"rad\" | \"deg\" | \"grad\";\n\nconst AngleConversions: Record<AngleUnits, number> = {\n rad: 1,\n deg: Math.PI / 180,\n grad: Math.PI / 200,\n};\n\nconst AngleAliases: Record<string, AngleUnits> = {\n \"°\": \"deg\",\n deg: \"deg\",\n rad: \"rad\",\n gon: \"grad\",\n};\n\nexport const AngleUnitSystem = {\n conversions: AngleConversions,\n aliases: AngleAliases,\n\n convert(value: number, from: AngleUnits | string, to: AngleUnits | string) {\n return convertMeasurement(\n value,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: AngleUnits | string,\n to: AngleUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n};\n"],"names":["EPS","wrap","x","v","clean","canonicalize","structure","site","toFixedArray","precision","fnv1a","str","hash","i","hashStructure","s","lattice","latticeKey","sitesKey","key","appendSite","insertSite","index","removeSite","_","replaceSite","createMatrix","rows","cols","data","size","buffer","row","col","createLattice","values","cleaned","dot","a","b","sum","norm","angle","u","denom","c","clamped","angles","m","alpha","beta","gamma","inverse3x3","a00","a01","a02","a10","a11","a12","a20","a21","a22","c00","c01","c02","c10","c11","c12","c20","c21","c22","det","invDet","out","inverse","lengths","transpose","matrix","mul","aRows","aCols","bCols","k","metricTensor","A","AT","RAD2DEG","parameters","TWO_PI","reciprocalLattice","inv","reciprocalLatticeCrystallographic","invT","DEG2RAD","fromParameters","alphaR","betaR","gammaR","cosA","cosB","cosG","sinG","v1","v2","cx","cy","czSquared","cz","cubic","hexagonal","monoclinic","orthorhombic","rhombohedral","tetragonal","ready","initMoyo","readFileSync","join","wasmPath","wasmBuffer","init","e","wasmUrl","getSymmetry","tolerance","setting","symbolToId","idToSymbol","counter","positions","numbers","symbol","moyoInput","results","analyze_cell","build","cell","species","n","sites","pos","supercell","nx","ny","nz","newBasis","y","z","j","minor","skipRow","skipCol","ptr","determinant","sign","volume","latticeVolume","gcd","composition","compositionGCD","comp","hillOrder","elements","rest","formulaFromComposition","ordering","el","count","reducedComposition","factor","element","hillFormula","reducedFormula","PeriodicTable","elementBySymbol","acc","getElement","SymbolToAtomicNumber","AtomicNumberToSymbol","siteMass","speciesMass","cellMass","mass","density","createSite","frac","properties","cartesian","basisT","result","fractional","cart","vec","distance","dFrac","displaced","dCart","wrapValue","createSpecies","cleanValue","value","tokenize","line","warnUnsupportedSymmetry","spaceGroup","fromCIF","text","lines","atomHeaders","atomRows","inLoop","currentHeaders","collectingAtoms","ix","iy","iz","ispecies","toCIF","p","isSelective","isCartesian","l","fromPOSCAR","cursor","scale","latticeData","symbols","counts","direct","speciesIndex","remaining","totalAtoms","coords","toPOSCAR","options","title","grouped","fromStructureData","kindMap","kind","toStructureData","kinds","findSection","section","idx","fromXSF","vecStart","coordStart","nAtoms","tokens","formatVec","formatLattice","toXSF","latticeLines","parseHeader","comment","info","kvRegex","match","parseLattice","fromXYZ","toXYZ","latticeStr","f","fromOptimade","position","toOptimade","species_at_sites","toJSON","fromJSON","convertMeasurement","from","to","conversions","aliases","resolve","fromUnit","toUnit","convertMeasurementArray","arr","LengthConversions","LengthAliases","LengthUnitSystem","EnergyConversions","EnergyAliases","EnergyUnitSystem","AngleConversions","AngleAliases","AngleUnitSystem"],"mappings":";AAEA,MAAMA,KAAM;AAEZ,SAASC,EAAKC,GAAmB;AAC/B,QAAMC,IAAID,IAAI,KAAK,MAAMA,CAAC;AAC1B,SAAO,KAAK,IAAIC,CAAC,IAAIH,KAAM,IAAIG;AACjC;AAEA,SAASC,EAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASG,GAAaC,GAAiC;AAC5D,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,OAAOA,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,GAAGA;AAAA,MACH,MAAM,IAAI,aAAa;AAAA,QACrBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAAA,CACzB;AAAA,IAAA,EACD;AAAA,EAAA;AAEN;ACrBA,SAASC,EAAaL,GAASM,IAAY,GAAW;AACpD,SAAO,MAAM,KAAKN,CAAC,EAChB,IAAI,CAACD,MAAMA,EAAE,QAAQO,CAAS,CAAC,EAC/B,KAAK,GAAG;AACb;AAEA,SAASC,GAAMC,GAAqB;AAClC,MAAIC,IAAO;AAEX,WAASC,IAAI,GAAGA,IAAIF,EAAI,QAAQE;AAC9B,IAAAD,KAAQD,EAAI,WAAWE,CAAC,GACxBD,KAAQ;AAGV,SAAOA,MAAS;AAClB;AAEO,SAASE,GAAcR,GAA8B;AAC1D,QAAMS,IAAIV,GAAaC,CAAS,GAE1BU,IAAUD,EAAE,QAAQ,MAAM,MAC1BE,IAAaT,EAAaQ,CAAO,GAEjCE,IAAWH,EAAE,MAChB,IAAI,CAACR,MACGA,EAAK,UAAU,MAAMC,EAAaD,EAAK,IAAI,CACnD,EACA,OACA,KAAK,GAAG,GAELY,IAAMF,IAAa,OAAOC;AAEhC,SAAOR,GAAMS,CAAG;AAClB;AClCO,SAASC,GAAWd,GAAsBC,GAAuB;AACtE,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAO,CAAC,GAAGA,EAAU,OAAOC,CAAI;AAAA,EAAA;AAEpC;ACLO,SAASc,GACdf,GACAgB,GACAf,GACW;AACX,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAO;AAAA,MACL,GAAGA,EAAU,MAAM,MAAM,GAAGgB,CAAK;AAAA,MACjCf;AAAA,MACA,GAAGD,EAAU,MAAM,MAAMgB,CAAK;AAAA,IAAA;AAAA,EAChC;AAEJ;ACbO,SAASC,GAAWjB,GAAsBgB,GAA0B;AACzE,SAAO;AAAA,IACL,GAAGhB;AAAA,IACH,OAAOA,EAAU,MAAM,OAAO,CAACkB,GAAGX,MAAMA,MAAMS,CAAK;AAAA,EAAA;AAEvD;ACLO,SAASG,GACdnB,GACAgB,GACAf,GACW;AACX,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAOA,EAAU,MAAM,IAAI,CAACS,GAAGF,MAAOA,MAAMS,IAAQf,IAAOQ,CAAE;AAAA,EAAA;AAEjE;ACNO,SAASW,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAOH,IAAOC,GAEdG,IAASF,IAAO,aAAa,KAAKA,CAAI,IAAI,IAAI,aAAaC,CAAI;AAErE,MAAIC,EAAO,WAAWD;AACpB,UAAM,IAAI,MAAM,YAAYA,CAAI,gBAAgBC,EAAO,MAAM,EAAE;AAGjE,SAAO;AAAA,IACL,MAAAJ;AAAA,IACA,MAAAC;AAAA,IACA,MAAMG;AAAA,EAAA;AAEV;AAwBO,SAAST,EAAMM,GAAcI,GAAaC,GAAqB;AACpE,SAAOD,IAAMJ,IAAOK;AACtB;AChDA,MAAMjC,KAAM;AAEZ,SAASI,GAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASgC,EAAcL,GAAiD;AAC7E,QAAMM,IACJN,aAAgB,eAAeA,IAAO,UAAUA,IAAOA,EAAK,OAAOA;AAErE,MAAIM,EAAO,WAAW;AACpB,UAAM,IAAI,MAAM,iCAAiC;AAGnD,QAAMC,IAAU,IAAI,aAAa,CAAC;AAElC,WAASvB,IAAI,GAAGA,IAAI,GAAGA;AACrB,IAAAuB,EAAQvB,CAAC,IAAIT,GAAM+B,EAAOtB,CAAC,CAAC;AAG9B,SAAO;AAAA,IACL,OAAOa,EAAa,GAAG,GAAGU,CAAO;AAAA,EAAA;AAErC;ACvBO,SAASC,GAAIC,GAAWC,GAAmB;AAChD,MAAID,EAAE,WAAWC,EAAE;AACjB,UAAM,IAAI,MAAM,0CAA0C;AAG5D,MAAIC,IAAM;AAEV,WAAS3B,IAAI,GAAGA,IAAIyB,EAAE,QAAQzB;AAC5B,IAAA2B,KAAOF,EAAEzB,CAAC,IAAI0B,EAAE1B,CAAC;AAGnB,SAAO2B;AACT;ACVO,SAASC,EAAKtC,GAAmB;AACtC,MAAIqC,IAAM;AAEV,WAAS3B,IAAI,GAAGA,IAAIV,EAAE,QAAQU,KAAK;AACjC,UAAMX,IAAIC,EAAEU,CAAC;AACb,IAAA2B,KAAOtC,IAAIA;AAAA,EACb;AAEA,SAAO,KAAK,KAAKsC,CAAG;AACtB;ACPA,SAASE,EAAMC,GAAWxC,GAAW;AACnC,QAAMyC,IAAQH,EAAKE,CAAC,IAAIF,EAAKtC,CAAC;AAC9B,MAAIyC,MAAU,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAE7D,QAAMC,IAAIR,GAAIM,GAAGxC,CAAC,IAAIyC,GAChBE,IAAU,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGD,CAAC,CAAC;AAE3C,SAAO,KAAK,KAAKC,CAAO;AAC1B;AAEO,SAASC,GAAO/B,GAA4C;AACjE,QAAMgC,IAAIhC,EAAQ,MAAM,MAElBsB,IAAY,IAAI,aAAa,CAACU,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CT,IAAY,IAAI,aAAa,CAACS,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CH,IAAY,IAAI,aAAa,CAACG,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAE/CC,IAAQP,EAAMH,GAAGM,CAAC,GAClBK,IAAOR,EAAMJ,GAAGO,CAAC,GACjBM,IAAQT,EAAMJ,GAAGC,CAAC;AAExB,SAAO,CAACU,GAAOC,GAAMC,CAAK;AAC5B;AC1BO,SAASC,GAAWJ,GAAmB;AAC5C,MAAIA,EAAE,SAAS,KAAKA,EAAE,SAAS;AAC7B,UAAM,IAAI,MAAM,qBAAqB;AAGvC,QAAMK,IAAML,EAAE,KAAK,CAAC,GAClBM,IAAMN,EAAE,KAAK,CAAC,GACdO,IAAMP,EAAE,KAAK,CAAC,GACVQ,IAAMR,EAAE,KAAK,CAAC,GAClBS,IAAMT,EAAE,KAAK,CAAC,GACdU,IAAMV,EAAE,KAAK,CAAC,GACVW,IAAMX,EAAE,KAAK,CAAC,GAClBY,IAAMZ,EAAE,KAAK,CAAC,GACda,IAAMb,EAAE,KAAK,CAAC,GAEVc,IAAML,IAAMI,IAAMH,IAAME,GACxBG,IAAML,IAAMC,IAAMH,IAAMK,GACxBG,IAAMR,IAAMI,IAAMH,IAAME,GAExBM,IAAMV,IAAMK,IAAMN,IAAMO,GACxBK,IAAMb,IAAMQ,IAAMN,IAAMI,GACxBQ,IAAMb,IAAMK,IAAMN,IAAMO,GAExBQ,IAAMd,IAAMI,IAAMH,IAAME,GACxBY,IAAMd,IAAMC,IAAMH,IAAMK,GACxBY,IAAMjB,IAAMI,IAAMH,IAAME,GAExBe,IAAMlB,IAAMS,IAAMR,IAAMS,IAAMR,IAAMS;AAE1C,MAAIO,MAAQ;AACV,UAAM,IAAI,MAAM,iBAAiB;AAGnC,QAAMC,IAAS,IAAID,GAEbE,IAAM/C,EAAa,GAAG,CAAC;AAE7B,SAAA+C,EAAI,KAAK,CAAC,IAAIX,IAAMU,GACpBC,EAAI,KAAK,CAAC,IAAIR,IAAMO,GACpBC,EAAI,KAAK,CAAC,IAAIL,IAAMI,GAEpBC,EAAI,KAAK,CAAC,IAAIV,IAAMS,GACpBC,EAAI,KAAK,CAAC,IAAIP,IAAMM,GACpBC,EAAI,KAAK,CAAC,IAAIJ,IAAMG,GAEpBC,EAAI,KAAK,CAAC,IAAIT,IAAMQ,GACpBC,EAAI,KAAK,CAAC,IAAIN,IAAMK,GACpBC,EAAI,KAAK,CAAC,IAAIH,IAAME,GAEbC;AACT;AChDO,SAASC,EAAQ1D,GAA0B;AAChD,SAAOoC,GAAWpC,EAAQ,KAAK;AACjC;ACJO,SAAS2D,GAAQ3D,GAA4C;AAClE,QAAMgC,IAAIhC,EAAQ,MAAM,MAElBsB,IAAkB,IAAI,aAAa,CAACU,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDT,IAAkB,IAAI,aAAa,CAACS,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDH,IAAkB,IAAI,aAAa,CAACG,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAE3D,SAAO,CAACP,EAAKH,CAAC,GAAGG,EAAKF,CAAC,GAAGE,EAAKI,CAAC,CAAC;AACnC;ACRO,SAAS+B,EAAUC,GAAwB;AAChD,QAAMJ,IAAM/C,EAAamD,EAAO,MAAMA,EAAO,IAAI;AAEjD,WAAS7C,IAAM,GAAGA,IAAM6C,EAAO,MAAM7C;AACnC,aAASC,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,MAAAwC,EAAI,KAAKnD,EAAMmD,EAAI,MAAMxC,GAAKD,CAAG,CAAC,IAChC6C,EAAO,KAAKvD,EAAMuD,EAAO,MAAM7C,GAAKC,CAAG,CAAC;AAI9C,SAAOwC;AACT;ACXO,SAASK,EAAIxC,GAAWC,GAAmB;AAChD,MAAID,EAAE,SAASC,EAAE;AACf,UAAM,IAAI,MAAM,0CAA0C;AAG5D,QAAMkC,IAAM/C,EAAaY,EAAE,MAAMC,EAAE,IAAI,GAEjCwC,IAAQzC,EAAE,MACV0C,IAAQ1C,EAAE,MACV2C,IAAQ1C,EAAE;AAEhB,WAASP,IAAM,GAAGA,IAAM+C,GAAO/C;AAC7B,aAASC,IAAM,GAAGA,IAAMgD,GAAOhD,KAAO;AACpC,UAAIO,IAAM;AAEV,eAAS0C,IAAI,GAAGA,IAAIF,GAAOE;AACzB,QAAA1C,KAAOF,EAAE,KAAKhB,EAAMgB,EAAE,MAAMN,GAAKkD,CAAC,CAAC,IAAI3C,EAAE,KAAKjB,EAAMiB,EAAE,MAAM2C,GAAGjD,CAAG,CAAC;AAGrE,MAAAwC,EAAI,KAAKnD,EAAMmD,EAAI,MAAMzC,GAAKC,CAAG,CAAC,IAAIO;AAAA,IACxC;AAGF,SAAOiC;AACT;ACrBO,SAASU,GAAanE,GAA0B;AACrD,QAAMoE,IAAIpE,EAAQ,OAEZqE,IAAKT,EAAUQ,CAAC;AACtB,SAAON,EAAIO,GAAID,CAAC;AAClB;ACNA,MAAME,IAAU,MAAM,KAAK;AAEpB,SAASC,GACdvE,GACkD;AAClD,QAAM,CAACsB,GAAGC,GAAGM,CAAC,IAAI8B,GAAQ3D,CAAO,GAC3B,CAACiC,GAAOC,GAAMC,CAAK,IAAIJ,GAAO/B,CAAO;AAE3C,SAAO,CAACsB,GAAGC,GAAGM,GAAGI,IAAQqC,GAASpC,IAAOoC,GAASnC,IAAQmC,CAAO;AACnE;ACPA,MAAME,KAAS,IAAI,KAAK;AAEjB,SAASC,GAAkBzE,GAA2B;AAC3D,QAAM0E,IAAMhB,EAAQ1D,CAAO,GAGrBa,IAFO+C,EAAUc,CAAG,EAER,KAAK,IAAI,CAACvF,MAAMA,IAAIqF,EAAM;AAE5C,SAAOtD,EAAcL,CAAI;AAC3B;ACXO,SAAS8D,GAAkC3E,GAA2B;AAC3E,QAAM0E,IAAMhB,EAAQ1D,CAAO,GACrB4E,IAAOhB,EAAUc,CAAG;AAE1B,SAAOxD,EAAc0D,EAAK,IAAI;AAChC;ACPA,MAAMC,IAAU,KAAK,KAAK,KACpB7F,KAAM;AAEZ,SAASI,EAAMF,GAAW;AACxB,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAAS4F,EACdxD,GACAC,GACAM,GACAI,GACAC,GACAC,GACA;AACA,QAAM4C,IAAS9C,IAAQ4C,GACjBG,IAAQ9C,IAAO2C,GACfI,IAAS9C,IAAQ0C,GAEjBK,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIH,CAAK,GACrBI,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIJ,CAAM,GAGtBK,IAAK,CAAChE,GAAG,GAAG,CAAC,GAEbiE,IAAK,CAAChE,IAAI6D,GAAM7D,IAAI8D,GAAM,CAAC;AAGjC,MAAI,KAAK,IAAIA,CAAI,IAAIrG;AACnB,UAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAMwG,IAAK3D,IAAIsD,GAETM,IAAM5D,KAAKqD,IAAOC,IAAOC,KAASC,GAElCK,IAAY7D,IAAIA,IAAI2D,IAAKA,IAAKC,IAAKA,GAEnCE,IAAK,KAAK,KAAK,KAAK,IAAI,GAAGD,CAAS,CAAC;AAE3C,SAAOxE,EAAc;AAAA,IACnB9B,EAAMkG,EAAG,CAAC,CAAC;AAAA,IACXlG,EAAMkG,EAAG,CAAC,CAAC;AAAA,IACXlG,EAAMkG,EAAG,CAAC,CAAC;AAAA,IACXlG,EAAMmG,EAAG,CAAC,CAAC;AAAA,IACXnG,EAAMmG,EAAG,CAAC,CAAC;AAAA,IACXnG,EAAMmG,EAAG,CAAC,CAAC;AAAA,IACXnG,EAAMoG,CAAE;AAAA,IACRpG,EAAMqG,CAAE;AAAA,IACRrG,EAAMuG,CAAE;AAAA,EAAA,CACT;AACH;ACrDO,SAASC,GAAMtE,GAAW;AAC/B,SAAOwD,EAAexD,GAAGA,GAAGA,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAASuE,GAAUvE,GAAWO,GAAW;AAC9C,SAAOiD,EAAexD,GAAGA,GAAGO,GAAG,IAAI,IAAI,GAAG;AAC5C;ACFO,SAASiE,GAAWxE,GAAWC,GAAWM,GAAWK,GAAc;AACxE,SAAO4C,EAAexD,GAAGC,GAAGM,GAAG,IAAIK,GAAM,EAAE;AAC7C;ACFO,SAAS6D,GAAazE,GAAWC,GAAWM,GAAW;AAC5D,SAAOiD,EAAexD,GAAGC,GAAGM,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAASmE,GAAa1E,GAAWW,GAAe;AACrD,SAAO6C,EAAexD,GAAGA,GAAGA,GAAGW,GAAOA,GAAOA,CAAK;AACpD;ACFO,SAASgE,GAAW3E,GAAWO,GAAW;AAC/C,SAAOiD,EAAexD,GAAGA,GAAGO,GAAG,IAAI,IAAI,EAAE;AAC3C;ACCA,IAAIqE,IAA8B;AAE3B,SAASC,KAAW;AACzB,SAAKD,MACHA,KAAS,YAAY;AAEnB,QAAI,OAAO,UAAY,OAAe,QAAQ,UAAU;AACtD,UAAI;AACF,cAAM,EAAE,cAAAE,EAAA,IAAiB,MAAM,OAAO,uCAAI,GACpC,EAAE,MAAAC,EAAA,IAAS,MAAM,OAAO,uCAAM,GAC9BC,IAAWD;AAAA,UACf,QAAQ,IAAA;AAAA,UACR;AAAA,QAAA,GAEIE,IAAaH,EAAaE,CAAQ;AACxC,cAAME,EAAKD,CAAU;AAAA,MACvB,SAASE,GAAG;AACV,sBAAQ,MAAM,gCAAgCA,CAAC,GACzCA;AAAA,MACR;AAAA,SACK;AAEL,YAAMC,IAAU,kvtrBAGd,SAAA;AAEF,YAAMF,EAAKE,CAAO;AAAA,IACpB;AAAA,EACF,GAAA,IAEKR;AACT;AAEA,eAAsBS,GACpBrH,GACAsH,IAAY,MACZC,IAAU,YAKT;AACD,QAAMV,GAAA;AAKN,QAAMW,wBAAiB,IAAA,GACjBC,wBAAiB,IAAA;AAEvB,MAAIC,IAAU;AAEd,QAAMC,IAAwB,CAAA,GACxBC,IAAoB,CAAA;AAE1B,aAAW3H,KAAQD,EAAU,OAAO;AAClC,UAAM6H,IAAS5H,EAAK,QAAQ;AAE5B,IAAKuH,EAAW,IAAIK,CAAM,MACxBL,EAAW,IAAIK,GAAQH,CAAO,GAC9BD,EAAW,IAAIC,GAASG,CAAM,GAC9BH,MAGFC,EAAU,KAAK,MAAM,KAAK1H,EAAK,IAAI,CAAC,GACpC2H,EAAQ,KAAKJ,EAAW,IAAIK,CAAM,CAAE;AAAA,EACtC;AAKA,QAAMC,IAAY;AAAA,IAChB,SAAS;AAAA,MACP,OAAO,MAAM,KAAK9H,EAAU,QAAQ,MAAM,IAAI;AAAA,IAAA;AAAA,IAEhD,WAAA2H;AAAA,IACA,SAAAC;AAAA,EAAA,GAMIG,IAAU,MAAMC;AAAA,IACpB,KAAK,UAAUF,CAAS;AAAA,IACxBR;AAAA,IACAC;AAAA,EAAA;AAMF,WAASU,EAAMC,GAID;AACZ,UAAM,EAAE,SAAAxH,GAAS,WAAAiH,GAAW,SAAAC,MAAYM,GAElCC,IAAU,CAAC,GAAG,IAAI,IAAIP,CAAO,CAAC,EAAE,IAAI,CAACQ,OAAe;AAAA,MACxD,QAAQX,EAAW,IAAIW,CAAC;AAAA,IAAA,EACxB,GAEIC,IAAQV,EAAU,IAAI,CAACW,GAAe/H,OAAe;AAAA,MACzD,SAAS;AAAA,QACP,QAAQkH,EAAW,IAAIG,EAAQrH,CAAC,CAAC;AAAA,MAAA;AAAA,MAEnC,MAAM,IAAI,aAAa+H,CAAG;AAAA,IAAA,EAC1B;AAEF,WAAO;AAAA,MACL,SAAS1G,EAAclB,EAAQ,KAAK;AAAA,MACpC,SAAAyH;AAAA,MACA,OAAAE;AAAA,IAAA;AAAA,EAEJ;AAKA,SAAO;AAAA,IACL,WAAWJ,EAAMF,EAAQ,aAAa;AAAA,IACtC,cAAcE,EAAMF,EAAQ,QAAQ;AAAA,IACpC,oBAAoBA;AAAA,EAAA;AAExB;AC5HO,SAASQ,GACdvI,GACAwB,GACW;AACX,QAAM,CAACgH,GAAIC,GAAIC,CAAE,IAAI,OAAOlH,KAAS,WAAW,CAACA,GAAMA,GAAMA,CAAI,IAAIA;AAErE,MACEgH,IAAK,KACLC,IAAK,KACLC,IAAK,KACL,CAAC,OAAO,UAAUF,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE;AAEpB,UAAM,IAAI,MAAM,gDAAgD;AAGlE,QAAMhG,IAAI1C,EAAU,QAAQ,MAAM,MAG5B2I,IAAW;AAAA,IACfjG,EAAE,CAAC,IAAI8F;AAAA,IACP9F,EAAE,CAAC,IAAI8F;AAAA,IACP9F,EAAE,CAAC,IAAI8F;AAAA,IAEP9F,EAAE,CAAC,IAAI+F;AAAA,IACP/F,EAAE,CAAC,IAAI+F;AAAA,IACP/F,EAAE,CAAC,IAAI+F;AAAA,IAEP/F,EAAE,CAAC,IAAIgG;AAAA,IACPhG,EAAE,CAAC,IAAIgG;AAAA,IACPhG,EAAE,CAAC,IAAIgG;AAAA,EAAA,GAGHL,IAAgB,CAAA;AAEtB,aAAWpI,KAAQD,EAAU,OAAO;AAClC,UAAM,CAACJ,GAAGgJ,GAAGC,CAAC,IAAI5I,EAAK;AAEvB,aAASM,IAAI,GAAGA,IAAIiI,GAAIjI;AACtB,eAASuI,IAAI,GAAGA,IAAIL,GAAIK;AACtB,iBAASlE,IAAI,GAAGA,IAAI8D,GAAI9D;AACtB,UAAAyD,EAAM,KAAK;AAAA,YACT,SAASpI,EAAK;AAAA,YAEd,MAAM,IAAI,aAAa,EAAEL,IAAIW,KAAKiI,IAAKI,IAAIE,KAAKL,IAAKI,IAAIjE,KAAK8D,CAAE,CAAC;AAAA,UAAA,CAClE;AAAA,EAIT;AAEA,SAAO;AAAA,IACL,SAAS9G,EAAc+G,CAAQ;AAAA,IAC/B,OAAAN;AAAA,EAAA;AAEJ;AC5DA,SAASU,GAAMxE,GAAgByE,GAAiBC,GAAyB;AACvE,QAAM9E,IAAM/C,EAAamD,EAAO,OAAO,GAAGA,EAAO,OAAO,CAAC;AAEzD,MAAI2E,IAAM;AAEV,WAASxH,IAAM,GAAGA,IAAM6C,EAAO,MAAM7C;AACnC,QAAIA,MAAQsH;AAEZ,eAASrH,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,QAAIA,MAAQsH,MAEZ9E,EAAI,KAAK+E,GAAK,IAAI3E,EAAO,KAAKvD,EAAMuD,EAAO,MAAM7C,GAAKC,CAAG,CAAC;AAI9D,SAAOwC;AACT;AAEO,SAASgF,GAAY5E,GAAwB;AAClD,MAAIA,EAAO,SAASA,EAAO;AACzB,UAAM,IAAI,MAAM,sCAAsC;AAGxD,QAAM6D,IAAI7D,EAAO;AAGjB,MAAI6D,MAAM,GAAG;AACX,UAAM1F,IAAI6B,EAAO;AAEjB,WACE7B,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AAAA,EAEpC;AAEA,MAAI0F,MAAM;AACR,WAAO7D,EAAO,KAAK,CAAC;AAGtB,MAAI6D,MAAM;AACR,WAAO7D,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC;AAGzE,MAAIN,IAAM;AAEV,WAAStC,IAAM,GAAGA,IAAMyG,GAAGzG,KAAO;AAChC,UAAMyH,IAAOzH,IAAM,MAAM,IAAI,IAAI;AAEjC,IAAAsC,KAAOmF,IAAO7E,EAAO,KAAK5C,CAAG,IAAIwH,GAAYJ,GAAMxE,GAAQ,GAAG5C,CAAG,CAAC;AAAA,EACpE;AAEA,SAAOsC;AACT;ACpDO,SAASoF,GAAO3I,GAA0B;AAC/C,SAAO,KAAK,IAAIyI,GAAYzI,EAAQ,KAAK,CAAC;AAC5C;ACFO,SAAS2I,GAAOrJ,GAA8B;AACnD,SAAOsJ,GAActJ,EAAU,OAAO;AACxC;ACHA,SAASuJ,GAAIvH,GAAWC,GAAmB;AACzC,SAAOA,MAAM;AACX,KAACD,GAAGC,CAAC,IAAI,CAACA,GAAGD,IAAIC,CAAC;AAGpB,SAAO,KAAK,IAAID,CAAC;AACnB;AAEO,SAASwH,GAAYxJ,GAA8C;AACxE,QAAMmE,IAA8B,CAAA;AAEpC,aAAWlE,KAAQD,EAAU,OAAO;AAClC,UAAM6H,IAAS5H,EAAK,QAAQ;AAE5B,IAAAkE,EAAI0D,CAAM,MAAM,GAChB1D,EAAI0D,CAAM;AAAA,EACZ;AAEA,SAAO1D;AACT;AAEA,SAASsF,GAAeC,GAAsC;AAG5D,SAFe,OAAO,OAAOA,CAAI,EAEnB,OAAO,CAAC1H,GAAGC,MAAMsH,GAAIvH,GAAGC,CAAC,CAAC;AAC1C;AAEA,SAAS0H,GAAUC,GAA8B;AAC/C,MAAI,CAACA,EAAS,SAAS,GAAG;AACxB,WAAO,CAAC,GAAGA,CAAQ,EAAE,KAAA;AAGvB,QAAMC,IAAOD,EAAS,OAAO,CAACzC,MAAMA,MAAM,OAAOA,MAAM,GAAG,EAAE,KAAA;AAE5D,SAAO,CAAC,KAAK,GAAIyC,EAAS,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,IAAK,GAAGC,CAAI;AAChE;AAEA,SAASC,GACPJ,GACAK,GACQ;AAGR,SAFiBA,EAAS,OAAO,KAAKL,CAAI,CAAC,EAGxC,IAAI,CAACM,MAAO;AACX,UAAMC,IAAQP,EAAKM,CAAE;AAErB,WAAOC,MAAU,IAAID,IAAK,GAAGA,CAAE,GAAGC,CAAK;AAAA,EACzC,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAASC,GACPR,GACwB;AACxB,QAAMS,IAASV,GAAeC,CAAI,GAE5BvF,IAA8B,CAAA;AAEpC,aAAW,CAACiG,GAASH,CAAK,KAAK,OAAO,QAAQP,CAAI;AAChD,IAAAvF,EAAIiG,CAAO,IAAIH,IAAQE;AAGzB,SAAOhG;AACT;AAEO,SAASkG,GAAYrK,GAA8B;AACxD,SAAO8J,GAAuBN,GAAYxJ,CAAS,GAAG2J,EAAS;AACjE;AAEO,SAASW,GAAetK,GAA8B;AAC3D,SAAO8J;AAAA,IACLI,GAAmBV,GAAYxJ,CAAS,CAAC;AAAA,IACzC2J;AAAA,EAAA;AAEJ;ACrEO,MAAMY,IAA6C;AAAA,EACxD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,MAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC1D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,WAAW,MAAM,KAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC7D,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,SAAS,MAAM,MAAA;AAAA,EACxD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAA;AAAA,EACzD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAA;AAAA,EACzD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,MAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,cAAc,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,UAAU,MAAM,MAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,MAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,OAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,aAAa,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,OAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,MAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,GAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,OAAO,MAAM,OAAA;AAAA,EACzD,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,UAAU,MAAM,QAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,QAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,QAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,gBAAgB,MAAM,OAAA;AAAA,EAClE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,QAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,OAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,MAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,QAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,QAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,IAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,IAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,gBAAgB,MAAM,OAAA;AAAA,EAClE,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,IAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACjE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAChE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,iBAAiB,MAAM,IAAA;AAAA,EACrE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,gBAAgB,MAAM,IAAA;AAAA,EACpE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAChE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AACnE,GAEaC,KAAkB,OAAO,OAAOD,CAAa,EAAE;AAAA,EAC1D,CAACE,GAAKT,OACJS,EAAIT,EAAG,MAAM,IAAIA,GACVS;AAAA,EAET,CAAA;AACF;AAEO,SAASC,GAAW7C,GAAyC;AAClE,SAAO2C,GAAgB3C,CAAM;AAC/B;AAKO,MAAM8C,KAAuB,IAAI;AAAA,EACtC,OAAO,OAAOJ,CAAa,EAAE,IAAI,CAACP,MAAO,CAACA,EAAG,QAAQA,EAAG,YAAY,CAAC;AACvE,GAEaY,KAAuB,IAAI;AAAA,EACtC,OAAO,OAAOL,CAAa,EAAE,IAAI,CAACP,MAAO,CAACA,EAAG,cAAcA,EAAG,MAAM,CAAC;AACvE;AClJA,SAASa,GAAS5K,GAAoB;AACpC,QAAM4K,IAAW5K,EAAK,YAAY;AAElC,MAAI,OAAO4K,KAAa;AACtB,WAAOA;AAGT,QAAMC,IAAc7K,EAAK,QAAQ,YAAY;AAE7C,MAAI,OAAO6K,KAAgB;AACzB,WAAOA;AAGT,QAAMV,IAAUM,GAAWzK,EAAK,QAAQ,MAAM;AAE9C,MAAI,CAACmK;AACH,UAAM,IAAI,MAAM,oBAAoBnK,EAAK,QAAQ,MAAM,EAAE;AAG3D,SAAOmK,EAAQ;AACjB;AAEO,SAASW,GAAS/K,GAA8B;AACrD,MAAIgL,IAAO;AAEX,aAAW/K,KAAQD,EAAU;AAC3B,IAAAgL,KAAQH,GAAS5K,CAAI;AAGvB,SAAO+K;AACT;AC7BO,SAASC,GAAQjL,GAA8B;AACpD,SAAO+K,GAAS/K,CAAS,IAAIqJ,GAAOrJ,CAAS;AAC/C;ACKO,SAASkL,GACd/C,GACAgD,GACAC,GACS;AACT,SAAO;AAAA,IACL,SAAAjD;AAAA,IACA,MAAAgD;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;ACfO,SAASC,EAAU3K,GAAkBT,GAAoB;AAC9D,QAAM,CAACL,GAAGgJ,GAAGC,CAAC,IAAI5I,EAAK,MAEjBkL,IAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,CAACvL,GAAGgJ,GAAGC,CAAC,CAAC;AAAA,EAAA,GAG5ByC,IAAShH,EAAU5D,EAAQ,KAAK,GAChC6K,IAAS/G,EAAI8G,GAAQH,CAAI;AAE/B,SAAO,IAAI,aAAa,CAACI,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACdO,SAASC,EAAW9K,GAAkB+K,GAAsB;AACjE,QAAMC,IAAM;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAMD;AAAA,EAAA,GAGFrG,IAAMhB,EAAQ1D,CAAO,GACrB4E,IAAOhB,EAAUc,CAAG,GAEpBmG,IAAS/G,EAAIc,GAAMoG,CAAG;AAE5B,SAAO,IAAI,aAAa,CAACH,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACbO,SAASI,GAASjL,GAAkBsB,GAASC,GAAiB;AACnE,QAAM2J,IAAkC;AAAA,IACtC3J,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,EAAA;AAGtB,WAASzB,IAAI,GAAGA,IAAI,GAAGA;AACrB,IAAAqL,EAAMrL,CAAC,KAAK,KAAK,MAAMqL,EAAMrL,CAAC,CAAC;AAGjC,QAAMsL,IAAkB;AAAA,IACtB,SAAS7J,EAAE;AAAA,IACX,MAAM4J;AAAA,EAAA,GAGFE,IAAQT,EAAU3K,GAASmL,CAAS;AAE1C,SAAO1J,EAAK2J,CAAK;AACnB;ACvBA,SAASC,EAAUnM,GAAmB;AACpC,UAASA,IAAI,IAAK,KAAK;AACzB;AAEO,SAASD,GAA+BM,GAAwB;AACrE,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM;AAAA,MACJ8L,EAAU9L,EAAK,KAAK,CAAC,CAAC;AAAA,MACtB8L,EAAU9L,EAAK,KAAK,CAAC,CAAC;AAAA,MACtB8L,EAAU9L,EAAK,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EACxB;AAEJ;ACVO,SAAS+L,GACdnE,GACAuD,GACY;AACZ,SAAO,EAAE,QAAAvD,GAAQ,YAAAuD,EAAA;AACnB;ACNA,SAASa,EAAWC,GAAuB;AAGzC,SAAO,OAAOA,EAAM,QAAQ,UAAU,EAAE,CAAC;AAC3C;AAEA,SAASC,EAASC,GAAwB;AACxC,SAAOA,EAAK,MAAM,sBAAsB,KAAK,CAAA;AAC/C;AAEA,SAASC,GAAwBC,GAAoB;AACnD,UAAQ;AAAA,IACN,gBAAgBA,CAAU;AAAA,EAAA;AAI9B;AAEO,SAASC,GAAQC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAAC5M,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO;AAEjB,MAAIoC,IAAI,GACJC,IAAI,GACJM,IAAI,GAEJI,IAAQ,GACRC,IAAO,GACPC,IAAQ,GAERyJ,IAAa,MAEbI,IAAwB,CAAA;AAC5B,QAAMC,IAAuB,CAAA;AAE7B,MAAIC,IAAS,IACTC,IAA2B,CAAA,GAC3BC,IAAkB;AAEtB,aAAWV,KAAQK,GAAO;AACxB,QAAIL,EAAK,WAAW,gCAAgC;AAElD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,2BAA2B;AAEpD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,gBAAgB;AACzC,MAAApK,IAAIiK,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAAnK,IAAIgK,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAA7J,IAAI0J,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,mBAAmB;AAC5C,MAAAzJ,IAAQsJ,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,EAAK,WAAW,kBAAkB;AAC3C,MAAAxJ,IAAOqJ,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC1BA,EAAK,WAAW,mBAAmB;AAC5C,MAAAvJ,IAAQoJ,EAAWE,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,MAAS,SAAS;AAC3B,MAAAQ,IAAS,IACTC,IAAiB,CAAA,GACjBC,IAAkB;AAClB;AAAA,IACF;AAEA,QAAIF,KAAUR,EAAK,WAAW,GAAG,GAAG;AAClC,MAAAS,EAAe,KAAKT,CAAI,GAEpBA,EAAK,SAAS,aAAa,MAC7BU,IAAkB;AAGpB;AAAA,IACF;AAEA,IAAIF,KAAUE,MACRJ,EAAY,WAAW,MACzBA,IAAc,CAAC,GAAGG,CAAc,IAGlCF,EAAS,KAAKR,EAASC,CAAI,CAAC;AAAA,EAEhC;AAIA,EAFa,WAAW,KAAKE,CAAU,KAGrCD,GAAwBC,CAAU;AAGpC,QAAM5L,IAAU8E,EAAexD,GAAGC,GAAGM,GAAGI,GAAOC,GAAMC,CAAK,GAEpDkK,IAAKL,EAAY,UAAU,CAAC9M,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDoN,IAAKN,EAAY,UAAU,CAAC9M,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDqN,IAAKP,EAAY,UAAU,CAAC9M,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDsN,IAAWR,EAAY,UAAU,CAAC9M,MAAMA,EAAE,SAAS,aAAa,CAAC;AAEvE,MAAImN,IAAK,KAAKC,IAAK,KAAKC,IAAK,KAAKC,IAAW;AAC3C,UAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAM7E,IAAQsE,EAAS,IAAI,CAACjL,OAAS;AAAA,IACnC,SAAS;AAAA,MACP,QAAQA,EAAIwL,CAAQ;AAAA,IAAA;AAAA,IAGtB,MAAM,IAAI,aAAa;AAAA,MACrBjB,EAAWvK,EAAIqL,CAAE,CAAC;AAAA,MAClBd,EAAWvK,EAAIsL,CAAE,CAAC;AAAA,MAClBf,EAAWvK,EAAIuL,CAAE,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA,EACD;AAEF,SAAO;AAAA,IACL,SAAAvM;AAAA,IACA,OAAA2H;AAAA,EAAA;AAEJ;AAEO,SAAS8E,GAAMnN,GAAsBG,IAAY,GAAW;AACjE,QAAMiN,IAAInI,GAAWjF,EAAU,OAAO,GAEhCyM,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,mBAAmB,GAC9BA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,sCAAsC,GACjDA,EAAM,KAAK,+BAA+B,GAE1CA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAEtDsM,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAEtDsM,EAAM,KAAK,kBAAkBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAEtDsM,EAAM,KAAK,qBAAqBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAEzDsM,EAAM,KAAK,oBAAoBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAExDsM,EAAM,KAAK,qBAAqBW,EAAE,CAAC,EAAE,QAAQjN,CAAS,CAAC,EAAE,GAEzDsM,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,OAAO,GAClBA,EAAM,KAAK,kBAAkB,GAC7BA,EAAM,KAAK,wBAAwB,GACnCA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB;AAE/B,WAASlM,IAAI,GAAGA,IAAIP,EAAU,MAAM,QAAQO,KAAK;AAC/C,UAAMN,IAAOD,EAAU,MAAMO,CAAC;AAE9B,IAAAkM,EAAM;AAAA,MACJ,GAAGxM,EAAK,QAAQ,MAAM,GAAGM,IAAI,CAAC,IACzBN,EAAK,QAAQ,MAAM,IACnBA,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC;AAAA,IAAA;AAAA,EAExC;AAEA,SAAOsM,EAAM,KAAK;AAAA,CAAI;AACxB;ACrKA,SAASY,GAAYjB,GAAuB;AAC1C,SAAOA,EAAK,cAAc,WAAW,WAAW;AAClD;AAEA,SAASkB,GAAYlB,GAAuB;AAC1C,QAAMmB,IAAInB,EAAK,KAAA,EAAO,YAAA;AACtB,SAAOmB,EAAE,WAAW,GAAG,KAAKA,EAAE,WAAW,GAAG;AAC9C;AAyCO,SAASC,GAAWhB,GAAyB;AAClD,QAAMC,IAAQD,EAAK,MAAM;AAAA,CAAI,EAAE,IAAI,CAAC5M,MAAMA,EAAE,MAAM;AAElD,MAAI6N,IAAS;AAGb,EAAAA;AAGA,QAAMC,IAAQ,OAAOjB,EAAMgB,GAAQ,CAAC,GAG9BE,IAAwB,CAAA;AAE9B,WAASpN,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,UAAMV,IAAI4M,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEjD,QAAI5N,EAAE,WAAW;AACf,YAAM,IAAI,MAAM,wBAAwB;AAG1C,IAAA8N,EAAY,KAAK9N,EAAE,CAAC,IAAI6N,GAAO7N,EAAE,CAAC,IAAI6N,GAAO7N,EAAE,CAAC,IAAI6N,CAAK;AAAA,EAC3D;AAEA,QAAMhN,IAAUkB,EAAc+L,CAAW,GAGnCC,IAAUnB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,GAGrCI,IAASpB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEtD,MAAIG,EAAQ,WAAWC,EAAO;AAC5B,UAAM,IAAI,MAAM,wBAAwB;AAI1C,EAAIR,GAAYZ,EAAMgB,CAAM,CAAC,KAC3BA;AAIF,MAAIK,IAAS;AACb,EAAAA,IAAS,CAACR,GAAYb,EAAMgB,CAAM,CAAC,GAEnCA;AAEA,QAAMpF,IAAgB,CAAA;AAEtB,MAAI0F,IAAe,GACfC,IAAYH,EAAO,CAAC;AAEL,EAACC,KAAS1J,EAAQ1D,CAAO;AAE5C,QAAMuN,IAAaJ,EAAO,OAAO,CAAC7L,GAAGC,MAAMD,IAAIC,GAAG,CAAC;AAEnD,WAAS1B,IAAI,GAAGA,IAAI0N,GAAY1N,KAAK;AAGnC,UAAM2N,IAFSzB,EAAMgB,GAAQ,EAAE,MAAM,KAAK,EAEpB,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM,GAEtCtC,IAAO2C,IACT,IAAI,aAAaI,CAAM,IACvB1C,EAAW9K,GAAS,IAAI,aAAawN,CAAM,CAAC;AAEhD,IAAA7F,EAAM,KAAK;AAAA,MACT,SAAS;AAAA,QACP,QAAQuF,EAAQG,CAAY;AAAA,MAAA;AAAA,MAE9B,MAAA5C;AAAA,IAAA,CACD,GAED6C,KAEIA,MAAc,KAAKD,IAAeF,EAAO,SAAS,MACpDE,KACAC,IAAYH,EAAOE,CAAY;AAAA,EAEnC;AAEA,SAAO;AAAA,IACL,SAAArN;AAAA,IACA,OAAA2H;AAAA,EAAA;AAEJ;AAEO,SAAS8F,GACdnO,GACAoO,GAKQ;AACR,QAAMC,IAAQD,GAAS,SAAS,6BAC1BV,IAAQU,GAAS,SAAS,GAC1BN,IAASM,GAAS,UAAU,IAE5B3B,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK4B,CAAK,GAChB5B,EAAM,KAAK,OAAOiB,CAAK,CAAC;AAGxB,QAAMhL,IAAI1C,EAAU,QAAQ,MAAM;AAElC,EAAAyM,EAAM,KAAK,GAAG/J,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC+J,EAAM,KAAK,GAAG/J,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC+J,EAAM,KAAK,GAAG/J,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAGpC,QAAM4L,wBAAc,IAAA;AAEpB,aAAWrO,KAAQD,EAAU,OAAO;AAClC,UAAM6H,IAAS5H,EAAK,QAAQ;AAE5B,IAAKqO,EAAQ,IAAIzG,CAAM,KACrByG,EAAQ,IAAIzG,GAAQ,EAAE,GAGxByG,EAAQ,IAAIzG,CAAM,EAAG,KAAK5H,CAAI;AAAA,EAChC;AAEA,QAAMkI,IAAU,CAAC,GAAGmG,EAAQ,MAAM,GAC5BjG,IAAQ,CAAC,GAAGiG,EAAQ,OAAA,CAAQ,EAAE,KAAA;AAEpC,EAAA7B,EAAM,KAAKtE,EAAQ,KAAK,GAAG,CAAC,GAC5BsE,EAAM,KAAKtE,EAAQ,IAAI,CAAC1H,MAAM6N,EAAQ,IAAI7N,CAAC,EAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAE/DgM,EAAM,KAAKqB,IAAS,WAAW,WAAW;AAE1C,aAAW7N,KAAQoI,GAAO;AACxB,UAAM6F,IAASJ,IAAS7N,EAAK,OAAOoL,EAAUrL,EAAU,SAASC,CAAI;AAErE,IAAAwM,EAAM,KAAK,GAAGyB,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EAAE;AAAA,EACrD;AAEA,SAAOzB,EAAM,KAAK;AAAA,CAAI;AACxB;AC/KO,SAAS8B,GAAkBhN,GAAgC;AAChE,QAAMb,IAAUkB,EAAc;AAAA,IAC5B,GAAGL,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,EAAA,CACf,GAEKiN,IAAU,IAAI,IAAIjN,EAAK,MAAM,IAAI,CAACkN,MAAc,CAACA,EAAK,MAAMA,CAAI,CAAC,CAAC,GAElEpG,IAAQ9G,EAAK,MAAM,IAAI,CAACtB,MAAc;AAC1C,UAAMwO,IAAOD,EAAQ,IAAIvO,EAAK,SAAS;AAEvC,QAAI,CAACwO;AACH,YAAM,IAAI,MAAM,iBAAiBxO,EAAK,SAAS,GAAG;AAGpD,WAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQwO,EAAK,QAAQ,CAAC;AAAA,MAAA;AAAA,MAGxB,MAAMjD,EAAW9K,GAAS,IAAI,aAAaT,EAAK,QAAQ,CAAC;AAAA,IAAA;AAAA,EAE7D,CAAC;AAED,SAAO;AAAA,IACL,SAAAS;AAAA,IACA,OAAA2H;AAAA,EAAA;AAEJ;AAEO,SAASqG,GAAgB1O,GAAsB;AACpD,QAAM0C,IAAI1C,EAAU,QAAQ,MAAM,MAI5B2O,IAFU,CAAC,GAAG,IAAI,IAAI3O,EAAU,MAAM,IAAI,CAACS,MAAMA,EAAE,QAAQ,MAAM,CAAC,CAAC,EAEnD,IAAI,CAACoH,OAAY;AAAA,IACrC,MAAMA;AAAA,IACN,SAAS,CAACA,CAAM;AAAA,EAAA,EAChB;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,CAACnF,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,IAAA;AAAA,IAGnB,OAAAiM;AAAA,IAEA,OAAO3O,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,WAAWA,EAAK,QAAQ;AAAA,MAExB,UAAU,MAAM,KAAKoL,EAAUrL,EAAU,SAASC,CAAI,CAAC;AAAA,IAAA,EACvD;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAEV;AC3EA,SAAS2O,GAAYnC,GAAiBoC,GAAyB;AAC7D,QAAMC,IAAMrC,EAAM,UAAU,CAACL,MAASA,EAAK,KAAA,EAAO,YAAA,MAAkByC,CAAO;AAE3E,MAAIC,MAAQ;AACV,UAAM,IAAI,MAAM,WAAWD,CAAO,EAAE;AAGtC,SAAOC;AACT;AAIO,SAASC,GAAQvC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAAC5M,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,GAEXoP,IAAWJ,GAAYnC,GAAO,SAAS,GAEvC/L,IAAUkB,EAAc;AAAA,IAC5B,GAAG6K,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGvC,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGvC,EAAMuC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,EAAA,CAC/C,GAEKC,IAAaL,GAAYnC,GAAO,WAAW,GAE3C,CAACyC,CAAM,IAAIzC,EAAMwC,IAAa,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,GAExD5G,IAAgB,CAAA;AAEtB,WAAS9H,IAAI,GAAGA,IAAI2O,GAAQ3O,KAAK;AAC/B,UAAM4O,IAAS1C,EAAMwC,IAAa,IAAI1O,CAAC,EAAE,MAAM,KAAK,GAE9CsH,IAASsH,EAAO,CAAC,GAEjBvP,IAAI,OAAOuP,EAAO,CAAC,CAAC,GACpBvG,IAAI,OAAOuG,EAAO,CAAC,CAAC,GACpBtG,IAAI,OAAOsG,EAAO,CAAC,CAAC,GAEpBhE,IAAOK,EAAW9K,GAAS,IAAI,aAAa,CAACd,GAAGgJ,GAAGC,CAAC,CAAC,CAAC;AAE5D,IAAAR,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAAR,EAAA;AAAA,MACX,MAAAsD;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAAzK;AAAA,IACA,OAAA2H;AAAA,EAAA;AAEJ;AAEA,SAAS+G,EAAUvP,GAAqB;AACtC,SAAO,GAAGA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChC;AAEA,SAASwP,GAAc3O,GAAyC;AAC9D,QAAMgC,IAAIhC,EAAQ,MAAM;AAExB,SAAO;AAAA,IACL0O,EAAU,CAAC1M,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5B0M,EAAU,CAAC1M,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5B0M,EAAU,CAAC1M,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,EAAA;AAEhC;AAEO,SAAS4M,GAAMtP,GAA8B;AAClD,QAAMyM,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,SAAS,GACpBA,EAAM,KAAK,SAAS;AAEpB,QAAM8C,IAAeF,GAAcrP,EAAU,OAAO;AACpD,EAAAyM,EAAM,KAAK,GAAG8C,CAAY,GAC1B9C,EAAM,KAAK,WAAW,GACtBA,EAAM,KAAK,GAAGzM,EAAU,MAAM,MAAM,IAAI;AAExC,aAAWC,KAAQD,EAAU,OAAO;AAClC,UAAMuC,IAAI8I,EAAUrL,EAAU,SAASC,CAAI;AAC3C,IAAAwM,EAAM,KAAK,GAAGxM,EAAK,QAAQ,MAAM,IAAIsC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7D;AAEA,SAAOkK,EAAM,KAAK;AAAA,CAAI;AACxB;ACtFA,SAAS+C,GAAYC,GAAkC;AACrD,QAAMC,IAAwB,CAAA,GACxBC,IAAU;AAEhB,aAAWC,KAASH,EAAQ,SAASE,CAAO,GAAG;AAC7C,QAAIzD,IAAQ0D,EAAM,CAAC;AACnB,IAAI1D,EAAM,WAAW,GAAG,UAAWA,EAAM,MAAM,GAAG,EAAE,IACpDwD,EAAKE,EAAM,CAAC,CAAC,IAAI1D;AAAA,EACnB;AAEA,SAAOwD;AACT;AAEA,SAASG,GAAaH,GAAuB;AAC3C,MAAI,CAACA,EAAK;AACR,UAAM,IAAI,MAAM,mCAAmC;AAGrD,QAAM7P,IAAI6P,EAAK,QAAQ,MAAM,KAAK,EAAE,IAAI,MAAM;AAC9C,MAAI7P,EAAE,WAAW,EAAG,OAAM,IAAI,MAAM,iBAAiB;AAErD,SAAO+B,EAAc,CAAC/B,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAC7E;AA4BO,SAASiQ,GAAQtD,GAAc;AACpC,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM;AAAA,CAAI,GAE9BpE,IAAI,OAAOqE,EAAM,CAAC,CAAC,GACnBgD,IAAUhD,EAAM,CAAC,GAEjBiD,IAAOF,GAAYC,CAAO,GAC1B/O,IAAUmP,GAAaH,CAAI,GAE3BrH,IAAgB,CAAA;AAEtB,WAAS9H,IAAI,GAAGA,IAAI6H,GAAG7H,KAAK;AAC1B,UAAM,CAACsH,GAAQjI,GAAGgJ,GAAGC,CAAC,IAAI4D,EAAM,IAAIlM,CAAC,EAAE,MAAM,KAAK;AAElD,IAAA8H,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAAR,EAAA;AAAA,MACX,MAAM,IAAI,aAAa,CAAC,CAACjI,GAAG,CAACgJ,GAAG,CAACC,CAAC,CAAC;AAAA,IAAA,CACpC;AAAA,EACH;AAEA,SAAO,EAAE,SAAAnI,GAAS,OAAA2H,EAAA;AACpB;AAEA,SAASgH,GAAc3O,GAA0B;AAC/C,QAAMgC,IAAIhC,EAAQ,MAAM;AAGxB,SAAO,GAAGgC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChF;AAyBO,SAASqN,GAAM/P,GAA8B;AAClD,QAAMqI,IAAQrI,EAAU,OAElByM,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,OAAOpE,EAAM,MAAM,CAAC;AAE/B,QAAM2H,IAAaX,GAAcrP,EAAU,OAAO;AAElD,EAAAyM,EAAM,KAAK,YAAYuD,CAAU,GAAG;AAEpC,aAAW/P,KAAQoI,GAAO;AACxB,UAAM4H,IAAIhQ,EAAK;AAEf,IAAAwM,EAAM,KAAK,GAAGxM,EAAK,QAAQ,MAAM,IAAIgQ,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7D;AAEA,SAAOxD,EAAM,KAAK;AAAA,CAAI;AACxB;AC1HO,SAASyD,GAAa3O,GAAsB;AACjD,QAAMb,IAAUkB,EAAc;AAAA,IAC5B,GAAGL,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,EAAA,CACrC,GAEKoG,IAAYpG,EAAK,WAAW,0BAC5B4G,IAAU5G,EAAK,WAAW,kBAE1B8G,IAAQV,EAAU,IAAI,CAACwI,GAAoB5P,OAAe;AAAA,IAC9D,SAAS;AAAA,MACP,QAAQ4H,EAAQ5H,CAAC;AAAA,IAAA;AAAA,IAGnB,MAAMiL,EAAW9K,GAAS,IAAI,aAAayP,CAAQ,CAAC;AAAA,EAAA,EACpD;AAEF,SAAO;AAAA,IACL,SAAAzP;AAAA,IACA,OAAA2H;AAAA,EAAA;AAEJ;AAEO,SAAS+H,GAAWpQ,GAAsB;AAC/C,QAAM0C,IAAI1C,EAAU,QAAQ,MAAM,MAE5BqQ,IAAmBrQ,EAAU,MAAM,IAAI,CAACC,MAASA,EAAK,QAAQ,MAAM,GAEpE2J,IAAW,CAAC,GAAG,IAAI,IAAIyG,CAAgB,CAAC,EAAE,KAAA;AAEhD,SAAO;AAAA,IACL,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,CAAC3N,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MAAA;AAAA,MAGnB,kBAAA2N;AAAA,MAEA,0BAA0BrQ,EAAU,MAAM;AAAA,QAAI,CAACC,MAC7C,MAAM,KAAKoL,EAAUrL,EAAU,SAASC,CAAI,CAAC;AAAA,MAAA;AAAA,MAG/C,iBAAiB,CAAC,GAAG,GAAG,CAAC;AAAA,MAEzB,QAAQD,EAAU,MAAM;AAAA,MAExB,WAAW4J,EAAS;AAAA,MAEpB,UAAAA;AAAA,IAAA;AAAA,EACF;AAEJ;ACpCO,SAAS0G,GAAOtQ,GAAsB;AAC3C,SAAO;AAAA,IACL,SAASA,EAAU,QAAQ,MAAM;AAAA,IACjC,OAAOA,EAAU,MAAM,IAAI,CAACS,OAAO;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,MAAM,KAAKA,EAAE,IAAI;AAAA,IAAA,EACvB;AAAA,EAAA;AAEN;AAyBO,SAAS8P,GAAShP,GAAsB;AAC7C,SAAO;AAAA,IACL,SAASK,EAAcL,EAAK,OAAO;AAAA,IACnC,OAAOA,EAAK,MAAM,IAAI,CAACd,OAAY;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,IAAI,aAAaA,EAAE,IAAI;AAAA,IAAA,EAC7B;AAAA,EAAA;AAEN;AChEO,SAAS+P,EACdtE,GACAuE,GACAC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAU,CAACxO,MAAeuO,IAAUvO,CAAC,KAAKA,GAE1CyO,IAAWD,EAAQJ,CAAI,GACvBM,IAASF,EAAQH,CAAE;AAEzB,SAAII,MAAaC,IAAe7E,IAEZA,IAAQyE,EAAYG,CAAQ,IAC3BH,EAAYI,CAAM;AACzC;AAEO,SAASC,EACdC,GACAR,GACAC,GACAC,GACAC,GACU;AACV,SAAOK,EAAI,IAAI,CAACpR,MAAM2Q,EAAmB3Q,GAAG4Q,GAAMC,GAAIC,GAAaC,CAAO,CAAC;AAC7E;ACdA,MAAMM,IAAiD;AAAA,EACrD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AACN,GAEMC,IAA6C;AAAA,EACjD,GAAG;AAAA,EACH,IAAI;AACN,GAEaC,KAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQjF,GAAeuE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLtE;AAAA,MACAuE;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEF,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF,GCnDME,IAAiD;AAAA,EACrD,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AACd,GAEMC,IAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAChB,GAEaC,KAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQpF,GAAeuE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLtE;AAAA,MACAuE;AAAA,MACAC;AAAA,MACAW;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEL,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAW;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF,GCxCME,IAA+C;AAAA,EACnD,KAAK;AAAA,EACL,KAAK,KAAK,KAAK;AAAA,EACf,MAAM,KAAK,KAAK;AAClB,GAEMC,IAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GAEaC,KAAkB;AAAA,EAC7B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQvF,GAAeuE,GAA2BC,GAAyB;AACzE,WAAOF;AAAA,MACLtE;AAAA,MACAuE;AAAA,MACAC;AAAA,MACAc;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACER,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAc;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../lib/core/structure/operations/canonicalize.ts","../lib/core/structure/operations/hashStructure.ts","../lib/core/structure/operations/sites/appendSite.ts","../lib/core/structure/operations/sites/insertSite.ts","../lib/core/structure/operations/sites/removeSite.ts","../lib/core/structure/operations/sites/replaceSite.ts","../lib/core/matrix/matrix.ts","../lib/core/lattice/lattice.ts","../lib/core/matrix/operations/vector/dot.ts","../lib/core/matrix/operations/vector/norm.ts","../lib/core/lattice/angles.ts","../lib/core/matrix/operations/inverse/inverse3x3.ts","../lib/core/lattice/inverse.ts","../lib/core/lattice/lengths.ts","../lib/core/matrix/operations/transpose.ts","../lib/core/matrix/operations/mul.ts","../lib/core/lattice/metricTensor.ts","../lib/core/lattice/parameters.ts","../lib/core/lattice/reciprocalLattice.ts","../lib/core/lattice/reciprocalLatticeCrystallographic.ts","../lib/core/lattice/create/fromParameters.ts","../lib/core/lattice/create/cubic.ts","../lib/core/lattice/create/hexagonal.ts","../lib/core/lattice/create/monoclinic.ts","../lib/core/lattice/create/orthorhombic.ts","../lib/core/lattice/create/rhombohedral.ts","../lib/core/lattice/create/tetragonal.ts","../lib/core/structure/operations/symmetry/spglib.ts","../lib/core/matrix/operations/determinant.ts","../lib/core/structure/operations/symmetry/brilliounzone/generateBZVertices.ts","../lib/core/structure/operations/supercell.ts","../lib/core/structure/operations/distance/utils.ts","../lib/core/structure/operations/distance/getDisplacement.ts","../lib/core/structure/operations/distance/getDistance.ts","../lib/core/structure/operations/distance/getDistances.ts","../lib/core/structure/operations/distance/getDistancesMatrix.ts","../lib/core/structure/operations/query/findSites.ts","../lib/core/structure/operations/query/findSitesBySpecies.ts","../lib/core/lattice/volume.ts","../lib/core/structure/properties/volume.ts","../lib/core/structure/properties/formula.ts","../lib/core/data/periodictable/atomicData.ts","../lib/core/structure/properties/cellMass.ts","../lib/core/structure/properties/density.ts","../lib/core/site/site.ts","../lib/core/site/cartesian.ts","../lib/core/site/fractional.ts","../lib/core/site/distance.ts","../lib/core/site/wrap.ts","../lib/core/species/species.ts","../lib/core/volumetric/volumetric.ts","../lib/core/volumetric/create/fill.ts","../lib/core/volumetric/create/fromFunction.ts","../lib/core/volumetric/create/fromMatrixSlices.ts","../lib/core/volumetric/create/ones.ts","../lib/core/volumetric/create/zeros.ts","../lib/core/io/cif.ts","../lib/core/io/poscar.ts","../lib/core/io/structuredata.ts","../lib/core/io/xsf.ts","../lib/core/io/xyz.ts","../lib/core/io/optimade.ts","../lib/core/units/converter.ts","../lib/core/units/length.ts","../lib/core/io/gro.ts","../lib/core/io/pdb.ts","../lib/core/io/pw.ts","../lib/core/io/json.ts","../lib/core/units/energy.ts","../lib/core/units/angle.ts"],"sourcesContent":["import { Structure } from \"../../structure/structure\";\n\nconst EPS = 1e-12;\n\nfunction wrap(x: number): number {\n const v = x - Math.floor(x);\n return Math.abs(v) < EPS ? 0 : v;\n}\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function canonicalize(structure: Structure): Structure {\n return {\n ...structure,\n sites: structure.sites.map((site) => ({\n ...site,\n frac: new Float64Array([\n wrap(clean(site.frac[0])),\n wrap(clean(site.frac[1])),\n wrap(clean(site.frac[2])),\n ]),\n })),\n };\n}\n","import { Structure } from \"../structure\";\nimport { canonicalize } from \"./canonicalize\";\nimport { Vec3 } from \"@/main\";\n\nfunction toFixedArray(v: Vec3, precision = 8): string {\n return Array.from(v)\n .map((x) => x.toFixed(precision))\n .join(\",\");\n}\n\nfunction fnv1a(str: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash *= 16777619;\n }\n\n return hash >>> 0;\n}\n\nexport function hashStructure(structure: Structure): number {\n const s = canonicalize(structure);\n\n const lattice = s.lattice.basis.data;\n const latticeKey = toFixedArray(lattice);\n\n const sitesKey = s.sites\n .map((site) => {\n return site.species + \":\" + toFixedArray(site.frac);\n })\n .sort()\n .join(\"|\");\n\n const key = latticeKey + \"::\" + sitesKey;\n\n return fnv1a(key);\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function appendSite(structure: Structure, site: Site): Structure {\n const sites = structure.sites.slice();\n sites.push(site);\n\n return {\n ...structure,\n sites,\n };\n}\n\nexport function appendSites(\n structure: Structure,\n sitesToAppend: readonly Site[],\n): Structure {\n return {\n ...structure,\n sites: [...structure.sites, ...sitesToAppend],\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function insertSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n const oldSites = structure.sites;\n const sites = new Array(oldSites.length + 1);\n\n for (let i = 0; i < index; i++) {\n sites[i] = oldSites[i];\n }\n\n sites[index] = site;\n\n for (let i = index; i < oldSites.length; i++) {\n sites[i + 1] = oldSites[i];\n }\n\n return {\n ...structure,\n sites,\n };\n}\n\nexport function insertSites(\n structure: Structure,\n index: number,\n sitesToInsert: readonly Site[],\n): Structure {\n const oldSites = structure.sites;\n const n = sitesToInsert.length;\n\n const sites = new Array(oldSites.length + n);\n\n for (let i = 0; i < index; i++) {\n sites[i] = oldSites[i];\n }\n\n for (let i = 0; i < n; i++) {\n sites[index + i] = sitesToInsert[i];\n }\n\n for (let i = index; i < oldSites.length; i++) {\n sites[i + n] = oldSites[i];\n }\n\n return {\n ...structure,\n sites,\n };\n}\n","import { Structure } from \"../../structure\";\n\nexport function removeSite(structure: Structure, index: number): Structure {\n const sites = structure.sites.slice();\n sites.splice(index, 1);\n\n return {\n ...structure,\n sites,\n };\n}\n\nexport function removeSites(\n structure: Structure,\n indices: readonly number[],\n): Structure {\n const remove = new Set(indices);\n\n return {\n ...structure,\n sites: structure.sites.filter((_, i) => !remove.has(i)),\n };\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\nexport function replaceSite(\n structure: Structure,\n index: number,\n site: Site,\n): Structure {\n const sites = structure.sites.slice();\n sites[index] = site;\n\n return {\n ...structure,\n sites,\n };\n}\n\nexport function replaceSites(\n structure: Structure,\n replacements: readonly {\n index: number;\n site: Site;\n }[],\n): Structure {\n const sites = structure.sites.slice();\n\n for (const { index, site } of replacements) {\n sites[index] = site;\n }\n\n return {\n ...structure,\n sites,\n };\n}\n","export interface Matrix {\n readonly rows: number;\n readonly cols: number;\n readonly data: Float64Array;\n}\n\nexport function createMatrix(\n rows: number,\n cols: number,\n data?: Iterable<number>,\n): Matrix {\n const size = rows * cols;\n\n const buffer = data ? Float64Array.from(data) : new Float64Array(size);\n\n if (buffer.length !== size) {\n throw new Error(`Expected ${size} values, got ${buffer.length}`);\n }\n\n return {\n rows,\n cols,\n data: buffer,\n };\n}\n\nexport function identity(size: number): Matrix {\n const data = new Float64Array(size * size);\n\n for (let i = 0; i < size; i++) {\n data[i * size + i] = 1;\n }\n\n return {\n rows: size,\n cols: size,\n data,\n };\n}\n\nexport function clone(matrix: Matrix): Matrix {\n return {\n rows: matrix.rows,\n cols: matrix.cols,\n data: new Float64Array(matrix.data),\n };\n}\n\nexport function index(cols: number, row: number, col: number): number {\n return row * cols + col;\n}\n","import { createMatrix, Matrix } from \"../matrix/matrix\";\n\nconst EPS = 1e-12;\n\nfunction clean(x: number): number {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport interface Lattice {\n basis: Matrix;\n}\n\nexport function createLattice(\n data: number[] | Float64Array | Matrix | [number, number, number],\n): Lattice {\n const values =\n data instanceof Float64Array\n ? Array.from(data)\n : \"data\" in data\n ? Array.from(data.data)\n : data;\n\n let m: Float64Array;\n\n if (values.length === 3) {\n const [a, b, c] = values;\n\n m = new Float64Array([a, 0, 0, 0, b, 0, 0, 0, c]);\n } else if (values.length === 9) {\n m = new Float64Array(9);\n\n for (let i = 0; i < 9; i++) {\n m[i] = clean(values[i]);\n }\n } else {\n throw new Error(\"Lattice requires 3 or 9 values\");\n }\n\n return {\n basis: createMatrix(3, 3, m),\n };\n}\n","import { Vector } from \"../../vector\";\n\nexport function dot(a: Vector, b: Vector): number {\n if (a.length !== b.length) {\n throw new Error(\"Dot product requires same-length vectors\");\n }\n\n let sum = 0;\n\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n","import { Vector } from \"../../vector\";\n\nconst EPS = 1e-12;\n\nexport function norm(v: Vector): number {\n let sum = 0;\n\n for (let i = 0; i < v.length; i++) {\n const x = v[i];\n sum += x * x;\n }\n\n return Math.sqrt(sum);\n}\n","import { dot } from \"../matrix/operations/vector/dot\";\nimport { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\n\nimport { Vector } from \"../matrix/vector\";\n\nfunction angle(u: Vector, v: Vector) {\n const denom = norm(u) * norm(v);\n if (denom === 0) throw new Error(\"Zero-length lattice vector\");\n\n const c = dot(u, v) / denom;\n const clamped = Math.max(-1, Math.min(1, c));\n\n return Math.acos(clamped);\n}\n\nexport function angles(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Vector = new Float64Array([m[0], m[1], m[2]]);\n const b: Vector = new Float64Array([m[3], m[4], m[5]]);\n const c: Vector = new Float64Array([m[6], m[7], m[8]]);\n\n const alpha = angle(b, c);\n const beta = angle(a, c);\n const gamma = angle(a, b);\n\n return [alpha, beta, gamma];\n}\n","import { Matrix, createMatrix } from \"../../matrix\";\n\nexport function inverse3x3(m: Matrix): Matrix {\n if (m.rows !== 3 || m.cols !== 3) {\n throw new Error(\"Expected 3x3 matrix\");\n }\n\n const a00 = m.data[0],\n a01 = m.data[1],\n a02 = m.data[2];\n const a10 = m.data[3],\n a11 = m.data[4],\n a12 = m.data[5];\n const a20 = m.data[6],\n a21 = m.data[7],\n a22 = m.data[8];\n\n const c00 = a11 * a22 - a12 * a21;\n const c01 = a12 * a20 - a10 * a22;\n const c02 = a10 * a21 - a11 * a20;\n\n const c10 = a02 * a21 - a01 * a22;\n const c11 = a00 * a22 - a02 * a20;\n const c12 = a01 * a20 - a00 * a21;\n\n const c20 = a01 * a12 - a02 * a11;\n const c21 = a02 * a10 - a00 * a12;\n const c22 = a00 * a11 - a01 * a10;\n\n const det = a00 * c00 + a01 * c01 + a02 * c02;\n\n if (det === 0) {\n throw new Error(\"Singular matrix\");\n }\n\n const invDet = 1 / det;\n\n const out = createMatrix(3, 3);\n\n out.data[0] = c00 * invDet;\n out.data[1] = c10 * invDet;\n out.data[2] = c20 * invDet;\n\n out.data[3] = c01 * invDet;\n out.data[4] = c11 * invDet;\n out.data[5] = c21 * invDet;\n\n out.data[6] = c02 * invDet;\n out.data[7] = c12 * invDet;\n out.data[8] = c22 * invDet;\n\n return out;\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse3x3 } from \"../matrix/operations/inverse/inverse3x3\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function inverse(lattice: Lattice): Matrix {\n return inverse3x3(lattice.basis);\n}\n","import { norm } from \"../matrix/operations/vector/norm\";\nimport { Lattice } from \"./lattice\";\nexport function lengths(lattice: Lattice): [number, number, number] {\n const m = lattice.basis.data;\n\n const a: Float64Array = new Float64Array([m[0], m[1], m[2]]);\n const b: Float64Array = new Float64Array([m[3], m[4], m[5]]);\n const c: Float64Array = new Float64Array([m[6], m[7], m[8]]);\n\n return [norm(a), norm(b), norm(c)];\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function transpose(matrix: Matrix): Matrix {\n const out = createMatrix(matrix.cols, matrix.rows);\n\n for (let row = 0; row < matrix.rows; row++) {\n for (let col = 0; col < matrix.cols; col++) {\n out.data[index(out.cols, col, row)] =\n matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nexport function mul(a: Matrix, b: Matrix): Matrix {\n if (a.cols !== b.rows) {\n throw new Error(\"Invalid matrix multiplication dimensions\");\n }\n\n const out = createMatrix(a.rows, b.cols);\n\n const aRows = a.rows;\n const aCols = a.cols;\n const bCols = b.cols;\n\n for (let row = 0; row < aRows; row++) {\n for (let col = 0; col < bCols; col++) {\n let sum = 0;\n\n for (let k = 0; k < aCols; k++) {\n sum += a.data[index(a.cols, row, k)] * b.data[index(b.cols, k, col)];\n }\n\n out.data[index(out.cols, row, col)] = sum;\n }\n }\n\n return out;\n}\n","import { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Lattice } from \"./lattice\";\nimport { Matrix } from \"../matrix/matrix\";\n\nexport function metricTensor(lattice: Lattice): Matrix {\n const A = lattice.basis;\n\n const AT = transpose(A);\n return mul(AT, A);\n}\n","import { lengths } from \"./lengths\";\nimport { angles } from \"./angles\";\nimport { Lattice } from \"./lattice\";\n\nconst RAD2DEG = 180 / Math.PI;\n\nexport function parameters(\n lattice: Lattice,\n): [number, number, number, number, number, number] {\n const [a, b, c] = lengths(lattice);\n const [alpha, beta, gamma] = angles(lattice);\n\n return [a, b, c, alpha * RAD2DEG, beta * RAD2DEG, gamma * RAD2DEG];\n}\n","import { Lattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { createLattice } from \"./lattice\";\n\nconst TWO_PI = 2 * Math.PI;\n\nexport function reciprocalLattice(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const data = invT.data.map((v) => v * TWO_PI);\n\n return createLattice(data);\n}\n","import { Lattice, createLattice } from \"./lattice\";\nimport { inverse } from \"./inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nexport function reciprocalLatticeCrystallographic(lattice: Lattice): Lattice {\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n return createLattice(invT.data);\n}\n","import { createLattice } from \"../lattice\";\n\nconst DEG2RAD = Math.PI / 180;\nconst EPS = 1e-12;\n\nfunction clean(x: number) {\n return Math.abs(x) < EPS ? 0 : x;\n}\n\nexport function fromParameters(\n a: number,\n b: number,\n c: number,\n alpha: number,\n beta: number,\n gamma: number,\n) {\n const alphaR = alpha * DEG2RAD;\n const betaR = beta * DEG2RAD;\n const gammaR = gamma * DEG2RAD;\n\n const cosA = Math.cos(alphaR);\n const cosB = Math.cos(betaR);\n const cosG = Math.cos(gammaR);\n const sinG = Math.sin(gammaR);\n\n // lattice vectors\n const v1 = [a, 0, 0];\n\n const v2 = [b * cosG, b * sinG, 0];\n\n // guard against degenerate gamma\n if (Math.abs(sinG) < EPS) {\n throw new Error(\"Invalid lattice: gamma too close to 0 or 180 degrees\");\n }\n\n const cx = c * cosB;\n\n const cy = (c * (cosA - cosB * cosG)) / sinG;\n\n const czSquared = c * c - cx * cx - cy * cy;\n\n const cz = Math.sqrt(Math.max(0, czSquared));\n\n return createLattice([\n clean(v1[0]),\n clean(v1[1]),\n clean(v1[2]),\n clean(v2[0]),\n clean(v2[1]),\n clean(v2[2]),\n clean(cx),\n clean(cy),\n clean(cz),\n ]);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function cubic(a: number) {\n return fromParameters(a, a, a, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function hexagonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 120);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function monoclinic(a: number, b: number, c: number, beta: number) {\n return fromParameters(a, b, c, 90, beta, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function orthorhombic(a: number, b: number, c: number) {\n return fromParameters(a, b, c, 90, 90, 90);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function rhombohedral(a: number, alpha: number) {\n return fromParameters(a, a, a, alpha, alpha, alpha);\n}\n","import { fromParameters } from \"./fromParameters\";\n\nexport function tetragonal(a: number, c: number) {\n return fromParameters(a, a, c, 90, 90, 90);\n}\n","import init, { analyze_cell, type MoyoDataset } from \"@spglib/moyo-wasm\";\n\nimport { createLattice } from \"@/core/lattice\";\nimport { Structure } from \"../../structure\";\n\nlet ready: Promise<void> | null = null;\n\nexport function initMoyo() {\n if (!ready) {\n ready = (async () => {\n // In Node.js (tests), load from filesystem\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const { readFileSync } = await import(\"fs\");\n const { join } = await import(\"path\");\n const wasmPath = join(\n process.cwd(),\n \"node_modules/@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n );\n const wasmBuffer = readFileSync(wasmPath);\n await init(wasmBuffer);\n } catch (e) {\n console.error(\"Failed to load WASM in Node:\", e);\n throw e;\n }\n } else {\n // In browser, use dynamic import to get the URL\n const wasmUrl = new URL(\n \"@spglib/moyo-wasm/moyo_wasm_bg.wasm\",\n import.meta.url,\n ).toString();\n\n await init(wasmUrl);\n }\n })();\n }\n return ready;\n}\n\nexport async function getSymmetry(\n structure: Structure,\n tolerance = 1e-4,\n setting = \"Standard\",\n): Promise<{\n primitive: Structure;\n conventional: Structure;\n calculationResults: any;\n}> {\n await initMoyo();\n\n // -----------------------------\n // 1. Build reversible mapping\n // -----------------------------\n const symbolToId = new Map<string, number>();\n const idToSymbol = new Map<number, string>();\n\n let counter = 0;\n\n const positions: number[][] = [];\n const numbers: number[] = [];\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!symbolToId.has(symbol)) {\n symbolToId.set(symbol, counter);\n idToSymbol.set(counter, symbol);\n counter++;\n }\n\n positions.push(Array.from(site.frac));\n numbers.push(symbolToId.get(symbol)!);\n }\n\n // -----------------------------\n // 2. Build Moyo input\n // -----------------------------\n const moyoInput = {\n lattice: {\n basis: Array.from(structure.lattice.basis.data),\n },\n positions,\n numbers,\n };\n\n // -----------------------------\n // 3. Run symmetry engine\n // -----------------------------\n const results = await analyze_cell(\n JSON.stringify(moyoInput),\n tolerance,\n setting,\n );\n\n // -----------------------------\n // 4. Convert Moyo cell → Structure\n // -----------------------------\n function build(cell: {\n lattice: { basis: number[] };\n positions: number[][];\n numbers: number[];\n }): Structure {\n const { lattice, positions, numbers } = cell;\n\n const species = [...new Set(numbers)].map((n: number) => ({\n symbol: idToSymbol.get(n)!,\n }));\n\n const sites = positions.map((pos: number[], i: number) => ({\n species: {\n symbol: idToSymbol.get(numbers[i])!,\n },\n frac: new Float64Array(pos),\n }));\n\n return {\n lattice: createLattice(lattice.basis),\n species,\n sites,\n };\n }\n\n // -----------------------------\n // 5. Return both structures\n // -----------------------------\n return {\n primitive: build(results.prim_std_cell),\n conventional: build(results.std_cell),\n calculationResults: results,\n };\n}\n","import { Matrix, createMatrix, index } from \"../matrix\";\n\nfunction minor(matrix: Matrix, skipRow: number, skipCol: number): Matrix {\n const out = createMatrix(matrix.rows - 1, matrix.cols - 1);\n\n let ptr = 0;\n\n for (let row = 0; row < matrix.rows; row++) {\n if (row === skipRow) continue;\n\n for (let col = 0; col < matrix.cols; col++) {\n if (col === skipCol) continue;\n\n out.data[ptr++] = matrix.data[index(matrix.cols, row, col)];\n }\n }\n\n return out;\n}\n\nexport function determinant(matrix: Matrix): number {\n if (matrix.rows !== matrix.cols) {\n throw new Error(\"Determinant requires a square matrix\");\n }\n\n const n = matrix.rows;\n\n // fast path for BZ / geometry\n if (n === 3) {\n const m = matrix.data;\n\n return (\n m[0] * (m[4] * m[8] - m[5] * m[7]) -\n m[1] * (m[3] * m[8] - m[5] * m[6]) +\n m[2] * (m[3] * m[7] - m[4] * m[6])\n );\n }\n\n if (n === 1) {\n return matrix.data[0];\n }\n\n if (n === 2) {\n return matrix.data[0] * matrix.data[3] - matrix.data[1] * matrix.data[2];\n }\n\n let det = 0;\n\n for (let col = 0; col < n; col++) {\n const sign = col % 2 === 0 ? 1 : -1;\n\n det += sign * matrix.data[col] * determinant(minor(matrix, 0, col));\n }\n\n return det;\n}\n","import { reciprocalLatticeCrystallographic } from \"@/core/lattice/reciprocalLatticeCrystallographic\";\nimport { Structure } from \"@/core/structure/structure\";\nimport { dot, mul } from \"@/core/matrix/operations\";\n\nimport { determinant } from \"@/core/matrix/operations\";\nimport { createMatrix } from \"@/core/matrix/matrix\";\nimport { inverse3x3 } from \"@/core/matrix/operations/inverse/inverse3x3\";\nimport { Vector } from \"@/core/matrix/vector\";\n\ninterface Plane {\n normal: Float64Array;\n offset: number;\n}\n\nfunction intersectPlanes(\n p1: Plane,\n p2: Plane,\n p3: Plane,\n tolerance = 1e-10,\n): Float64Array | null {\n const A = createMatrix(3, 3, [...p1.normal, ...p2.normal, ...p3.normal]);\n\n const detA = determinant(A);\n\n if (Math.abs(detA) < tolerance) return null;\n\n const invA = inverse3x3(A);\n\n const d = createMatrix(3, 1, [p1.offset, p2.offset, p3.offset]);\n\n const res = mul(invA, d).data;\n\n return new Float64Array([res[0], res[1], res[2]]);\n}\n\nfunction key(v: Float64Array) {\n const nx = v[0],\n ny = v[1],\n nz = v[2];\n const inv = 1 / Math.sqrt(nx * nx + ny * ny + nz * nz);\n\n // normalize direction so ±G collapse\n const x = Math.round(nx * inv * 1e6);\n const y = Math.round(ny * inv * 1e6);\n const z = Math.round(nz * inv * 1e6);\n\n return `${x},${y},${z}`;\n}\n\nfunction vkey(v: Float64Array, eps = 1e-6) {\n return `${Math.round(v[0] / eps)},${Math.round(v[1] / eps)},${Math.round(v[2] / eps)}`;\n}\n\nfunction isInside(v: Float64Array, planes: Plane[]) {\n const tolerance = 0.0;\n for (const p of planes) {\n const d = p.normal[0] * v[0] + p.normal[1] * v[1] + p.normal[2] * v[2];\n\n if (d > p.offset + tolerance) return false;\n }\n return true;\n}\n\nexport async function generateBZVertices(\n structure: Structure,\n tolerance: number = 1e-4,\n): Promise<Float64Array[]> {\n const reciprocalLattice = reciprocalLatticeCrystallographic(\n structure.lattice,\n );\n\n const rcLD = reciprocalLattice.basis.data;\n\n const aStar = [rcLD[0], rcLD[1], rcLD[2]];\n const bStar = [rcLD[3], rcLD[4], rcLD[5]];\n const cStar = [rcLD[6], rcLD[7], rcLD[8]];\n\n const range = 2;\n const points: Vector[] = [];\n\n for (let h = -range; h <= range; h++) {\n for (let k = -range; k <= range; k++) {\n for (let l = -range; l <= range; l++) {\n const point = new Float64Array(3);\n\n point[0] = h * aStar[0] + k * bStar[0] + l * cStar[0];\n\n point[1] = h * aStar[1] + k * bStar[1] + l * cStar[1];\n\n point[2] = h * aStar[2] + k * bStar[2] + l * cStar[2];\n\n points.push(point);\n }\n }\n }\n\n // remove center point\n const neighbors = points.filter(\n (p) =>\n Math.abs(p[0]) > tolerance ||\n Math.abs(p[1]) > tolerance ||\n Math.abs(p[2]) > tolerance,\n );\n\n // sort by distance from origin\n neighbors.sort((a, b) => {\n const da = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];\n\n const db = b[0] * b[0] + b[1] * b[1] + b[2] * b[2];\n\n return da - db;\n });\n\n const map = new Map<string, Float64Array>();\n\n for (const p of neighbors) {\n const k = key(p);\n if (!map.has(k)) map.set(k, p);\n }\n\n const uniqueNeighbors = [...map.values()];\n\n // console.log(uniqueNeighbors); // all neighbor recip points\n\n const planes = uniqueNeighbors.slice(0, 26).map((G) => ({\n normal: G,\n offset: dot(G, G) / 2,\n }));\n\n const candidateBZCorners: Float64Array[] = [];\n\n for (let i = 0; i < planes.length; i++) {\n for (let j = i + 1; j < planes.length; j++) {\n for (let k = j + 1; k < planes.length; k++) {\n const v = intersectPlanes(planes[i], planes[j], planes[k], tolerance);\n\n if (!v) continue;\n\n if (isInside(v, planes)) {\n candidateBZCorners.push(v);\n }\n }\n }\n }\n\n const vertexMap = new Map<string, Float64Array>();\n\n for (const v of candidateBZCorners) {\n const k = vkey(v);\n if (!vertexMap.has(k)) {\n vertexMap.set(k, v);\n }\n }\n\n const hullVertices = [...vertexMap.values()];\n\n return hullVertices;\n}\n","import { createLattice } from \"@/core/lattice/lattice\";\nimport type { Structure } from \"../structure\";\nimport type { Site } from \"@/core/site/site\";\n\ntype SupercellSize = number | [number, number, number];\n\nexport function supercell(\n structure: Structure,\n size: SupercellSize,\n): Structure {\n const [nx, ny, nz] = typeof size === \"number\" ? [size, size, size] : size;\n\n if (\n nx < 1 ||\n ny < 1 ||\n nz < 1 ||\n !Number.isInteger(nx) ||\n !Number.isInteger(ny) ||\n !Number.isInteger(nz)\n ) {\n throw new Error(\"Supercell dimensions must be positive integers\");\n }\n\n const m = structure.lattice.basis.data;\n\n // row-major scaling\n const newBasis = [\n m[0] * nx,\n m[1] * nx,\n m[2] * nx,\n\n m[3] * ny,\n m[4] * ny,\n m[5] * ny,\n\n m[6] * nz,\n m[7] * nz,\n m[8] * nz,\n ];\n\n const sites: Site[] = [];\n\n for (const site of structure.sites) {\n const [x, y, z] = site.frac;\n\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < ny; j++) {\n for (let k = 0; k < nz; k++) {\n sites.push({\n species: site.species,\n\n frac: new Float64Array([(x + i) / nx, (y + j) / ny, (z + k) / nz]),\n });\n }\n }\n }\n }\n\n return {\n lattice: createLattice(newBasis),\n sites,\n };\n}\n","export type Vec3 = Float64Array;\n\n// TODO: these are sort of generic geomtery utils\n// perhaps they would be better served higher up.\n\nexport function minimumImage(df: Vec3): Float64Array {\n return new Float64Array([\n df[0] - Math.round(df[0]),\n df[1] - Math.round(df[1]),\n df[2] - Math.round(df[2]),\n ]);\n}\n// flat metric tensor dot product: d^2 = x^T G x\nexport function distanceSquared(mic: Vec3, G: Float64Array): number {\n const x = mic[0],\n y = mic[1],\n z = mic[2];\n\n return (\n x * (G[0] * x + G[1] * y + G[2] * z) +\n y * (G[3] * x + G[4] * y + G[5] * z) +\n z * (G[6] * x + G[7] * y + G[8] * z)\n );\n}\n","import { Structure } from \"../../structure\";\nimport { minimumImage } from \"./utils\";\nexport type Vec3 = Float64Array;\n\nexport function getDisplacement(\n structure: Structure,\n idx1: number,\n idx2: number,\n): Vec3 {\n const s1 = structure.sites[idx1];\n const s2 = structure.sites[idx2];\n\n return minimumImage([\n s2.frac[0] - s1.frac[0],\n s2.frac[1] - s1.frac[1],\n s2.frac[2] - s1.frac[2],\n ]);\n}\n","import { Structure } from \"../../structure\";\nimport { metricTensor } from \"../../../lattice/metricTensor\";\n\nimport { distanceSquared } from \"./utils\";\nimport { getDisplacement } from \"./getDisplacement\";\n\nexport function getDistance(\n structure: Structure,\n idx1: number,\n idx2: number,\n): number {\n const displacement = getDisplacement(structure, idx1, idx2);\n\n const G = metricTensor(structure.lattice).data;\n\n return Math.sqrt(distanceSquared(displacement, G));\n}\n","import { Structure } from \"../../structure\";\nimport { metricTensor } from \"../../../lattice/metricTensor\";\n\nimport { distanceSquared } from \"./utils\";\nimport { getDisplacement } from \"./getDisplacement\";\n\nexport function getDistances(structure: Structure, idx: number): Float64Array {\n const n = structure.sites.length;\n const out = new Float64Array(n);\n\n const G = metricTensor(structure.lattice).data;\n\n for (let j = 0; j < n; j++) {\n if (j === idx) {\n out[j] = 0;\n continue;\n }\n\n const disp = getDisplacement(structure, idx, j);\n\n out[j] = Math.sqrt(distanceSquared(disp, G));\n }\n\n return out;\n}\n","import { Structure } from \"../../structure\";\nimport { metricTensor } from \"../../../lattice/metricTensor\";\n\nimport { distanceSquared } from \"./utils\";\nimport { getDisplacement } from \"./getDisplacement\";\n\nexport function getDistancesMatrix(structure: Structure): Float64Array[] {\n const n = structure.sites.length;\n\n const matrix: Float64Array[] = Array.from(\n { length: n },\n () => new Float64Array(n),\n );\n\n const G = metricTensor(structure.lattice).data;\n\n for (let i = 0; i < n; i++) {\n matrix[i][i] = 0;\n\n for (let j = i + 1; j < n; j++) {\n const disp = getDisplacement(structure, i, j);\n\n const d = Math.sqrt(distanceSquared(disp, G));\n\n matrix[i][j] = d;\n matrix[j][i] = d;\n }\n }\n\n return matrix;\n}\n","import { Structure } from \"../../structure\";\nimport { Site } from \"../../../site/site\";\n\n// generic method for finding sites on a given condition.\n\nexport function findSites(\n structure: Structure,\n predicate: (site: Site, index: number) => boolean,\n): number[] {\n const indices: number[] = [];\n\n for (let i = 0; i < structure.sites.length; i++) {\n if (predicate(structure.sites[i], i)) {\n indices.push(i);\n }\n }\n\n return indices;\n}\n","import { Species } from \"@/main\";\nimport { Structure } from \"@/main\";\nimport { findSites } from \"./findSites\";\n\n// matches species.symbol only.\n\nexport function findSitesBySpecies(\n structure: Structure,\n species: Species,\n): number[] {\n return findSites(structure, (site) => site.species.symbol === species.symbol);\n}\n","import { determinant } from \"../matrix/operations/determinant\";\nimport { Lattice } from \"./lattice\";\n\nexport function volume(lattice: Lattice): number {\n return Math.abs(determinant(lattice.basis));\n}\n","import { Structure } from \"../structure\";\nimport { volume as latticeVolume } from \"../../lattice/volume\";\n\nexport function volume(structure: Structure): number {\n return latticeVolume(structure.lattice);\n}\n","import { Structure } from \"../structure\";\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) {\n [a, b] = [b, a % b];\n }\n\n return Math.abs(a);\n}\n\nexport function composition(structure: Structure): Record<string, number> {\n const out: Record<string, number> = {};\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n out[symbol] ??= 0;\n out[symbol]++;\n }\n\n return out;\n}\n\nfunction compositionGCD(comp: Record<string, number>): number {\n const values = Object.values(comp);\n\n return values.reduce((a, b) => gcd(a, b));\n}\n\nfunction hillOrder(elements: string[]): string[] {\n if (!elements.includes(\"C\")) {\n return [...elements].sort();\n }\n\n const rest = elements.filter((e) => e !== \"C\" && e !== \"H\").sort();\n\n return [\"C\", ...(elements.includes(\"H\") ? [\"H\"] : []), ...rest];\n}\n\nfunction formulaFromComposition(\n comp: Record<string, number>,\n ordering: (elements: string[]) => string[],\n): string {\n const elements = ordering(Object.keys(comp));\n\n return elements\n .map((el) => {\n const count = comp[el];\n\n return count === 1 ? el : `${el}${count}`;\n })\n .join(\"\");\n}\n\nfunction reducedComposition(\n comp: Record<string, number>,\n): Record<string, number> {\n const factor = compositionGCD(comp);\n\n const out: Record<string, number> = {};\n\n for (const [element, count] of Object.entries(comp)) {\n out[element] = count / factor;\n }\n\n return out;\n}\n\nexport function hillFormula(structure: Structure): string {\n return formulaFromComposition(composition(structure), hillOrder);\n}\n\nexport function reducedFormula(structure: Structure): string {\n return formulaFromComposition(\n reducedComposition(composition(structure)),\n hillOrder,\n );\n}\n","export interface ElementInfo {\n atomicNumber: number;\n symbol: string;\n name: string;\n mass: number;\n [key: string]: unknown;\n}\n\nexport const PeriodicTable: Record<number, ElementInfo> = {\n 1: { atomicNumber: 1, symbol: \"H\", name: \"Hydrogen\", mass: 1.008 },\n 2: { atomicNumber: 2, symbol: \"He\", name: \"Helium\", mass: 4.0026 },\n 3: { atomicNumber: 3, symbol: \"Li\", name: \"Lithium\", mass: 6.94 },\n 4: { atomicNumber: 4, symbol: \"Be\", name: \"Beryllium\", mass: 9.0122 },\n 5: { atomicNumber: 5, symbol: \"B\", name: \"Boron\", mass: 10.81 },\n 6: { atomicNumber: 6, symbol: \"C\", name: \"Carbon\", mass: 12.011 },\n 7: { atomicNumber: 7, symbol: \"N\", name: \"Nitrogen\", mass: 14.007 },\n 8: { atomicNumber: 8, symbol: \"O\", name: \"Oxygen\", mass: 15.999 },\n 9: { atomicNumber: 9, symbol: \"F\", name: \"Fluorine\", mass: 18.998 },\n 10: { atomicNumber: 10, symbol: \"Ne\", name: \"Neon\", mass: 20.18 },\n 11: { atomicNumber: 11, symbol: \"Na\", name: \"Sodium\", mass: 22.99 },\n 12: { atomicNumber: 12, symbol: \"Mg\", name: \"Magnesium\", mass: 24.305 },\n 13: { atomicNumber: 13, symbol: \"Al\", name: \"Aluminum\", mass: 26.982 },\n 14: { atomicNumber: 14, symbol: \"Si\", name: \"Silicon\", mass: 28.085 },\n 15: { atomicNumber: 15, symbol: \"P\", name: \"Phosphorus\", mass: 30.974 },\n 16: { atomicNumber: 16, symbol: \"S\", name: \"Sulfur\", mass: 32.06 },\n 17: { atomicNumber: 17, symbol: \"Cl\", name: \"Chlorine\", mass: 35.45 },\n 18: { atomicNumber: 18, symbol: \"Ar\", name: \"Argon\", mass: 39.948 },\n 19: { atomicNumber: 19, symbol: \"K\", name: \"Potassium\", mass: 39.098 },\n 20: { atomicNumber: 20, symbol: \"Ca\", name: \"Calcium\", mass: 40.078 },\n 21: { atomicNumber: 21, symbol: \"Sc\", name: \"Scandium\", mass: 44.956 },\n 22: { atomicNumber: 22, symbol: \"Ti\", name: \"Titanium\", mass: 47.867 },\n 23: { atomicNumber: 23, symbol: \"V\", name: \"Vanadium\", mass: 50.942 },\n 24: { atomicNumber: 24, symbol: \"Cr\", name: \"Chromium\", mass: 51.996 },\n 25: { atomicNumber: 25, symbol: \"Mn\", name: \"Manganese\", mass: 54.938 },\n 26: { atomicNumber: 26, symbol: \"Fe\", name: \"Iron\", mass: 55.845 },\n 27: { atomicNumber: 27, symbol: \"Co\", name: \"Cobalt\", mass: 58.933 },\n 28: { atomicNumber: 28, symbol: \"Ni\", name: \"Nickel\", mass: 58.693 },\n 29: { atomicNumber: 29, symbol: \"Cu\", name: \"Copper\", mass: 63.546 },\n 30: { atomicNumber: 30, symbol: \"Zn\", name: \"Zinc\", mass: 65.38 },\n 31: { atomicNumber: 31, symbol: \"Ga\", name: \"Gallium\", mass: 69.723 },\n 32: { atomicNumber: 32, symbol: \"Ge\", name: \"Germanium\", mass: 72.63 },\n 33: { atomicNumber: 33, symbol: \"As\", name: \"Arsenic\", mass: 74.922 },\n 34: { atomicNumber: 34, symbol: \"Se\", name: \"Selenium\", mass: 78.971 },\n 35: { atomicNumber: 35, symbol: \"Br\", name: \"Bromine\", mass: 79.904 },\n 36: { atomicNumber: 36, symbol: \"Kr\", name: \"Krypton\", mass: 83.798 },\n 37: { atomicNumber: 37, symbol: \"Rb\", name: \"Rubidium\", mass: 85.468 },\n 38: { atomicNumber: 38, symbol: \"Sr\", name: \"Strontium\", mass: 87.62 },\n 39: { atomicNumber: 39, symbol: \"Y\", name: \"Yttrium\", mass: 88.906 },\n 40: { atomicNumber: 40, symbol: \"Zr\", name: \"Zirconium\", mass: 91.224 },\n 41: { atomicNumber: 41, symbol: \"Nb\", name: \"Niobium\", mass: 92.906 },\n 42: { atomicNumber: 42, symbol: \"Mo\", name: \"Molybdenum\", mass: 95.95 },\n 43: { atomicNumber: 43, symbol: \"Tc\", name: \"Technetium\", mass: 98 },\n 44: { atomicNumber: 44, symbol: \"Ru\", name: \"Ruthenium\", mass: 101.07 },\n 45: { atomicNumber: 45, symbol: \"Rh\", name: \"Rhodium\", mass: 102.91 },\n 46: { atomicNumber: 46, symbol: \"Pd\", name: \"Palladium\", mass: 106.42 },\n 47: { atomicNumber: 47, symbol: \"Ag\", name: \"Silver\", mass: 107.868 },\n 48: { atomicNumber: 48, symbol: \"Cd\", name: \"Cadmium\", mass: 112.414 },\n 49: { atomicNumber: 49, symbol: \"In\", name: \"Indium\", mass: 114.818 },\n 50: { atomicNumber: 50, symbol: \"Sn\", name: \"Tin\", mass: 118.71 },\n 51: { atomicNumber: 51, symbol: \"Sb\", name: \"Antimony\", mass: 121.76 },\n 52: { atomicNumber: 52, symbol: \"Te\", name: \"Tellurium\", mass: 127.6 },\n 53: { atomicNumber: 53, symbol: \"I\", name: \"Iodine\", mass: 126.904 },\n 54: { atomicNumber: 54, symbol: \"Xe\", name: \"Xenon\", mass: 131.293 },\n 55: { atomicNumber: 55, symbol: \"Cs\", name: \"Cesium\", mass: 132.905 },\n 56: { atomicNumber: 56, symbol: \"Ba\", name: \"Barium\", mass: 137.33 },\n 57: { atomicNumber: 57, symbol: \"La\", name: \"Lanthanum\", mass: 138.905 },\n 58: { atomicNumber: 58, symbol: \"Ce\", name: \"Cerium\", mass: 140.12 },\n 59: { atomicNumber: 59, symbol: \"Pr\", name: \"Praseodymium\", mass: 140.91 },\n 60: { atomicNumber: 60, symbol: \"Nd\", name: \"Neodymium\", mass: 144.24 },\n 61: { atomicNumber: 61, symbol: \"Pm\", name: \"Promethium\", mass: 145 },\n 62: { atomicNumber: 62, symbol: \"Sm\", name: \"Samarium\", mass: 150.36 },\n 63: { atomicNumber: 63, symbol: \"Eu\", name: \"Europium\", mass: 151.964 },\n 64: { atomicNumber: 64, symbol: \"Gd\", name: \"Gadolinium\", mass: 157.25 },\n 65: { atomicNumber: 65, symbol: \"Tb\", name: \"Terbium\", mass: 158.93 },\n 66: { atomicNumber: 66, symbol: \"Dy\", name: \"Dysprosium\", mass: 162.5 },\n 67: { atomicNumber: 67, symbol: \"Ho\", name: \"Holmium\", mass: 164.93 },\n 68: { atomicNumber: 68, symbol: \"Er\", name: \"Erbium\", mass: 167.26 },\n 69: { atomicNumber: 69, symbol: \"Tm\", name: \"Thulium\", mass: 168.93 },\n 70: { atomicNumber: 70, symbol: \"Yb\", name: \"Ytterbium\", mass: 173.05 },\n 71: { atomicNumber: 71, symbol: \"Lu\", name: \"Lutetium\", mass: 174.97 },\n 72: { atomicNumber: 72, symbol: \"Hf\", name: \"Hafnium\", mass: 178.49 },\n 73: { atomicNumber: 73, symbol: \"Ta\", name: \"Tantalum\", mass: 180.95 },\n 74: { atomicNumber: 74, symbol: \"W\", name: \"Tungsten\", mass: 183.84 },\n 75: { atomicNumber: 75, symbol: \"Re\", name: \"Rhenium\", mass: 186.207 },\n 76: { atomicNumber: 76, symbol: \"Os\", name: \"Osmium\", mass: 190.23 },\n 77: { atomicNumber: 77, symbol: \"Ir\", name: \"Iridium\", mass: 192.217 },\n 78: { atomicNumber: 78, symbol: \"Pt\", name: \"Platinum\", mass: 195.084 },\n 79: { atomicNumber: 79, symbol: \"Au\", name: \"Gold\", mass: 196.967 },\n 80: { atomicNumber: 80, symbol: \"Hg\", name: \"Mercury\", mass: 200.592 },\n 81: { atomicNumber: 81, symbol: \"Tl\", name: \"Thallium\", mass: 204.38 },\n 82: { atomicNumber: 82, symbol: \"Pb\", name: \"Lead\", mass: 207.2 },\n 83: { atomicNumber: 83, symbol: \"Bi\", name: \"Bismuth\", mass: 208.98 },\n 84: { atomicNumber: 84, symbol: \"Po\", name: \"Polonium\", mass: 209 },\n 85: { atomicNumber: 85, symbol: \"At\", name: \"Astatine\", mass: 210 },\n 86: { atomicNumber: 86, symbol: \"Rn\", name: \"Radon\", mass: 222 },\n 87: { atomicNumber: 87, symbol: \"Fr\", name: \"Francium\", mass: 223 },\n 88: { atomicNumber: 88, symbol: \"Ra\", name: \"Radium\", mass: 226 },\n 89: { atomicNumber: 89, symbol: \"Ac\", name: \"Actinium\", mass: 227 },\n 90: { atomicNumber: 90, symbol: \"Th\", name: \"Thorium\", mass: 232.04 },\n 91: { atomicNumber: 91, symbol: \"Pa\", name: \"Protactinium\", mass: 231.04 },\n 92: { atomicNumber: 92, symbol: \"U\", name: \"Uranium\", mass: 238.03 },\n 93: { atomicNumber: 93, symbol: \"Np\", name: \"Neptunium\", mass: 237 },\n 94: { atomicNumber: 94, symbol: \"Pu\", name: \"Plutonium\", mass: 244 },\n 95: { atomicNumber: 95, symbol: \"Am\", name: \"Americium\", mass: 243 },\n 96: { atomicNumber: 96, symbol: \"Cm\", name: \"Curium\", mass: 247 },\n 97: { atomicNumber: 97, symbol: \"Bk\", name: \"Berkelium\", mass: 247 },\n 98: { atomicNumber: 98, symbol: \"Cf\", name: \"Californium\", mass: 251 },\n 99: { atomicNumber: 99, symbol: \"Es\", name: \"Einsteinium\", mass: 252 },\n 100: { atomicNumber: 100, symbol: \"Fm\", name: \"Fermium\", mass: 257 },\n 101: { atomicNumber: 101, symbol: \"Md\", name: \"Mendelevium\", mass: 258 },\n 102: { atomicNumber: 102, symbol: \"No\", name: \"Nobelium\", mass: 259 },\n 103: { atomicNumber: 103, symbol: \"Lr\", name: \"Lawrencium\", mass: 262 },\n 104: { atomicNumber: 104, symbol: \"Rf\", name: \"Rutherfordium\", mass: 267 },\n 105: { atomicNumber: 105, symbol: \"Db\", name: \"Dubnium\", mass: 270 },\n 106: { atomicNumber: 106, symbol: \"Sg\", name: \"Seaborgium\", mass: 269 },\n 107: { atomicNumber: 107, symbol: \"Bh\", name: \"Bohrium\", mass: 270 },\n 108: { atomicNumber: 108, symbol: \"Hs\", name: \"Hassium\", mass: 277 },\n 109: { atomicNumber: 109, symbol: \"Mt\", name: \"Meitnerium\", mass: 278 },\n 110: { atomicNumber: 110, symbol: \"Ds\", name: \"Darmstadtium\", mass: 281 },\n 111: { atomicNumber: 111, symbol: \"Rg\", name: \"Roentgenium\", mass: 282 },\n 112: { atomicNumber: 112, symbol: \"Cn\", name: \"Copernicium\", mass: 285 },\n 113: { atomicNumber: 113, symbol: \"Nh\", name: \"Nihonium\", mass: 286 },\n 114: { atomicNumber: 114, symbol: \"Fl\", name: \"Flerovium\", mass: 289 },\n 115: { atomicNumber: 115, symbol: \"Mc\", name: \"Moscovium\", mass: 289 },\n 116: { atomicNumber: 116, symbol: \"Lv\", name: \"Livermorium\", mass: 293 },\n 117: { atomicNumber: 117, symbol: \"Ts\", name: \"Tennessine\", mass: 294 },\n 118: { atomicNumber: 118, symbol: \"Og\", name: \"Oganesson\", mass: 294 },\n};\n\nexport const elementBySymbol = Object.values(PeriodicTable).reduce(\n (acc, el) => {\n acc[el.symbol] = el;\n return acc;\n },\n {} as Record<string, ElementInfo>,\n);\n\nexport function getElement(symbol: string): ElementInfo | undefined {\n return elementBySymbol[symbol];\n}\n\n/**\n * Symbol → atomic number lookup (fast + safe)\n */\nexport const SymbolToAtomicNumber = new Map<string, number>(\n Object.values(PeriodicTable).map((el) => [el.symbol, el.atomicNumber]),\n);\n\nexport const AtomicNumberToSymbol = new Map<number, string>(\n Object.values(PeriodicTable).map((el) => [el.atomicNumber, el.symbol]),\n);\n","import { Structure } from \"../structure\";\nimport { Site } from \"../../site/site\";\nimport { getElement } from \"@/core/data/periodictable/atomicData\";\n\nfunction siteMass(site: Site): number {\n const siteMass = site.properties?.mass;\n\n if (typeof siteMass === \"number\") {\n return siteMass;\n }\n\n const speciesMass = site.species.properties?.mass;\n\n if (typeof speciesMass === \"number\") {\n return speciesMass;\n }\n\n const element = getElement(site.species.symbol);\n\n if (!element) {\n throw new Error(`Unknown element: ${site.species.symbol}`);\n }\n\n return element.mass;\n}\n\nexport function cellMass(structure: Structure): number {\n let mass = 0;\n\n for (const site of structure.sites) {\n mass += siteMass(site);\n }\n\n return mass;\n}\n","import { Structure } from \"../structure\";\nimport { volume } from \"./volume\";\nimport { cellMass } from \"./cellMass\";\n\n// in units amu / Ang^3'd\nexport function density(structure: Structure): number {\n return cellMass(structure) / volume(structure);\n}\n","import { Species } from \"../species/species\";\n\nexport type SiteProperties = Record<string, any>;\n\nexport type Vec3 = [number, number, number] | Float64Array | number[];\n\nexport type Site<P extends SiteProperties = SiteProperties> = {\n species: Species;\n frac: Vec3;\n properties?: P;\n};\n\nexport function createSite<P extends SiteProperties>(\n species: Species,\n frac: Vec3,\n properties?: P,\n): Site<P> {\n return {\n species,\n frac,\n properties,\n };\n}\n","import { mul } from \"../matrix/operations/mul\";\nimport { transpose } from \"../matrix/operations/transpose\";\n\nimport { Site } from \"./site\";\nimport { Lattice } from \"../lattice/lattice\";\nimport { Vector } from \"../matrix/vector\";\n\nexport function cartesian(lattice: Lattice, site: Site): Vector {\n const [x, y, z] = site.frac;\n\n const frac = {\n rows: 3,\n cols: 1,\n data: new Float64Array([x, y, z]),\n };\n\n const basisT = transpose(lattice.basis);\n const result = mul(basisT, frac);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { inverse } from \"../lattice/inverse\";\nimport { transpose } from \"../matrix/operations/transpose\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { Vector } from \"../matrix/vector\";\nimport { Lattice } from \"../lattice/lattice\";\n\nexport function fractional(lattice: Lattice, cart: Vector): Vector {\n const vec = {\n rows: 3,\n cols: 1,\n data: cart,\n };\n\n const inv = inverse(lattice);\n const invT = transpose(inv);\n\n const result = mul(invT, vec);\n\n return new Float64Array([result.data[0], result.data[1], result.data[2]]);\n}\n","import { Lattice } from \"../lattice/lattice\";\nimport { Site } from \"./site\";\nimport { cartesian } from \"./cartesian\";\n\nimport { norm } from \"../matrix/operations/vector/norm\";\n\nexport function distance(lattice: Lattice, a: Site, b: Site): number {\n const dFrac: [number, number, number] = [\n b.frac[0] - a.frac[0],\n b.frac[1] - a.frac[1],\n b.frac[2] - a.frac[2],\n ];\n\n for (let i = 0; i < 3; i++) {\n dFrac[i] -= Math.round(dFrac[i]);\n }\n\n const displaced: Site = {\n species: a.species,\n frac: dFrac,\n };\n\n const dCart = cartesian(lattice, displaced);\n\n return norm(dCart);\n}\n","import { Site, SiteProperties } from \"./site\";\n\nfunction wrapValue(x: number): number {\n return ((x % 1) + 1) % 1;\n}\n\nexport function wrap<T extends SiteProperties>(site: Site<T>): Site<T> {\n return {\n ...site,\n frac: [\n wrapValue(site.frac[0]),\n wrapValue(site.frac[1]),\n wrapValue(site.frac[2]),\n ],\n };\n}\n","export type Species<P extends Record<string, any> = Record<string, any>> = {\n symbol: string;\n properties?: P;\n};\n\nexport function createSpecies<P extends Record<string, any>>(\n symbol: string,\n properties?: P,\n): Species<P> {\n return { symbol, properties };\n}\n","import { Matrix } from \"../matrix\";\nimport { identity } from \"../matrix\";\n\nexport interface VolumetricData {\n readonly data: Float64Array;\n readonly shape: [number, number, number];\n readonly channels: number;\n readonly basis?: Matrix;\n readonly origin: [number, number, number];\n readonly field?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\ntype ReduceAxis = \"all\" | \"channels\";\n\nexport interface ReduceOptions {\n axis?: ReduceAxis;\n}\n\nexport function createVolumetricData(params: {\n shape: [number, number, number];\n channels?: number;\n\n /**\n * Flat voxel-major buffer.\n *\n * Layout:\n * [v000c0, v000c1, ..., v001c0, v001c1, ...]\n */\n data?: Float64Array | Iterable<number>;\n\n basis?: Matrix;\n origin?: [number, number, number];\n\n field?: string;\n metadata?: Record<string, unknown>;\n}): VolumetricData {\n const {\n shape,\n channels = 1,\n data,\n basis,\n origin = [0, 0, 0],\n field,\n metadata,\n } = params;\n\n const [D, H, W] = shape;\n const size = D * H * W * channels;\n\n const buffer =\n data instanceof Float64Array\n ? data\n : data\n ? Float64Array.from(data)\n : new Float64Array(size);\n\n if (buffer.length !== size) {\n throw new Error(\n `VolumetricData mismatch: expected ${size}, got ${buffer.length}`,\n );\n }\n\n return {\n data: buffer,\n shape,\n channels,\n basis: basis ?? identity(3),\n origin,\n field,\n metadata,\n };\n}\n\nexport function index(\n vol: VolumetricData,\n x: number,\n y: number,\n z: number,\n c: number,\n) {\n const [D, H, W] = vol.shape;\n const { channels } = vol;\n\n return ((z * H + y) * W + x) * channels + c;\n}\n","import { createVolumetricData } from \"../volumetric\";\n\nexport function fill(\n shape: [number, number, number],\n value: number,\n channels = 1,\n) {\n const size = shape[0] * shape[1] * shape[2] * channels;\n\n return createVolumetricData({\n shape,\n channels,\n data: new Float64Array(size).fill(value),\n });\n}\n","import { createVolumetricData } from \"../volumetric\";\n\nexport function fromFunction(\n shape: [number, number, number],\n fn: (x: number, y: number, z: number, c: number) => number,\n channels = 1,\n) {\n const [D, H, W] = shape;\n const data = new Float64Array(D * H * W * channels);\n\n let i = 0;\n\n for (let z = 0; z < D; z++) {\n for (let y = 0; y < H; y++) {\n for (let x = 0; x < W; x++) {\n for (let c = 0; c < channels; c++) {\n data[i++] = fn(x, y, z, c);\n }\n }\n }\n }\n\n return createVolumetricData({\n shape,\n channels,\n data,\n });\n}\n","import { Matrix } from \"../../matrix\";\nimport { createVolumetricData } from \"../volumetric\";\n\nexport function fromMatrixSlices(slices: Matrix[]) {\n if (slices.length === 0) {\n throw new Error(\"No slices provided\");\n }\n\n const H = slices[0].rows;\n const W = slices[0].cols;\n const D = slices.length;\n\n const data = new Float64Array(D * H * W);\n\n let i = 0;\n\n for (let z = 0; z < D; z++) {\n const m = slices[z];\n\n if (m.rows !== H || m.cols !== W) {\n throw new Error(\"Inconsistent matrix slice dimensions\");\n }\n\n data.set(m.data, i);\n i += m.data.length;\n }\n\n return createVolumetricData({\n shape: [D, H, W],\n data,\n });\n}\n","import { fill } from \"./fill\";\n\n// special case of fill that sets all to one\nexport function ones(shape: [number, number, number], channels = 1) {\n return fill(shape, 1, channels);\n}\n","import { createVolumetricData } from \"../volumetric\";\n\n// data creation is by default filled with 0s so we can just early return\nexport function zeros(shape: [number, number, number], channels = 1) {\n const size = shape[0] * shape[1] * shape[2] * channels;\n\n return createVolumetricData({\n shape,\n channels,\n data: new Float64Array(size),\n });\n}\n","import { fromParameters } from \"../lattice/create/fromParameters\";\nimport { parameters } from \"../lattice/parameters\";\nimport { Structure } from \"../structure/structure\";\n\nfunction cleanValue(value: string): number {\n // remove uncertainty notation:\n // 5.432(1) -> 5.432\n return Number(value.replace(/\\(.+\\)/, \"\"));\n}\n\nfunction tokenize(line: string): string[] {\n return line.match(/'[^']*'|\"[^\"]*\"|\\S+/g) ?? [];\n}\n\nfunction warnUnsupportedSymmetry(spaceGroup: string) {\n console.warn(\n `Space group \"${spaceGroup}\" detected. ` +\n `Symmetry operations are not currently applied; ` +\n `only asymmetric-unit sites will be parsed.`,\n );\n}\n\nexport function fromCIF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n let a = 0;\n let b = 0;\n let c = 0;\n\n let alpha = 0;\n let beta = 0;\n let gamma = 0;\n\n let spaceGroup = \"P1\";\n\n let atomHeaders: string[] = [];\n const atomRows: string[][] = [];\n\n let inLoop = false;\n let currentHeaders: string[] = [];\n let collectingAtoms = false;\n\n for (const line of lines) {\n if (line.startsWith(\"_symmetry_space_group_name_H-M\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_space_group_name_H-M_alt\")) {\n const tokens = tokenize(line);\n spaceGroup = tokens.at(-1)?.replace(/['\"]/g, \"\") ?? \"P1\";\n } else if (line.startsWith(\"_cell_length_a\")) {\n a = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_b\")) {\n b = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_length_c\")) {\n c = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_alpha\")) {\n alpha = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_beta\")) {\n beta = cleanValue(tokenize(line)[1]);\n } else if (line.startsWith(\"_cell_angle_gamma\")) {\n gamma = cleanValue(tokenize(line)[1]);\n } else if (line === \"loop_\") {\n inLoop = true;\n currentHeaders = [];\n collectingAtoms = false;\n continue;\n }\n\n if (inLoop && line.startsWith(\"_\")) {\n currentHeaders.push(line);\n\n if (line.includes(\"_atom_site_\")) {\n collectingAtoms = true;\n }\n\n continue;\n }\n\n if (inLoop && collectingAtoms) {\n if (atomHeaders.length === 0) {\n atomHeaders = [...currentHeaders];\n }\n\n atomRows.push(tokenize(line));\n }\n }\n\n const isP1 = /^P\\s*1$/i.test(spaceGroup);\n\n if (!isP1) {\n warnUnsupportedSymmetry(spaceGroup);\n }\n\n const lattice = fromParameters(a, b, c, alpha, beta, gamma);\n\n const ix = atomHeaders.findIndex((x) => x.includes(\"fract_x\"));\n\n const iy = atomHeaders.findIndex((x) => x.includes(\"fract_y\"));\n\n const iz = atomHeaders.findIndex((x) => x.includes(\"fract_z\"));\n\n const ispecies = atomHeaders.findIndex((x) => x.includes(\"type_symbol\"));\n\n if (ix < 0 || iy < 0 || iz < 0 || ispecies < 0) {\n throw new Error(\"Missing required atom site columns\");\n }\n\n const sites = atomRows.map((row) => ({\n species: {\n symbol: row[ispecies],\n },\n\n frac: new Float64Array([\n cleanValue(row[ix]),\n cleanValue(row[iy]),\n cleanValue(row[iz]),\n ]),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toCIF(structure: Structure, precision = 6): string {\n const p = parameters(structure.lattice);\n\n const lines: string[] = [];\n\n lines.push(\"data_matsci-parse\");\n lines.push(\"\");\n\n lines.push(\"_symmetry_space_group_name_H-M 'P 1'\");\n lines.push(\"_symmetry_Int_Tables_number 1\");\n\n lines.push(\"\");\n\n lines.push(`_cell_length_a ${p[0].toFixed(precision)}`);\n\n lines.push(`_cell_length_b ${p[1].toFixed(precision)}`);\n\n lines.push(`_cell_length_c ${p[2].toFixed(precision)}`);\n\n lines.push(`_cell_angle_alpha ${p[3].toFixed(precision)}`);\n\n lines.push(`_cell_angle_beta ${p[4].toFixed(precision)}`);\n\n lines.push(`_cell_angle_gamma ${p[5].toFixed(precision)}`);\n\n lines.push(\"\");\n\n lines.push(\"loop_\");\n lines.push(\"_atom_site_label\");\n lines.push(\"_atom_site_type_symbol\");\n lines.push(\"_atom_site_fract_x\");\n lines.push(\"_atom_site_fract_y\");\n lines.push(\"_atom_site_fract_z\");\n\n for (let i = 0; i < structure.sites.length; i++) {\n const site = structure.sites[i];\n\n lines.push(\n `${site.species.symbol}${i + 1} ` +\n `${site.species.symbol} ` +\n `${site.frac[0].toFixed(precision)} ` +\n `${site.frac[1].toFixed(precision)} ` +\n `${site.frac[2].toFixed(precision)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { inverse } from \"../lattice/inverse\";\nimport { mul } from \"../matrix/operations/mul\";\nimport { createMatrix } from \"../matrix/matrix\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\nimport { fractional } from \"../site/fractional\";\n\nimport { cartesian } from \"../site\";\n\nfunction isSelective(line: string): boolean {\n return line.toLowerCase().startsWith(\"selective\");\n}\n\nfunction isCartesian(line: string): boolean {\n const l = line.trim().toLowerCase();\n return l.startsWith(\"c\") || l.startsWith(\"k\");\n}\n\n// TODO: Currently nukes the selective dynamics flag from the input file.\n// It would be good to restore this.\n// TODO: would be good to ensure that the title is also optionally\n// maintained.\n\nexport function fromPOSCAR(text: string): Structure {\n const lines = text.split(\"\\n\").map((x) => x.trim());\n\n let cursor = 0;\n\n // comment/title\n cursor++;\n\n // scale factor\n const scale = Number(lines[cursor++]);\n\n // lattice vectors (row-major)\n const latticeData: number[] = [];\n\n for (let i = 0; i < 3; i++) {\n const v = lines[cursor++].split(/\\s+/).map(Number);\n\n if (v.length !== 3) {\n throw new Error(\"Invalid POSCAR lattice\");\n }\n\n latticeData.push(v[0] * scale, v[1] * scale, v[2] * scale);\n }\n\n const lattice = createLattice(latticeData);\n\n // VASP5 species names\n const symbols = lines[cursor++].split(/\\s+/);\n\n // atom counts\n const counts = lines[cursor++].split(/\\s+/).map(Number);\n\n if (symbols.length !== counts.length) {\n throw new Error(\"Species/count mismatch\");\n }\n\n // optional selective dynamics\n if (isSelective(lines[cursor])) {\n cursor++;\n }\n\n // direct is true unless cartesian is.\n let direct = true;\n direct = !isCartesian(lines[cursor]);\n\n cursor++;\n\n const sites: Site[] = [];\n\n let speciesIndex = 0;\n let remaining = counts[0];\n\n const latticeInv = !direct ? inverse(lattice) : null;\n\n const totalAtoms = counts.reduce((a, b) => a + b, 0);\n\n for (let i = 0; i < totalAtoms; i++) {\n const tokens = lines[cursor++].split(/\\s+/);\n\n const coords = tokens.slice(0, 3).map(Number);\n\n const frac = direct\n ? new Float64Array(coords)\n : fractional(lattice, new Float64Array(coords));\n\n sites.push({\n species: {\n symbol: symbols[speciesIndex],\n },\n frac,\n });\n\n remaining--;\n\n if (remaining === 0 && speciesIndex < counts.length - 1) {\n speciesIndex++;\n remaining = counts[speciesIndex];\n }\n }\n\n return {\n lattice,\n sites,\n _cursorEnd: cursor,\n };\n}\n\nexport function toPOSCAR(\n structure: Structure,\n options?: {\n title?: string;\n scale?: number;\n direct?: boolean;\n },\n): string {\n const title = options?.title ?? \"Generated by matsci-parse\";\n const scale = options?.scale ?? 1.0;\n const direct = options?.direct ?? true;\n\n const lines: string[] = [];\n\n lines.push(title);\n lines.push(String(scale));\n\n // lattice\n const m = structure.lattice.basis.data;\n\n lines.push(`${m[0]} ${m[1]} ${m[2]}`);\n lines.push(`${m[3]} ${m[4]} ${m[5]}`);\n lines.push(`${m[6]} ${m[7]} ${m[8]}`);\n\n // preserve order of first appearance\n const grouped = new Map<string, typeof structure.sites>();\n\n for (const site of structure.sites) {\n const symbol = site.species.symbol;\n\n if (!grouped.has(symbol)) {\n grouped.set(symbol, []);\n }\n\n grouped.get(symbol)!.push(site);\n }\n\n const species = [...grouped.keys()];\n const sites = [...grouped.values()].flat();\n\n lines.push(species.join(\" \"));\n lines.push(species.map((s) => grouped.get(s)!.length).join(\" \"));\n\n lines.push(direct ? \"Direct\" : \"Cartesian\");\n\n for (const site of sites) {\n const coords = direct ? site.frac : cartesian(structure.lattice, site);\n\n lines.push(`${coords[0]} ${coords[1]} ${coords[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\nimport { cartesian } from \"../site/cartesian\";\nimport { fractional } from \"../site/fractional\";\n\nexport interface AiiDASite {\n position: [number, number, number];\n kind_name: string[];\n}\n\nexport interface StructureData {\n cell: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ];\n kinds: [];\n sites: AiiDASite[];\n}\n\nexport function fromStructureData(data: StructureData): Structure {\n const lattice = createLattice([\n ...data.cell[0],\n ...data.cell[1],\n ...data.cell[2],\n ]);\n\n const kindMap = new Map(data.kinds.map((kind: any) => [kind.name, kind]));\n\n const sites = data.sites.map((site: any) => {\n const kind = kindMap.get(site.kind_name);\n\n if (!kind) {\n throw new Error(`Unknown kind \"${site.kind_name}\"`);\n }\n\n return {\n species: {\n symbol: kind.symbols[0],\n },\n\n frac: fractional(lattice, new Float64Array(site.position)),\n };\n });\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toStructureData(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const symbols = [...new Set(structure.sites.map((s) => s.species.symbol))];\n\n const kinds = symbols.map((symbol) => ({\n name: symbol,\n symbols: [symbol],\n }));\n\n return {\n cell: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n kinds,\n\n sites: structure.sites.map((site) => ({\n kind_name: site.species.symbol,\n\n position: Array.from(cartesian(structure.lattice, site)),\n })),\n\n pbc1: true,\n pbc2: true,\n pbc3: true,\n };\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { fractional } from \"../site/fractional\";\nimport { cartesian } from \"../site/cartesian\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\nfunction findSection(lines: string[], section: string): number {\n const idx = lines.findIndex((line) => line.trim().toUpperCase() === section);\n\n if (idx === -1) {\n throw new Error(`Missing ${section}`);\n }\n\n return idx;\n}\n\n// TODO: support atomic numbers instead of symbols in primvec.\n\nexport function fromXSF(text: string): Structure {\n const lines = text\n .split(\"\\n\")\n .map((x) => x.trim())\n .filter(Boolean);\n\n const vecStart = findSection(lines, \"PRIMVEC\");\n\n const lattice = createLattice([\n ...lines[vecStart + 1].split(/\\s+/).map(Number),\n ...lines[vecStart + 2].split(/\\s+/).map(Number),\n ...lines[vecStart + 3].split(/\\s+/).map(Number),\n ]);\n\n const coordStart = findSection(lines, \"PRIMCOORD\");\n\n const [nAtoms] = lines[coordStart + 1].split(/\\s+/).map(Number);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < nAtoms; i++) {\n const tokens = lines[coordStart + 2 + i].split(/\\s+/);\n\n const symbol = tokens[0];\n\n const x = Number(tokens[1]);\n const y = Number(tokens[2]);\n const z = Number(tokens[3]);\n\n const frac = fractional(lattice, new Float64Array([x, y, z]));\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nfunction formatVec(v: number[]): string {\n return `${v[0]} ${v[1]} ${v[2]}`;\n}\n\nfunction formatLattice(lattice: Structure[\"lattice\"]): string[] {\n const m = lattice.basis.data;\n\n return [\n formatVec([m[0], m[1], m[2]]),\n formatVec([m[3], m[4], m[5]]),\n formatVec([m[6], m[7], m[8]]),\n ];\n}\n\nexport function toXSF(structure: Structure): string {\n const lines: string[] = [];\n\n lines.push(\"CRYSTAL\");\n lines.push(\"PRIMVEC\");\n\n const latticeLines = formatLattice(structure.lattice);\n lines.push(...latticeLines);\n lines.push(\"PRIMCOORD\");\n lines.push(`${structure.sites.length} 1`);\n\n for (const site of structure.sites) {\n const c = cartesian(structure.lattice, site);\n lines.push(`${site.species.symbol} ${c[0]} ${c[1]} ${c[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice, Lattice } from \"../lattice/lattice\";\nimport { cartesian, fractional } from \"../site\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\ntype ExtendedXYZInfo = Record<string, string>;\n\nfunction parseHeader(comment: string): ExtendedXYZInfo {\n const info: ExtendedXYZInfo = {};\n const kvRegex = /(\\w+)=(\".*?\"|\\S+)/g;\n\n for (const match of comment.matchAll(kvRegex)) {\n let value = match[2];\n if (value.startsWith('\"')) value = value.slice(1, -1);\n info[match[1]] = value;\n }\n\n return info;\n}\n\nfunction parseLattice(info: ExtendedXYZInfo) {\n if (!info.Lattice) {\n throw new Error(\"Extended XYZ must contain Lattice\");\n }\n\n const v = info.Lattice.split(/\\s+/).map(Number);\n if (v.length !== 9) throw new Error(\"Invalid Lattice\");\n\n return createLattice([v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]]);\n}\n\nexport function fromXYZ(text: string) {\n const lines = text.trim().split(\"\\n\");\n\n const n = Number(lines[0]);\n const comment = lines[1];\n\n const info = parseHeader(comment);\n const lattice = parseLattice(info);\n\n const sites: Site[] = [];\n\n for (let i = 0; i < n; i++) {\n const [symbol, x, y, z] = lines[2 + i].split(/\\s+/);\n\n const cart = new Float64Array([+x, +y, +z]);\n\n const frac = fractional(lattice, cart);\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return { lattice, sites };\n}\n\nfunction formatLattice(lattice: Lattice): string {\n const m = lattice.basis.data;\n\n // row-major flattening assumption (consistent with your matrix code)\n return `${m[0]} ${m[1]} ${m[2]} ${m[3]} ${m[4]} ${m[5]} ${m[6]} ${m[7]} ${m[8]}`;\n}\n\nexport function toXYZ(structure: Structure): string {\n const lines: string[] = [];\n\n const sites = structure.sites;\n lines.push(String(sites.length));\n\n const latticeStr = formatLattice(structure.lattice);\n\n lines.push(`Lattice=\"${latticeStr}\" Properties=species:S:1:pos:R:3`);\n\n for (const site of sites) {\n const cart = cartesian(structure.lattice, site);\n\n lines.push(`${site.species.symbol} ${cart[0]} ${cart[1]} ${cart[2]}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice\";\n\nimport { fractional, cartesian } from \"../site\";\nimport { Structure } from \"../structure\";\n\nexport function fromOptimade(data: any): Structure {\n const lattice = createLattice([\n ...data.attributes.lattice_vectors[0],\n ...data.attributes.lattice_vectors[1],\n ...data.attributes.lattice_vectors[2],\n ]);\n\n const positions = data.attributes.cartesian_site_positions;\n const species = data.attributes.species_at_sites;\n\n const sites = positions.map((position: number[], i: number) => ({\n species: {\n symbol: species[i],\n },\n\n frac: fractional(lattice, new Float64Array(position)),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toOptimade(structure: Structure) {\n const m = structure.lattice.basis.data;\n\n const species_at_sites = structure.sites.map((site) => site.species.symbol);\n\n const elements = [...new Set(species_at_sites)].sort();\n\n return {\n attributes: {\n lattice_vectors: [\n [m[0], m[1], m[2]],\n [m[3], m[4], m[5]],\n [m[6], m[7], m[8]],\n ],\n\n species_at_sites,\n\n cartesian_site_positions: structure.sites.map((site) =>\n Array.from(cartesian(structure.lattice, site)),\n ),\n\n dimension_types: [1, 1, 1],\n\n nsites: structure.sites.length,\n\n nelements: elements.length,\n\n elements,\n },\n };\n}\n","export function convertMeasurement<T extends string>(\n value: number,\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number {\n const resolve = (u: string) => (aliases?.[u] ?? u) as T;\n\n const fromUnit = resolve(from);\n const toUnit = resolve(to);\n\n if (fromUnit === toUnit) return value;\n\n const valueInBase = value * conversions[fromUnit];\n return valueInBase / conversions[toUnit];\n}\n\nexport function convertMeasurementArray<T extends string>(\n arr: number[],\n from: T,\n to: T,\n conversions: Record<T, number>,\n aliases?: Record<string, T>,\n): number[] {\n return arr.map((v) => convertMeasurement(v, from, to, conversions, aliases));\n}\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type LengthUnits =\n | \"angstrom\"\n | \"bohr\"\n | \"nm\"\n | \"pm\"\n | \"cm\"\n | \"m\"\n | \"um\"\n | \"fm\";\n\nconst LengthConversions: Record<LengthUnits, number> = {\n angstrom: 1,\n bohr: 0.529177,\n nm: 10,\n pm: 0.01,\n um: 1e4,\n cm: 1e8,\n m: 1e10,\n fm: 1e-5,\n};\n\nconst LengthAliases: Record<string, LengthUnits> = {\n Å: \"angstrom\",\n μm: \"um\",\n};\n\nexport const LengthUnitSystem = {\n conversions: LengthConversions,\n aliases: LengthAliases,\n\n convert(value: number, from: LengthUnits | string, to: LengthUnits | string) {\n return convertMeasurement(\n value,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: LengthUnits | string,\n to: LengthUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as LengthUnits,\n to as LengthUnits,\n LengthConversions,\n LengthAliases,\n );\n },\n};\n","// derived from https://manual.gromacs.org/current/reference-manual/file-formats.html#gro\n\n// NOTE: GROMACS stores all lengths (coordinates and box vectors) in nm.\n// Internally matsci-parse uses Å.\n\n// Its common convention for GROMACs to use Hw or Ow for water, we dont try to fix this at-all\n// therefore cross format parsing (to a software that needs elemental indication) will probably fail.\n\nimport { createLattice } from \"../lattice\";\nimport { cartesian } from \"../site\";\nimport { fractional } from \"../site/fractional\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\nimport { LengthUnitSystem } from \"../units/length\";\n\nfunction pad5(str: string) {\n return str.length > 5 ? str.slice(0, 5) : str.padStart(5);\n}\n\nfunction formatCoord(x: number) {\n return x.toFixed(3).padStart(8);\n}\n\nexport function fromGRO(text: string): Structure {\n const lines = text.split(/\\r?\\n/).filter((l) => l.length > 0);\n\n let cursor = 0;\n\n const title = lines[cursor++];\n\n const timeMatch = title.match(/t=\\s*([-+]?[0-9]*\\.?[0-9]+)/i);\n const time = timeMatch ? Number(timeMatch[1]) : undefined;\n\n const nAtoms = Number(lines[cursor++]);\n\n if (!Number.isFinite(nAtoms)) {\n throw new Error(\"Invalid GRO atom count\");\n }\n\n type Atom = {\n symbol: string;\n cart: Float64Array;\n };\n\n const atoms: Atom[] = [];\n\n for (let i = 0; i < nAtoms; i++) {\n const line = lines[cursor++];\n\n const x = Number(line.slice(20, 28));\n const y = Number(line.slice(28, 36));\n const z = Number(line.slice(36, 44));\n\n let atomName = line.slice(10, 15).trim();\n\n let symbol = atomName.replace(/[0-9]/g, \"\");\n symbol = symbol.charAt(0).toUpperCase() + symbol.slice(1).toLowerCase();\n\n atoms.push({\n symbol,\n cart: new Float64Array(\n LengthUnitSystem.convertArray([x, y, z], \"nm\", \"angstrom\"),\n ),\n });\n }\n\n let lattice = null;\n\n const boxLine = lines[cursor];\n\n if (boxLine) {\n const vals = boxLine.trim().split(/\\s+/).map(Number);\n\n const matrix = LengthUnitSystem.convertArray(\n [\n vals[0] ?? 0,\n vals[3] ?? 0,\n vals[4] ?? 0,\n vals[5] ?? 0,\n vals[1] ?? 0,\n vals[6] ?? 0,\n vals[7] ?? 0,\n vals[8] ?? 0,\n vals[2] ?? 0,\n ],\n \"nm\",\n \"angstrom\",\n );\n\n const hasOffDiagonal =\n matrix[1] !== 0 ||\n matrix[2] !== 0 ||\n matrix[3] !== 0 ||\n matrix[5] !== 0 ||\n matrix[6] !== 0 ||\n matrix[7] !== 0;\n\n lattice = hasOffDiagonal\n ? createLattice(matrix)\n : createLattice([matrix[0], matrix[4], matrix[8]]);\n }\n\n const sites: Site[] = atoms.map((atom) => ({\n species: { symbol: atom.symbol },\n frac: lattice\n ? fractional(lattice, atom.cart)\n : new Float64Array([NaN, NaN, NaN]),\n }));\n\n return {\n lattice,\n sites,\n time,\n };\n}\n\nexport function toGRO(\n structure: Structure,\n options?: {\n title?: string;\n time?: number;\n },\n): string {\n const title =\n options?.title ??\n (options?.time !== undefined\n ? `Generated structure, t=${options.time}`\n : \"Generated by matsci-parse\");\n\n const lines: string[] = [];\n\n lines.push(title);\n lines.push(String(structure.sites.length));\n\n for (let i = 0; i < structure.sites.length; i++) {\n const site = structure.sites[i];\n\n const cart = cartesian(structure.lattice, site);\n\n const [x, y, z] = LengthUnitSystem.convertArray(\n Array.from(cart),\n \"angstrom\",\n \"nm\",\n );\n\n lines.push(\n pad5(\"1\") +\n pad5(\"RES\") +\n pad5(site.species.symbol) +\n pad5(String(i + 1)) +\n formatCoord(x) +\n formatCoord(y) +\n formatCoord(z),\n );\n }\n\n const m = structure.lattice.basis.data;\n\n const [a, b, c] = LengthUnitSystem.convertArray(\n [m[0], m[4], m[8]],\n \"angstrom\",\n \"nm\",\n );\n\n lines.push([a, b, c].map((v) => v.toFixed(5)).join(\" \"));\n\n return lines.join(\"\\n\");\n}\n","import { fromParameters } from \"../lattice\";\nimport { createLattice } from \"../lattice\";\nimport { cartesian } from \"../site\";\nimport { fractional } from \"../site/fractional\";\nimport { Site } from \"../site/site\";\nimport { Structure } from \"../structure/structure\";\n\nconst DEFAULT_PADDING = 10.0;\n\nfunction parseCRYST1(line: string) {\n const a = Number(line.slice(6, 15));\n const b = Number(line.slice(15, 24));\n const c = Number(line.slice(24, 33));\n\n const alpha = Number(line.slice(33, 40));\n const beta = Number(line.slice(40, 47));\n const gamma = Number(line.slice(47, 54));\n\n return { a, b, c, alpha, beta, gamma };\n}\n\nfunction isCRYST1Sane(\n a: number,\n b: number,\n c: number,\n extentX: number,\n extentY: number,\n extentZ: number,\n): boolean {\n // reject degenerate or identity cells\n if (a <= 1e-3 || b <= 1e-3 || c <= 1e-3) return false;\n\n // reject clearly too small cells\n const margin = 1.2; // allow small packing inefficiency\n\n if (a < extentX * margin) return false;\n if (b < extentY * margin) return false;\n if (c < extentZ * margin) return false;\n\n // also reject ridiculous huge identity placeholders\n if (a === 1 && b === 1 && c === 1) return false;\n\n return true;\n}\n\nexport function fromPDB(text: string): Structure {\n const lines = text.split(/\\r?\\n/);\n\n let crystal: {\n a: number;\n b: number;\n c: number;\n alpha: number;\n beta: number;\n gamma: number;\n } | null = null;\n\n type ParsedAtom = {\n symbol: string;\n x: number;\n y: number;\n z: number;\n };\n\n const atoms: ParsedAtom[] = [];\n\n let xmin = Infinity;\n let ymin = Infinity;\n let zmin = Infinity;\n\n let xmax = -Infinity;\n let ymax = -Infinity;\n let zmax = -Infinity;\n\n for (const line of lines) {\n if (line.startsWith(\"CRYST1\")) {\n crystal = parseCRYST1(line);\n continue;\n }\n\n if (!line.startsWith(\"ATOM \") && !line.startsWith(\"HETATM\")) {\n continue;\n }\n\n const x = Number(line.slice(30, 38));\n const y = Number(line.slice(38, 46));\n const z = Number(line.slice(46, 54));\n\n let symbol = line.slice(76, 78).trim();\n\n if (!symbol) {\n symbol = line.slice(12, 16).replace(/[0-9]/g, \"\").trim();\n symbol = symbol.charAt(0).toUpperCase() + symbol.slice(1).toLowerCase();\n }\n\n atoms.push({ symbol, x, y, z });\n\n xmin = Math.min(xmin, x);\n ymin = Math.min(ymin, y);\n zmin = Math.min(zmin, z);\n\n xmax = Math.max(xmax, x);\n ymax = Math.max(ymax, y);\n zmax = Math.max(zmax, z);\n }\n\n if (atoms.length === 0) {\n throw new Error(\"No ATOM/HETATM records found.\");\n }\n\n const extentX = xmax - xmin;\n const extentY = ymax - ymin;\n const extentZ = zmax - zmin;\n\n let lattice = createLattice([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\n let originX = xmin - DEFAULT_PADDING;\n let originY = ymin - DEFAULT_PADDING;\n let originZ = zmin - DEFAULT_PADDING;\n\n const useCrystal =\n crystal !== null &&\n isCRYST1Sane(crystal.a, crystal.b, crystal.c, extentX, extentY, extentZ);\n\n if (useCrystal) {\n lattice = fromParameters(\n crystal.a,\n crystal.b,\n crystal.c,\n crystal.alpha,\n crystal.beta,\n crystal.gamma,\n );\n\n originX = 0;\n originY = 0;\n originZ = 0;\n } else {\n const a = Math.max(extentX + 2 * DEFAULT_PADDING, 1.0);\n const b = Math.max(extentY + 2 * DEFAULT_PADDING, 1.0);\n const c = Math.max(extentZ + 2 * DEFAULT_PADDING, 1.0);\n\n lattice = createLattice([a, 0, 0, 0, b, 0, 0, 0, c]);\n }\n\n const sites: Site[] = atoms.map(({ symbol, x, y, z }) => ({\n species: { symbol },\n frac: fractional(\n lattice,\n new Float64Array([x - originX, y - originY, z - originZ]),\n ),\n }));\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toPDB(\n structure: Structure,\n options?: {\n title?: string;\n },\n): string {\n const title = options?.title ?? \"Generated by matsci-parse\";\n\n const lines: string[] = [];\n\n lines.push(`HEADER ${title}`);\n\n let index = 1;\n\n for (const site of structure.sites) {\n const c = cartesian(structure.lattice, site);\n\n const symbol = site.species.symbol;\n\n lines.push(\n [\n \"ATOM \",\n index.toString().padStart(5),\n \" \",\n symbol.padEnd(4),\n \" MOL \",\n \"A\",\n \" 1 \",\n c[0].toFixed(3).padStart(8),\n c[1].toFixed(3).padStart(8),\n c[2].toFixed(3).padStart(8),\n \" 1.00\",\n \" 0.00\",\n \" \",\n symbol.padStart(2),\n ].join(\"\"),\n );\n\n index++;\n }\n\n lines.push(\"END\");\n\n return lines.join(\"\\n\");\n}\n","import { createLattice } from \"../lattice/lattice\";\nimport { fractional } from \"../site\";\nimport { cartesian } from \"../site/cartesian\";\nimport type { Site } from \"../site/site\";\nimport type { Structure } from \"../structure/structure\";\n\ntype CoordinateMode = \"crystal\" | \"angstrom\";\n\n// NOTE / TODO:\n// PW is a very complex file format, it would be good if i can do some intense reading.\n// It might take a while to get a nice representation of these things...\n\nexport function fromPW(text: string): Structure {\n const lines = text.split(\"\\n\").map((x) => x.trim());\n\n let latticeRows: number[][] = [];\n const atomLines: string[] = [];\n\n // ---------- lattice ----------\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (/^CELL_PARAMETERS/i.test(line)) {\n for (let j = 1; j <= 3; j++) {\n latticeRows.push(lines[i + j].split(/\\s+/).map(Number));\n }\n\n break;\n }\n }\n\n if (latticeRows.length !== 3) {\n throw new Error(\"CELL_PARAMETERS block not found\");\n }\n\n const lattice = createLattice([\n ...latticeRows[0],\n ...latticeRows[1],\n ...latticeRows[2],\n ]);\n\n // ---------- atomic positions ----------\n let atomUnits = \"angstrom\";\n let inAtomicBlock = false;\n\n for (const line of lines) {\n if (/^ATOMIC_POSITIONS/i.test(line)) {\n inAtomicBlock = true;\n\n const match = line.match(\n /^ATOMIC_POSITIONS\\s*(?:\\{|\\()?(\\w+)(?:\\}|\\))?/i,\n );\n\n atomUnits = match?.[1]?.toLowerCase() ?? \"angstrom\";\n\n continue;\n }\n\n if (!inAtomicBlock) continue;\n\n const parts = line.split(/\\s+/);\n\n if (\n parts.length < 4 ||\n !/^[A-Za-z]/.test(parts[0]) ||\n parts.slice(1, 4).some((x) => Number.isNaN(+x))\n ) {\n break;\n }\n\n atomLines.push(line);\n }\n\n if (atomLines.length === 0) {\n throw new Error(\"ATOMIC_POSITIONS block not found\");\n }\n\n const isCrystal = atomUnits === \"crystal\";\n\n const sites: Site[] = [];\n\n for (const line of atomLines) {\n const [symbol, x, y, z] = line.split(/\\s+/);\n\n let frac: Float64Array;\n\n if (isCrystal) {\n frac = new Float64Array([+x, +y, +z]);\n } else {\n // convert cartesian → fractional\n\n frac = fractional(lattice, new Float64Array([+x, +y, +z]));\n }\n\n sites.push({\n species: { symbol },\n frac,\n });\n }\n\n return {\n lattice,\n sites,\n };\n}\n\nexport function toPW(structure: Structure): string {\n const lines: string[] = [];\n\n lines.push(\"&SYSTEM\");\n lines.push(\"/\");\n\n lines.push(\"\");\n\n lines.push(`CELL_PARAMETERS angstrom`);\n\n const m = structure.lattice.basis.data;\n\n lines.push(`${m[0]} ${m[1]} ${m[2]}`);\n lines.push(`${m[3]} ${m[4]} ${m[5]}`);\n lines.push(`${m[6]} ${m[7]} ${m[8]}`);\n\n lines.push(\"\");\n\n lines.push(`ATOMIC_POSITIONS crystal`);\n\n for (const site of structure.sites) {\n const coords = site.frac;\n\n lines.push(\n `${site.species.symbol} ` + `${coords[0]} ${coords[1]} ${coords[2]}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import { Structure } from \"../structure/structure\";\nimport { createLattice } from \"../lattice/lattice\";\n\n/**\n * Serializes a structure to JSON format.\n *\n * Converts a Structure to a plain JavaScript object suitable for JSON stringification.\n *\n * @param structure - The structure to serialize\n * @returns An object with `lattice` (flattened array) and `sites` (with species and fractional coordinates)\n *\n * @remarks\n * - Lattice is serialized as a flat array [a1x, a1y, a1z, ...]\n * - Fractional coordinates are converted from Float64Array to regular arrays\n * - Use with JSON.stringify() for string serialization\n *\n * @example\n * ```typescript\n * const structure = { lattice: cubic(4), sites: [...] };\n * const json = toJSON(structure);\n * const jsonString = JSON.stringify(json);\n * ```\n */\nexport function toJSON(structure: Structure) {\n return {\n lattice: structure.lattice.basis.data,\n sites: structure.sites.map((s) => ({\n species: s.species,\n frac: Array.from(s.frac),\n })),\n };\n}\n\n/**\n * Deserializes a structure from JSON format.\n *\n * Reconstructs a Structure from a JSON object (typically parsed from JSON string).\n *\n * @param data - An object with `lattice` (9-element array) and `sites` array\n * @returns A new Structure object\n *\n * @remarks\n * - Lattice array must have exactly 9 elements\n * - Fractional coordinates are converted to Float64Array\n * - Inverse operation of toJSON()\n * - No validation is performed on the input data\n *\n * @example\n * ```typescript\n * const jsonData = {\n * lattice: [4, 0, 0, 0, 4, 0, 0, 0, 4],\n * sites: [{ species: 'Al', frac: [0, 0, 0] }]\n * };\n * const structure = fromJSON(jsonData);\n * ```\n */\nexport function fromJSON(data: any): Structure {\n return {\n lattice: createLattice(data.lattice),\n sites: data.sites.map((s: any) => ({\n species: s.species,\n frac: new Float64Array(s.frac),\n })),\n };\n}\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type EnergyUnits = \"eV\" | \"Hartree\" | \"kJ/mol\" | \"kcal/mol\";\n\nconst EnergyConversions: Record<EnergyUnits, number> = {\n eV: 1,\n Hartree: 27.2114,\n \"kJ/mol\": 0.0103643,\n \"kcal/mol\": 0.0433641,\n};\n\nconst EnergyAliases: Record<string, EnergyUnits> = {\n Ha: \"Hartree\",\n ev: \"eV\",\n electronvolt: \"eV\",\n};\n\nexport const EnergyUnitSystem = {\n conversions: EnergyConversions,\n aliases: EnergyAliases,\n\n convert(value: number, from: EnergyUnits | string, to: EnergyUnits | string) {\n return convertMeasurement(\n value,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: EnergyUnits | string,\n to: EnergyUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as EnergyUnits,\n to as EnergyUnits,\n EnergyConversions,\n EnergyAliases,\n );\n },\n};\n","import { convertMeasurement, convertMeasurementArray } from \"./converter\";\n\nexport type AngleUnits = \"rad\" | \"deg\" | \"grad\";\n\nconst AngleConversions: Record<AngleUnits, number> = {\n rad: 1,\n deg: Math.PI / 180,\n grad: Math.PI / 200,\n};\n\nconst AngleAliases: Record<string, AngleUnits> = {\n \"°\": \"deg\",\n deg: \"deg\",\n rad: \"rad\",\n gon: \"grad\",\n};\n\nexport const AngleUnitSystem = {\n conversions: AngleConversions,\n aliases: AngleAliases,\n\n convert(value: number, from: AngleUnits | string, to: AngleUnits | string) {\n return convertMeasurement(\n value,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n\n convertArray(\n arr: number[],\n from: AngleUnits | string,\n to: AngleUnits | string,\n ) {\n return convertMeasurementArray(\n arr,\n from as AngleUnits,\n to as AngleUnits,\n AngleConversions,\n AngleAliases,\n );\n },\n};\n"],"names":["EPS","wrap","x","v","clean","canonicalize","structure","site","toFixedArray","precision","fnv1a","str","hash","i","hashStructure","s","lattice","latticeKey","sitesKey","key","appendSite","sites","appendSites","sitesToAppend","insertSite","index","oldSites","insertSites","sitesToInsert","n","removeSite","removeSites","indices","remove","_","replaceSite","replaceSites","replacements","createMatrix","rows","cols","data","size","buffer","identity","row","col","createLattice","values","m","a","b","c","dot","sum","norm","angle","u","denom","clamped","angles","alpha","beta","gamma","inverse3x3","a00","a01","a02","a10","a11","a12","a20","a21","a22","c00","c01","c02","c10","c11","c12","c20","c21","c22","det","invDet","out","inverse","lengths","transpose","matrix","mul","aRows","aCols","bCols","k","metricTensor","A","AT","RAD2DEG","parameters","TWO_PI","reciprocalLattice","inv","reciprocalLatticeCrystallographic","invT","DEG2RAD","fromParameters","alphaR","betaR","gammaR","cosA","cosB","cosG","sinG","v1","v2","cx","cy","czSquared","cz","cubic","hexagonal","monoclinic","orthorhombic","rhombohedral","tetragonal","ready","initMoyo","readFileSync","join","wasmPath","wasmBuffer","init","e","wasmUrl","getSymmetry","tolerance","setting","symbolToId","idToSymbol","counter","positions","numbers","symbol","moyoInput","results","analyze_cell","build","cell","species","pos","minor","skipRow","skipCol","ptr","determinant","sign","intersectPlanes","p1","p2","p3","detA","invA","d","res","nx","ny","nz","y","z","vkey","eps","isInside","planes","p","generateBZVertices","rcLD","aStar","bStar","cStar","range","points","h","l","point","neighbors","da","db","map","G","candidateBZCorners","j","vertexMap","supercell","newBasis","minimumImage","df","distanceSquared","mic","getDisplacement","idx1","idx2","s1","s2","getDistance","displacement","getDistances","idx","disp","getDistancesMatrix","findSites","predicate","findSitesBySpecies","volume","latticeVolume","gcd","composition","compositionGCD","comp","hillOrder","elements","rest","formulaFromComposition","ordering","el","count","reducedComposition","factor","element","hillFormula","reducedFormula","PeriodicTable","elementBySymbol","acc","getElement","SymbolToAtomicNumber","AtomicNumberToSymbol","siteMass","speciesMass","cellMass","mass","density","createSite","frac","properties","cartesian","basisT","result","fractional","cart","vec","distance","dFrac","displaced","dCart","wrapValue","createSpecies","createVolumetricData","params","shape","channels","basis","origin","field","metadata","D","H","W","vol","fill","value","fromFunction","fn","fromMatrixSlices","slices","ones","zeros","cleanValue","tokenize","line","warnUnsupportedSymmetry","spaceGroup","fromCIF","text","lines","atomHeaders","atomRows","inLoop","currentHeaders","collectingAtoms","ix","iy","iz","ispecies","toCIF","isSelective","isCartesian","fromPOSCAR","cursor","scale","latticeData","symbols","counts","direct","speciesIndex","remaining","totalAtoms","coords","toPOSCAR","options","title","grouped","fromStructureData","kindMap","kind","toStructureData","kinds","findSection","section","fromXSF","vecStart","coordStart","nAtoms","tokens","formatVec","formatLattice","toXSF","latticeLines","parseHeader","comment","info","kvRegex","match","parseLattice","fromXYZ","toXYZ","latticeStr","fromOptimade","position","toOptimade","species_at_sites","convertMeasurement","from","to","conversions","aliases","resolve","fromUnit","toUnit","convertMeasurementArray","arr","LengthConversions","LengthAliases","LengthUnitSystem","pad5","formatCoord","fromGRO","timeMatch","time","atoms","boxLine","vals","hasOffDiagonal","atom","toGRO","DEFAULT_PADDING","parseCRYST1","isCRYST1Sane","extentX","extentY","extentZ","margin","fromPDB","crystal","xmin","ymin","zmin","xmax","ymax","zmax","originX","originY","originZ","toPDB","fromPW","latticeRows","atomLines","atomUnits","inAtomicBlock","parts","isCrystal","toPW","toJSON","fromJSON","EnergyConversions","EnergyAliases","EnergyUnitSystem","AngleConversions","AngleAliases","AngleUnitSystem"],"mappings":";AAEA,MAAMA,KAAM;AAEZ,SAASC,EAAKC,GAAmB;AAC/B,QAAMC,IAAID,IAAI,KAAK,MAAMA,CAAC;AAC1B,SAAO,KAAK,IAAIC,CAAC,IAAIH,KAAM,IAAIG;AACjC;AAEA,SAASC,EAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASG,GAAaC,GAAiC;AAC5D,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,OAAOA,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,GAAGA;AAAA,MACH,MAAM,IAAI,aAAa;AAAA,QACrBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,QACxBN,EAAKG,EAAMG,EAAK,KAAK,CAAC,CAAC,CAAC;AAAA,MAAA,CACzB;AAAA,IAAA,EACD;AAAA,EAAA;AAEN;ACrBA,SAASC,GAAaL,GAASM,IAAY,GAAW;AACpD,SAAO,MAAM,KAAKN,CAAC,EAChB,IAAI,CAACD,MAAMA,EAAE,QAAQO,CAAS,CAAC,EAC/B,KAAK,GAAG;AACb;AAEA,SAASC,GAAMC,GAAqB;AAClC,MAAIC,IAAO;AAEX,WAASC,IAAI,GAAGA,IAAIF,EAAI,QAAQE;AAC9B,IAAAD,KAAQD,EAAI,WAAWE,CAAC,GACxBD,KAAQ;AAGV,SAAOA,MAAS;AAClB;AAEO,SAASE,GAAcR,GAA8B;AAC1D,QAAMS,IAAIV,GAAaC,CAAS,GAE1BU,IAAUD,EAAE,QAAQ,MAAM,MAC1BE,IAAaT,GAAaQ,CAAO,GAEjCE,IAAWH,EAAE,MAChB,IAAI,CAACR,MACGA,EAAK,UAAU,MAAMC,GAAaD,EAAK,IAAI,CACnD,EACA,OACA,KAAK,GAAG,GAELY,IAAMF,IAAa,OAAOC;AAEhC,SAAOR,GAAMS,CAAG;AAClB;AClCO,SAASC,GAAWd,GAAsBC,GAAuB;AACtE,QAAMc,IAAQf,EAAU,MAAM,MAAA;AAC9B,SAAAe,EAAM,KAAKd,CAAI,GAER;AAAA,IACL,GAAGD;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;AAEO,SAASC,GACdhB,GACAiB,GACW;AACX,SAAO;AAAA,IACL,GAAGjB;AAAA,IACH,OAAO,CAAC,GAAGA,EAAU,OAAO,GAAGiB,CAAa;AAAA,EAAA;AAEhD;AClBO,SAASC,GACdlB,GACAmB,GACAlB,GACW;AACX,QAAMmB,IAAWpB,EAAU,OACrBe,IAAQ,IAAI,MAAMK,EAAS,SAAS,CAAC;AAE3C,WAASb,IAAI,GAAGA,IAAIY,GAAOZ;AACzB,IAAAQ,EAAMR,CAAC,IAAIa,EAASb,CAAC;AAGvB,EAAAQ,EAAMI,CAAK,IAAIlB;AAEf,WAASM,IAAIY,GAAOZ,IAAIa,EAAS,QAAQb;AACvC,IAAAQ,EAAMR,IAAI,CAAC,IAAIa,EAASb,CAAC;AAG3B,SAAO;AAAA,IACL,GAAGP;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;AAEO,SAASM,GACdrB,GACAmB,GACAG,GACW;AACX,QAAMF,IAAWpB,EAAU,OACrBuB,IAAID,EAAc,QAElBP,IAAQ,IAAI,MAAMK,EAAS,SAASG,CAAC;AAE3C,WAAShB,IAAI,GAAGA,IAAIY,GAAOZ;AACzB,IAAAQ,EAAMR,CAAC,IAAIa,EAASb,CAAC;AAGvB,WAASA,IAAI,GAAGA,IAAIgB,GAAGhB;AACrB,IAAAQ,EAAMI,IAAQZ,CAAC,IAAIe,EAAcf,CAAC;AAGpC,WAASA,IAAIY,GAAOZ,IAAIa,EAAS,QAAQb;AACvC,IAAAQ,EAAMR,IAAIgB,CAAC,IAAIH,EAASb,CAAC;AAG3B,SAAO;AAAA,IACL,GAAGP;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;ACnDO,SAASS,GAAWxB,GAAsBmB,GAA0B;AACzE,QAAMJ,IAAQf,EAAU,MAAM,MAAA;AAC9B,SAAAe,EAAM,OAAOI,GAAO,CAAC,GAEd;AAAA,IACL,GAAGnB;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;AAEO,SAASU,GACdzB,GACA0B,GACW;AACX,QAAMC,IAAS,IAAI,IAAID,CAAO;AAE9B,SAAO;AAAA,IACL,GAAG1B;AAAA,IACH,OAAOA,EAAU,MAAM,OAAO,CAAC4B,GAAGrB,MAAM,CAACoB,EAAO,IAAIpB,CAAC,CAAC;AAAA,EAAA;AAE1D;ACnBO,SAASsB,GACd7B,GACAmB,GACAlB,GACW;AACX,QAAMc,IAAQf,EAAU,MAAM,MAAA;AAC9B,SAAAe,EAAMI,CAAK,IAAIlB,GAER;AAAA,IACL,GAAGD;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;AAEO,SAASe,GACd9B,GACA+B,GAIW;AACX,QAAMhB,IAAQf,EAAU,MAAM,MAAA;AAE9B,aAAW,EAAE,OAAAmB,GAAO,MAAAlB,EAAA,KAAU8B;AAC5B,IAAAhB,EAAMI,CAAK,IAAIlB;AAGjB,SAAO;AAAA,IACL,GAAGD;AAAA,IACH,OAAAe;AAAA,EAAA;AAEJ;AC5BO,SAASiB,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAOH,IAAOC,GAEdG,IAASF,IAAO,aAAa,KAAKA,CAAI,IAAI,IAAI,aAAaC,CAAI;AAErE,MAAIC,EAAO,WAAWD;AACpB,UAAM,IAAI,MAAM,YAAYA,CAAI,gBAAgBC,EAAO,MAAM,EAAE;AAGjE,SAAO;AAAA,IACL,MAAAJ;AAAA,IACA,MAAAC;AAAA,IACA,MAAMG;AAAA,EAAA;AAEV;AAEO,SAASC,GAASF,GAAsB;AAC7C,QAAMD,IAAO,IAAI,aAAaC,IAAOA,CAAI;AAEzC,WAAS7B,IAAI,GAAGA,IAAI6B,GAAM7B;AACxB,IAAA4B,EAAK5B,IAAI6B,IAAO7B,CAAC,IAAI;AAGvB,SAAO;AAAA,IACL,MAAM6B;AAAA,IACN,MAAMA;AAAA,IACN,MAAAD;AAAA,EAAA;AAEJ;AAUO,SAAShB,EAAMe,GAAcK,GAAaC,GAAqB;AACpE,SAAOD,IAAML,IAAOM;AACtB;AChDA,MAAM9C,KAAM;AAEZ,SAASI,GAAMF,GAAmB;AAChC,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAMO,SAAS6C,EACdN,GACS;AACT,QAAMO,IACJP,aAAgB,eACZ,MAAM,KAAKA,CAAI,IACf,UAAUA,IACR,MAAM,KAAKA,EAAK,IAAI,IACpBA;AAER,MAAIQ;AAEJ,MAAID,EAAO,WAAW,GAAG;AACvB,UAAM,CAACE,GAAGC,GAAGC,CAAC,IAAIJ;AAElB,IAAAC,IAAI,IAAI,aAAa,CAACC,GAAG,GAAG,GAAG,GAAGC,GAAG,GAAG,GAAG,GAAGC,CAAC,CAAC;AAAA,EAClD,WAAWJ,EAAO,WAAW,GAAG;AAC9B,IAAAC,IAAI,IAAI,aAAa,CAAC;AAEtB,aAASpC,IAAI,GAAGA,IAAI,GAAGA;AACrB,MAAAoC,EAAEpC,CAAC,IAAIT,GAAM4C,EAAOnC,CAAC,CAAC;AAAA,EAE1B;AACE,UAAM,IAAI,MAAM,gCAAgC;AAGlD,SAAO;AAAA,IACL,OAAOyB,EAAa,GAAG,GAAGW,CAAC;AAAA,EAAA;AAE/B;ACvCO,SAASI,GAAIH,GAAWC,GAAmB;AAChD,MAAID,EAAE,WAAWC,EAAE;AACjB,UAAM,IAAI,MAAM,0CAA0C;AAG5D,MAAIG,IAAM;AAEV,WAASzC,IAAI,GAAGA,IAAIqC,EAAE,QAAQrC;AAC5B,IAAAyC,KAAOJ,EAAErC,CAAC,IAAIsC,EAAEtC,CAAC;AAGnB,SAAOyC;AACT;ACVO,SAASC,EAAKpD,GAAmB;AACtC,MAAImD,IAAM;AAEV,WAASzC,IAAI,GAAGA,IAAIV,EAAE,QAAQU,KAAK;AACjC,UAAMX,IAAIC,EAAEU,CAAC;AACb,IAAAyC,KAAOpD,IAAIA;AAAA,EACb;AAEA,SAAO,KAAK,KAAKoD,CAAG;AACtB;ACPA,SAASE,EAAMC,GAAWtD,GAAW;AACnC,QAAMuD,IAAQH,EAAKE,CAAC,IAAIF,EAAKpD,CAAC;AAC9B,MAAIuD,MAAU,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAE7D,QAAMN,IAAIC,GAAII,GAAGtD,CAAC,IAAIuD,GAChBC,IAAU,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGP,CAAC,CAAC;AAE3C,SAAO,KAAK,KAAKO,CAAO;AAC1B;AAEO,SAASC,GAAO5C,GAA4C;AACjE,QAAMiC,IAAIjC,EAAQ,MAAM,MAElBkC,IAAY,IAAI,aAAa,CAACD,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CE,IAAY,IAAI,aAAa,CAACF,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAC/CG,IAAY,IAAI,aAAa,CAACH,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GAE/CY,IAAQL,EAAML,GAAGC,CAAC,GAClBU,IAAON,EAAMN,GAAGE,CAAC,GACjBW,IAAQP,EAAMN,GAAGC,CAAC;AAExB,SAAO,CAACU,GAAOC,GAAMC,CAAK;AAC5B;AC1BO,SAASC,GAAWf,GAAmB;AAC5C,MAAIA,EAAE,SAAS,KAAKA,EAAE,SAAS;AAC7B,UAAM,IAAI,MAAM,qBAAqB;AAGvC,QAAMgB,IAAMhB,EAAE,KAAK,CAAC,GAClBiB,IAAMjB,EAAE,KAAK,CAAC,GACdkB,IAAMlB,EAAE,KAAK,CAAC,GACVmB,IAAMnB,EAAE,KAAK,CAAC,GAClBoB,IAAMpB,EAAE,KAAK,CAAC,GACdqB,IAAMrB,EAAE,KAAK,CAAC,GACVsB,IAAMtB,EAAE,KAAK,CAAC,GAClBuB,IAAMvB,EAAE,KAAK,CAAC,GACdwB,IAAMxB,EAAE,KAAK,CAAC,GAEVyB,IAAML,IAAMI,IAAMH,IAAME,GACxBG,IAAML,IAAMC,IAAMH,IAAMK,GACxBG,IAAMR,IAAMI,IAAMH,IAAME,GAExBM,IAAMV,IAAMK,IAAMN,IAAMO,GACxBK,IAAMb,IAAMQ,IAAMN,IAAMI,GACxBQ,IAAMb,IAAMK,IAAMN,IAAMO,GAExBQ,IAAMd,IAAMI,IAAMH,IAAME,GACxBY,IAAMd,IAAMC,IAAMH,IAAMK,GACxBY,IAAMjB,IAAMI,IAAMH,IAAME,GAExBe,IAAMlB,IAAMS,IAAMR,IAAMS,IAAMR,IAAMS;AAE1C,MAAIO,MAAQ;AACV,UAAM,IAAI,MAAM,iBAAiB;AAGnC,QAAMC,IAAS,IAAID,GAEbE,IAAM/C,EAAa,GAAG,CAAC;AAE7B,SAAA+C,EAAI,KAAK,CAAC,IAAIX,IAAMU,GACpBC,EAAI,KAAK,CAAC,IAAIR,IAAMO,GACpBC,EAAI,KAAK,CAAC,IAAIL,IAAMI,GAEpBC,EAAI,KAAK,CAAC,IAAIV,IAAMS,GACpBC,EAAI,KAAK,CAAC,IAAIP,IAAMM,GACpBC,EAAI,KAAK,CAAC,IAAIJ,IAAMG,GAEpBC,EAAI,KAAK,CAAC,IAAIT,IAAMQ,GACpBC,EAAI,KAAK,CAAC,IAAIN,IAAMK,GACpBC,EAAI,KAAK,CAAC,IAAIH,IAAME,GAEbC;AACT;AChDO,SAASC,EAAQtE,GAA0B;AAChD,SAAOgD,GAAWhD,EAAQ,KAAK;AACjC;ACJO,SAASuE,GAAQvE,GAA4C;AAClE,QAAMiC,IAAIjC,EAAQ,MAAM,MAElBkC,IAAkB,IAAI,aAAa,CAACD,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDE,IAAkB,IAAI,aAAa,CAACF,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC,GACrDG,IAAkB,IAAI,aAAa,CAACH,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAE3D,SAAO,CAACM,EAAKL,CAAC,GAAGK,EAAKJ,CAAC,GAAGI,EAAKH,CAAC,CAAC;AACnC;ACRO,SAASoC,EAAUC,GAAwB;AAChD,QAAMJ,IAAM/C,EAAamD,EAAO,MAAMA,EAAO,IAAI;AAEjD,WAAS5C,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,aAASC,IAAM,GAAGA,IAAM2C,EAAO,MAAM3C;AACnC,MAAAuC,EAAI,KAAK5D,EAAM4D,EAAI,MAAMvC,GAAKD,CAAG,CAAC,IAChC4C,EAAO,KAAKhE,EAAMgE,EAAO,MAAM5C,GAAKC,CAAG,CAAC;AAI9C,SAAOuC;AACT;ACXO,SAASK,EAAIxC,GAAWC,GAAmB;AAChD,MAAID,EAAE,SAASC,EAAE;AACf,UAAM,IAAI,MAAM,0CAA0C;AAG5D,QAAMkC,IAAM/C,EAAaY,EAAE,MAAMC,EAAE,IAAI,GAEjCwC,IAAQzC,EAAE,MACV0C,IAAQ1C,EAAE,MACV2C,IAAQ1C,EAAE;AAEhB,WAASN,IAAM,GAAGA,IAAM8C,GAAO9C;AAC7B,aAASC,IAAM,GAAGA,IAAM+C,GAAO/C,KAAO;AACpC,UAAIQ,IAAM;AAEV,eAASwC,IAAI,GAAGA,IAAIF,GAAOE;AACzB,QAAAxC,KAAOJ,EAAE,KAAKzB,EAAMyB,EAAE,MAAML,GAAKiD,CAAC,CAAC,IAAI3C,EAAE,KAAK1B,EAAM0B,EAAE,MAAM2C,GAAGhD,CAAG,CAAC;AAGrE,MAAAuC,EAAI,KAAK5D,EAAM4D,EAAI,MAAMxC,GAAKC,CAAG,CAAC,IAAIQ;AAAA,IACxC;AAGF,SAAO+B;AACT;ACrBO,SAASU,GAAa/E,GAA0B;AACrD,QAAMgF,IAAIhF,EAAQ,OAEZiF,IAAKT,EAAUQ,CAAC;AACtB,SAAON,EAAIO,GAAID,CAAC;AAClB;ACNA,MAAME,IAAU,MAAM,KAAK;AAEpB,SAASC,GACdnF,GACkD;AAClD,QAAM,CAACkC,GAAGC,GAAGC,CAAC,IAAImC,GAAQvE,CAAO,GAC3B,CAAC6C,GAAOC,GAAMC,CAAK,IAAIH,GAAO5C,CAAO;AAE3C,SAAO,CAACkC,GAAGC,GAAGC,GAAGS,IAAQqC,GAASpC,IAAOoC,GAASnC,IAAQmC,CAAO;AACnE;ACPA,MAAME,KAAS,IAAI,KAAK;AAEjB,SAASC,GAAkBrF,GAA2B;AAC3D,QAAMsF,IAAMhB,EAAQtE,CAAO,GAGrByB,IAFO+C,EAAUc,CAAG,EAER,KAAK,IAAI,CAACnG,MAAMA,IAAIiG,EAAM;AAE5C,SAAOrD,EAAcN,CAAI;AAC3B;ACXO,SAAS8D,GAAkCvF,GAA2B;AAC3E,QAAMsF,IAAMhB,EAAQtE,CAAO,GACrBwF,IAAOhB,EAAUc,CAAG;AAE1B,SAAOvD,EAAcyD,EAAK,IAAI;AAChC;ACPA,MAAMC,IAAU,KAAK,KAAK,KACpBzG,KAAM;AAEZ,SAASI,EAAMF,GAAW;AACxB,SAAO,KAAK,IAAIA,CAAC,IAAIF,KAAM,IAAIE;AACjC;AAEO,SAASwG,EACdxD,GACAC,GACAC,GACAS,GACAC,GACAC,GACA;AACA,QAAM4C,IAAS9C,IAAQ4C,GACjBG,IAAQ9C,IAAO2C,GACfI,IAAS9C,IAAQ0C,GAEjBK,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIH,CAAK,GACrBI,IAAO,KAAK,IAAIH,CAAM,GACtBI,IAAO,KAAK,IAAIJ,CAAM,GAGtBK,IAAK,CAAChE,GAAG,GAAG,CAAC,GAEbiE,IAAK,CAAChE,IAAI6D,GAAM7D,IAAI8D,GAAM,CAAC;AAGjC,MAAI,KAAK,IAAIA,CAAI,IAAIjH;AACnB,UAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAMoH,IAAKhE,IAAI2D,GAETM,IAAMjE,KAAK0D,IAAOC,IAAOC,KAASC,GAElCK,IAAYlE,IAAIA,IAAIgE,IAAKA,IAAKC,IAAKA,GAEnCE,IAAK,KAAK,KAAK,KAAK,IAAI,GAAGD,CAAS,CAAC;AAE3C,SAAOvE,EAAc;AAAA,IACnB3C,EAAM8G,EAAG,CAAC,CAAC;AAAA,IACX9G,EAAM8G,EAAG,CAAC,CAAC;AAAA,IACX9G,EAAM8G,EAAG,CAAC,CAAC;AAAA,IACX9G,EAAM+G,EAAG,CAAC,CAAC;AAAA,IACX/G,EAAM+G,EAAG,CAAC,CAAC;AAAA,IACX/G,EAAM+G,EAAG,CAAC,CAAC;AAAA,IACX/G,EAAMgH,CAAE;AAAA,IACRhH,EAAMiH,CAAE;AAAA,IACRjH,EAAMmH,CAAE;AAAA,EAAA,CACT;AACH;ACrDO,SAASC,GAAMtE,GAAW;AAC/B,SAAOwD,EAAexD,GAAGA,GAAGA,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAASuE,GAAUvE,GAAWE,GAAW;AAC9C,SAAOsD,EAAexD,GAAGA,GAAGE,GAAG,IAAI,IAAI,GAAG;AAC5C;ACFO,SAASsE,GAAWxE,GAAWC,GAAWC,GAAWU,GAAc;AACxE,SAAO4C,EAAexD,GAAGC,GAAGC,GAAG,IAAIU,GAAM,EAAE;AAC7C;ACFO,SAAS6D,GAAazE,GAAWC,GAAWC,GAAW;AAC5D,SAAOsD,EAAexD,GAAGC,GAAGC,GAAG,IAAI,IAAI,EAAE;AAC3C;ACFO,SAASwE,GAAa1E,GAAWW,GAAe;AACrD,SAAO6C,EAAexD,GAAGA,GAAGA,GAAGW,GAAOA,GAAOA,CAAK;AACpD;ACFO,SAASgE,GAAW3E,GAAWE,GAAW;AAC/C,SAAOsD,EAAexD,GAAGA,GAAGE,GAAG,IAAI,IAAI,EAAE;AAC3C;ACCA,IAAI0E,IAA8B;AAE3B,SAASC,KAAW;AACzB,SAAKD,MACHA,KAAS,YAAY;AAEnB,QAAI,OAAO,UAAY,OAAe,QAAQ,UAAU;AACtD,UAAI;AACF,cAAM,EAAE,cAAAE,EAAA,IAAiB,MAAM,OAAO,uCAAI,GACpC,EAAE,MAAAC,EAAA,IAAS,MAAM,OAAO,uCAAM,GAC9BC,IAAWD;AAAA,UACf,QAAQ,IAAA;AAAA,UACR;AAAA,QAAA,GAEIE,IAAaH,EAAaE,CAAQ;AACxC,cAAME,GAAKD,CAAU;AAAA,MACvB,SAASE,GAAG;AACV,sBAAQ,MAAM,gCAAgCA,CAAC,GACzCA;AAAA,MACR;AAAA,SACK;AAEL,YAAMC,IAAU,kvtrBAGd,SAAA;AAEF,YAAMF,GAAKE,CAAO;AAAA,IACpB;AAAA,EACF,GAAA,IAEKR;AACT;AAEA,eAAsBS,GACpBjI,GACAkI,IAAY,MACZC,IAAU,YAKT;AACD,QAAMV,GAAA;AAKN,QAAMW,wBAAiB,IAAA,GACjBC,wBAAiB,IAAA;AAEvB,MAAIC,IAAU;AAEd,QAAMC,IAAwB,CAAA,GACxBC,IAAoB,CAAA;AAE1B,aAAWvI,KAAQD,EAAU,OAAO;AAClC,UAAMyI,IAASxI,EAAK,QAAQ;AAE5B,IAAKmI,EAAW,IAAIK,CAAM,MACxBL,EAAW,IAAIK,GAAQH,CAAO,GAC9BD,EAAW,IAAIC,GAASG,CAAM,GAC9BH,MAGFC,EAAU,KAAK,MAAM,KAAKtI,EAAK,IAAI,CAAC,GACpCuI,EAAQ,KAAKJ,EAAW,IAAIK,CAAM,CAAE;AAAA,EACtC;AAKA,QAAMC,IAAY;AAAA,IAChB,SAAS;AAAA,MACP,OAAO,MAAM,KAAK1I,EAAU,QAAQ,MAAM,IAAI;AAAA,IAAA;AAAA,IAEhD,WAAAuI;AAAA,IACA,SAAAC;AAAA,EAAA,GAMIG,IAAU,MAAMC;AAAA,IACpB,KAAK,UAAUF,CAAS;AAAA,IACxBR;AAAA,IACAC;AAAA,EAAA;AAMF,WAASU,EAAMC,GAID;AACZ,UAAM,EAAE,SAAApI,GAAS,WAAA6H,GAAW,SAAAC,MAAYM,GAElCC,IAAU,CAAC,GAAG,IAAI,IAAIP,CAAO,CAAC,EAAE,IAAI,CAACjH,OAAe;AAAA,MACxD,QAAQ8G,EAAW,IAAI9G,CAAC;AAAA,IAAA,EACxB,GAEIR,IAAQwH,EAAU,IAAI,CAACS,GAAezI,OAAe;AAAA,MACzD,SAAS;AAAA,QACP,QAAQ8H,EAAW,IAAIG,EAAQjI,CAAC,CAAC;AAAA,MAAA;AAAA,MAEnC,MAAM,IAAI,aAAayI,CAAG;AAAA,IAAA,EAC1B;AAEF,WAAO;AAAA,MACL,SAASvG,EAAc/B,EAAQ,KAAK;AAAA,MACpC,SAAAqI;AAAA,MACA,OAAAhI;AAAA,IAAA;AAAA,EAEJ;AAKA,SAAO;AAAA,IACL,WAAW8H,EAAMF,EAAQ,aAAa;AAAA,IACtC,cAAcE,EAAMF,EAAQ,QAAQ;AAAA,IACpC,oBAAoBA;AAAA,EAAA;AAExB;AChIA,SAASM,GAAM9D,GAAgB+D,GAAiBC,GAAyB;AACvE,QAAMpE,IAAM/C,EAAamD,EAAO,OAAO,GAAGA,EAAO,OAAO,CAAC;AAEzD,MAAIiE,IAAM;AAEV,WAAS7G,IAAM,GAAGA,IAAM4C,EAAO,MAAM5C;AACnC,QAAIA,MAAQ2G;AAEZ,eAAS1G,IAAM,GAAGA,IAAM2C,EAAO,MAAM3C;AACnC,QAAIA,MAAQ2G,MAEZpE,EAAI,KAAKqE,GAAK,IAAIjE,EAAO,KAAKhE,EAAMgE,EAAO,MAAM5C,GAAKC,CAAG,CAAC;AAI9D,SAAOuC;AACT;AAEO,SAASsE,GAAYlE,GAAwB;AAClD,MAAIA,EAAO,SAASA,EAAO;AACzB,UAAM,IAAI,MAAM,sCAAsC;AAGxD,QAAM5D,IAAI4D,EAAO;AAGjB,MAAI5D,MAAM,GAAG;AACX,UAAMoB,IAAIwC,EAAO;AAEjB,WACExC,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,KAChCA,EAAE,CAAC,KAAKA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AAAA,EAEpC;AAEA,MAAIpB,MAAM;AACR,WAAO4D,EAAO,KAAK,CAAC;AAGtB,MAAI5D,MAAM;AACR,WAAO4D,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC,IAAIA,EAAO,KAAK,CAAC;AAGzE,MAAIN,IAAM;AAEV,WAASrC,IAAM,GAAGA,IAAMjB,GAAGiB,KAAO;AAChC,UAAM8G,IAAO9G,IAAM,MAAM,IAAI,IAAI;AAEjC,IAAAqC,KAAOyE,IAAOnE,EAAO,KAAK3C,CAAG,IAAI6G,GAAYJ,GAAM9D,GAAQ,GAAG3C,CAAG,CAAC;AAAA,EACpE;AAEA,SAAOqC;AACT;ACzCA,SAAS0E,GACPC,GACAC,GACAC,GACAxB,IAAY,OACS;AACrB,QAAMxC,IAAI1D,EAAa,GAAG,GAAG,CAAC,GAAGwH,EAAG,QAAQ,GAAGC,EAAG,QAAQ,GAAGC,EAAG,MAAM,CAAC,GAEjEC,IAAON,GAAY3D,CAAC;AAE1B,MAAI,KAAK,IAAIiE,CAAI,IAAIzB,EAAW,QAAO;AAEvC,QAAM0B,IAAOlG,GAAWgC,CAAC,GAEnBmE,IAAI7H,EAAa,GAAG,GAAG,CAACwH,EAAG,QAAQC,EAAG,QAAQC,EAAG,MAAM,CAAC,GAExDI,IAAM1E,EAAIwE,GAAMC,CAAC,EAAE;AAEzB,SAAO,IAAI,aAAa,CAACC,EAAI,CAAC,GAAGA,EAAI,CAAC,GAAGA,EAAI,CAAC,CAAC,CAAC;AAClD;AAEA,SAASjJ,GAAIhB,GAAiB;AAC5B,QAAMkK,IAAKlK,EAAE,CAAC,GACZmK,IAAKnK,EAAE,CAAC,GACRoK,IAAKpK,EAAE,CAAC,GACJmG,IAAM,IAAI,KAAK,KAAK+D,IAAKA,IAAKC,IAAKA,IAAKC,IAAKA,CAAE,GAG/CrK,IAAI,KAAK,MAAMmK,IAAK/D,IAAM,GAAG,GAC7BkE,IAAI,KAAK,MAAMF,IAAKhE,IAAM,GAAG,GAC7BmE,IAAI,KAAK,MAAMF,IAAKjE,IAAM,GAAG;AAEnC,SAAO,GAAGpG,CAAC,IAAIsK,CAAC,IAAIC,CAAC;AACvB;AAEA,SAASC,GAAKvK,GAAiBwK,IAAM,MAAM;AACzC,SAAO,GAAG,KAAK,MAAMxK,EAAE,CAAC,IAAIwK,CAAG,CAAC,IAAI,KAAK,MAAMxK,EAAE,CAAC,IAAIwK,CAAG,CAAC,IAAI,KAAK,MAAMxK,EAAE,CAAC,IAAIwK,CAAG,CAAC;AACtF;AAEA,SAASC,GAASzK,GAAiB0K,GAAiB;AAElD,aAAWC,KAAKD;AAGd,QAFUC,EAAE,OAAO,CAAC,IAAI3K,EAAE,CAAC,IAAI2K,EAAE,OAAO,CAAC,IAAI3K,EAAE,CAAC,IAAI2K,EAAE,OAAO,CAAC,IAAI3K,EAAE,CAAC,IAE7D2K,EAAE,SAAS,EAAW,QAAO;AAEvC,SAAO;AACT;AAEA,eAAsBC,GACpBzK,GACAkI,IAAoB,MACK;AAKzB,QAAMwC,IAJoBzE;AAAA,IACxBjG,EAAU;AAAA,EAAA,EAGmB,MAAM,MAE/B2K,IAAQ,CAACD,EAAK,CAAC,GAAGA,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC,GAClCE,IAAQ,CAACF,EAAK,CAAC,GAAGA,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC,GAClCG,IAAQ,CAACH,EAAK,CAAC,GAAGA,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC,GAElCI,IAAQ,GACRC,IAAmB,CAAA;AAEzB,WAASC,IAAI,CAACF,GAAOE,KAAKF,GAAOE;AAC/B,aAASxF,IAAI,CAACsF,GAAOtF,KAAKsF,GAAOtF;AAC/B,eAASyF,IAAI,CAACH,GAAOG,KAAKH,GAAOG,KAAK;AACpC,cAAMC,IAAQ,IAAI,aAAa,CAAC;AAEhC,QAAAA,EAAM,CAAC,IAAIF,IAAIL,EAAM,CAAC,IAAInF,IAAIoF,EAAM,CAAC,IAAIK,IAAIJ,EAAM,CAAC,GAEpDK,EAAM,CAAC,IAAIF,IAAIL,EAAM,CAAC,IAAInF,IAAIoF,EAAM,CAAC,IAAIK,IAAIJ,EAAM,CAAC,GAEpDK,EAAM,CAAC,IAAIF,IAAIL,EAAM,CAAC,IAAInF,IAAIoF,EAAM,CAAC,IAAIK,IAAIJ,EAAM,CAAC,GAEpDE,EAAO,KAAKG,CAAK;AAAA,MACnB;AAKJ,QAAMC,IAAYJ,EAAO;AAAA,IACvB,CAACP,MACC,KAAK,IAAIA,EAAE,CAAC,CAAC,IAAItC,KACjB,KAAK,IAAIsC,EAAE,CAAC,CAAC,IAAItC,KACjB,KAAK,IAAIsC,EAAE,CAAC,CAAC,IAAItC;AAAA,EAAA;AAIrB,EAAAiD,EAAU,KAAK,CAACvI,GAAGC,MAAM;AACvB,UAAMuI,IAAKxI,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,GAE3CyI,IAAKxI,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AAEjD,WAAOuI,IAAKC;AAAA,EACd,CAAC;AAED,QAAMC,wBAAU,IAAA;AAEhB,aAAWd,KAAKW,GAAW;AACzB,UAAM3F,IAAI3E,GAAI2J,CAAC;AACf,IAAKc,EAAI,IAAI9F,CAAC,KAAG8F,EAAI,IAAI9F,GAAGgF,CAAC;AAAA,EAC/B;AAMA,QAAMD,IAJkB,CAAC,GAAGe,EAAI,QAAQ,EAIT,MAAM,GAAG,EAAE,EAAE,IAAI,CAACC,OAAO;AAAA,IACtD,QAAQA;AAAA,IACR,QAAQxI,GAAIwI,GAAGA,CAAC,IAAI;AAAA,EAAA,EACpB,GAEIC,IAAqC,CAAA;AAE3C,WAASjL,IAAI,GAAGA,IAAIgK,EAAO,QAAQhK;AACjC,aAASkL,IAAIlL,IAAI,GAAGkL,IAAIlB,EAAO,QAAQkB;AACrC,eAASjG,IAAIiG,IAAI,GAAGjG,IAAI+E,EAAO,QAAQ/E,KAAK;AAC1C,cAAM3F,IAAI0J,GAAgBgB,EAAOhK,CAAC,GAAGgK,EAAOkB,CAAC,GAAGlB,EAAO/E,CAAC,GAAG0C,CAAS;AAEpE,QAAKrI,KAEDyK,GAASzK,GAAG0K,CAAM,KACpBiB,EAAmB,KAAK3L,CAAC;AAAA,MAE7B;AAIJ,QAAM6L,wBAAgB,IAAA;AAEtB,aAAW7L,KAAK2L,GAAoB;AAClC,UAAMhG,IAAI4E,GAAKvK,CAAC;AAChB,IAAK6L,EAAU,IAAIlG,CAAC,KAClBkG,EAAU,IAAIlG,GAAG3F,CAAC;AAAA,EAEtB;AAIA,SAFqB,CAAC,GAAG6L,EAAU,QAAQ;AAG7C;ACvJO,SAASC,GACd3L,GACAoC,GACW;AACX,QAAM,CAAC2H,GAAIC,GAAIC,CAAE,IAAI,OAAO7H,KAAS,WAAW,CAACA,GAAMA,GAAMA,CAAI,IAAIA;AAErE,MACE2H,IAAK,KACLC,IAAK,KACLC,IAAK,KACL,CAAC,OAAO,UAAUF,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE,KACpB,CAAC,OAAO,UAAUC,CAAE;AAEpB,UAAM,IAAI,MAAM,gDAAgD;AAGlE,QAAMtH,IAAI3C,EAAU,QAAQ,MAAM,MAG5B4L,IAAW;AAAA,IACfjJ,EAAE,CAAC,IAAIoH;AAAA,IACPpH,EAAE,CAAC,IAAIoH;AAAA,IACPpH,EAAE,CAAC,IAAIoH;AAAA,IAEPpH,EAAE,CAAC,IAAIqH;AAAA,IACPrH,EAAE,CAAC,IAAIqH;AAAA,IACPrH,EAAE,CAAC,IAAIqH;AAAA,IAEPrH,EAAE,CAAC,IAAIsH;AAAA,IACPtH,EAAE,CAAC,IAAIsH;AAAA,IACPtH,EAAE,CAAC,IAAIsH;AAAA,EAAA,GAGHlJ,IAAgB,CAAA;AAEtB,aAAWd,KAAQD,EAAU,OAAO;AAClC,UAAM,CAACJ,GAAGsK,GAAGC,CAAC,IAAIlK,EAAK;AAEvB,aAASM,IAAI,GAAGA,IAAIwJ,GAAIxJ;AACtB,eAASkL,IAAI,GAAGA,IAAIzB,GAAIyB;AACtB,iBAASjG,IAAI,GAAGA,IAAIyE,GAAIzE;AACtB,UAAAzE,EAAM,KAAK;AAAA,YACT,SAASd,EAAK;AAAA,YAEd,MAAM,IAAI,aAAa,EAAEL,IAAIW,KAAKwJ,IAAKG,IAAIuB,KAAKzB,IAAKG,IAAI3E,KAAKyE,CAAE,CAAC;AAAA,UAAA,CAClE;AAAA,EAIT;AAEA,SAAO;AAAA,IACL,SAASxH,EAAcmJ,CAAQ;AAAA,IAC/B,OAAA7K;AAAA,EAAA;AAEJ;ACzDO,SAAS8K,GAAaC,GAAwB;AACnD,SAAO,IAAI,aAAa;AAAA,IACtBA,EAAG,CAAC,IAAI,KAAK,MAAMA,EAAG,CAAC,CAAC;AAAA,IACxBA,EAAG,CAAC,IAAI,KAAK,MAAMA,EAAG,CAAC,CAAC;AAAA,IACxBA,EAAG,CAAC,IAAI,KAAK,MAAMA,EAAG,CAAC,CAAC;AAAA,EAAA,CACzB;AACH;AAEO,SAASC,GAAgBC,GAAWT,GAAyB;AAClE,QAAM3L,IAAIoM,EAAI,CAAC,GACb9B,IAAI8B,EAAI,CAAC,GACT7B,IAAI6B,EAAI,CAAC;AAEX,SACEpM,KAAK2L,EAAE,CAAC,IAAI3L,IAAI2L,EAAE,CAAC,IAAIrB,IAAIqB,EAAE,CAAC,IAAIpB,KAClCD,KAAKqB,EAAE,CAAC,IAAI3L,IAAI2L,EAAE,CAAC,IAAIrB,IAAIqB,EAAE,CAAC,IAAIpB,KAClCA,KAAKoB,EAAE,CAAC,IAAI3L,IAAI2L,EAAE,CAAC,IAAIrB,IAAIqB,EAAE,CAAC,IAAIpB;AAEtC;ACnBO,SAAS8B,GACdjM,GACAkM,GACAC,GACM;AACN,QAAMC,IAAKpM,EAAU,MAAMkM,CAAI,GACzBG,IAAKrM,EAAU,MAAMmM,CAAI;AAE/B,SAAON,GAAa;AAAA,IAClBQ,EAAG,KAAK,CAAC,IAAID,EAAG,KAAK,CAAC;AAAA,IACtBC,EAAG,KAAK,CAAC,IAAID,EAAG,KAAK,CAAC;AAAA,IACtBC,EAAG,KAAK,CAAC,IAAID,EAAG,KAAK,CAAC;AAAA,EAAA,CACvB;AACH;ACXO,SAASE,GACdtM,GACAkM,GACAC,GACQ;AACR,QAAMI,IAAeN,GAAgBjM,GAAWkM,GAAMC,CAAI,GAEpDZ,IAAI9F,GAAazF,EAAU,OAAO,EAAE;AAE1C,SAAO,KAAK,KAAK+L,GAAgBQ,GAAchB,CAAC,CAAC;AACnD;ACVO,SAASiB,GAAaxM,GAAsByM,GAA2B;AAC5E,QAAMlL,IAAIvB,EAAU,MAAM,QACpB+E,IAAM,IAAI,aAAaxD,CAAC,GAExBgK,IAAI9F,GAAazF,EAAU,OAAO,EAAE;AAE1C,WAASyL,IAAI,GAAGA,IAAIlK,GAAGkK,KAAK;AAC1B,QAAIA,MAAMgB,GAAK;AACb,MAAA1H,EAAI0G,CAAC,IAAI;AACT;AAAA,IACF;AAEA,UAAMiB,IAAOT,GAAgBjM,GAAWyM,GAAKhB,CAAC;AAE9C,IAAA1G,EAAI0G,CAAC,IAAI,KAAK,KAAKM,GAAgBW,GAAMnB,CAAC,CAAC;AAAA,EAC7C;AAEA,SAAOxG;AACT;AClBO,SAAS4H,GAAmB3M,GAAsC;AACvE,QAAMuB,IAAIvB,EAAU,MAAM,QAEpBmF,IAAyB,MAAM;AAAA,IACnC,EAAE,QAAQ5D,EAAA;AAAA,IACV,MAAM,IAAI,aAAaA,CAAC;AAAA,EAAA,GAGpBgK,IAAI9F,GAAazF,EAAU,OAAO,EAAE;AAE1C,WAASO,IAAI,GAAGA,IAAIgB,GAAGhB,KAAK;AAC1B,IAAA4E,EAAO5E,CAAC,EAAEA,CAAC,IAAI;AAEf,aAASkL,IAAIlL,IAAI,GAAGkL,IAAIlK,GAAGkK,KAAK;AAC9B,YAAMiB,IAAOT,GAAgBjM,GAAWO,GAAGkL,CAAC,GAEtC5B,IAAI,KAAK,KAAKkC,GAAgBW,GAAMnB,CAAC,CAAC;AAE5C,MAAApG,EAAO5E,CAAC,EAAEkL,CAAC,IAAI5B,GACf1E,EAAOsG,CAAC,EAAElL,CAAC,IAAIsJ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO1E;AACT;ACzBO,SAASyH,GACd5M,GACA6M,GACU;AACV,QAAMnL,IAAoB,CAAA;AAE1B,WAASnB,IAAI,GAAGA,IAAIP,EAAU,MAAM,QAAQO;AAC1C,IAAIsM,EAAU7M,EAAU,MAAMO,CAAC,GAAGA,CAAC,KACjCmB,EAAQ,KAAKnB,CAAC;AAIlB,SAAOmB;AACT;ACZO,SAASoL,GACd9M,GACA+I,GACU;AACV,SAAO6D,GAAU5M,GAAW,CAACC,MAASA,EAAK,QAAQ,WAAW8I,EAAQ,MAAM;AAC9E;ACRO,SAASgE,GAAOrM,GAA0B;AAC/C,SAAO,KAAK,IAAI2I,GAAY3I,EAAQ,KAAK,CAAC;AAC5C;ACFO,SAASqM,GAAO/M,GAA8B;AACnD,SAAOgN,GAAchN,EAAU,OAAO;AACxC;ACHA,SAASiN,GAAIrK,GAAWC,GAAmB;AACzC,SAAOA,MAAM;AACX,KAACD,GAAGC,CAAC,IAAI,CAACA,GAAGD,IAAIC,CAAC;AAGpB,SAAO,KAAK,IAAID,CAAC;AACnB;AAEO,SAASsK,GAAYlN,GAA8C;AACxE,QAAM+E,IAA8B,CAAA;AAEpC,aAAW9E,KAAQD,EAAU,OAAO;AAClC,UAAMyI,IAASxI,EAAK,QAAQ;AAE5B,IAAA8E,EAAI0D,CAAM,MAAM,GAChB1D,EAAI0D,CAAM;AAAA,EACZ;AAEA,SAAO1D;AACT;AAEA,SAASoI,GAAeC,GAAsC;AAG5D,SAFe,OAAO,OAAOA,CAAI,EAEnB,OAAO,CAACxK,GAAGC,MAAMoK,GAAIrK,GAAGC,CAAC,CAAC;AAC1C;AAEA,SAASwK,GAAUC,GAA8B;AAC/C,MAAI,CAACA,EAAS,SAAS,GAAG;AACxB,WAAO,CAAC,GAAGA,CAAQ,EAAE,KAAA;AAGvB,QAAMC,IAAOD,EAAS,OAAO,CAACvF,MAAMA,MAAM,OAAOA,MAAM,GAAG,EAAE,KAAA;AAE5D,SAAO,CAAC,KAAK,GAAIuF,EAAS,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,IAAK,GAAGC,CAAI;AAChE;AAEA,SAASC,GACPJ,GACAK,GACQ;AAGR,SAFiBA,EAAS,OAAO,KAAKL,CAAI,CAAC,EAGxC,IAAI,CAACM,MAAO;AACX,UAAMC,IAAQP,EAAKM,CAAE;AAErB,WAAOC,MAAU,IAAID,IAAK,GAAGA,CAAE,GAAGC,CAAK;AAAA,EACzC,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAASC,GACPR,GACwB;AACxB,QAAMS,IAASV,GAAeC,CAAI,GAE5BrI,IAA8B,CAAA;AAEpC,aAAW,CAAC+I,GAASH,CAAK,KAAK,OAAO,QAAQP,CAAI;AAChD,IAAArI,EAAI+I,CAAO,IAAIH,IAAQE;AAGzB,SAAO9I;AACT;AAEO,SAASgJ,GAAY/N,GAA8B;AACxD,SAAOwN,GAAuBN,GAAYlN,CAAS,GAAGqN,EAAS;AACjE;AAEO,SAASW,GAAehO,GAA8B;AAC3D,SAAOwN;AAAA,IACLI,GAAmBV,GAAYlN,CAAS,CAAC;AAAA,IACzCqN;AAAA,EAAA;AAEJ;ACrEO,MAAMY,KAA6C;AAAA,EACxD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,MAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC1D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,WAAW,MAAM,KAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC7D,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,SAAS,MAAM,MAAA;AAAA,EACxD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAA;AAAA,EACzD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC3D,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAA;AAAA,EACzD,GAAG,EAAE,cAAc,GAAG,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,MAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,cAAc,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,UAAU,MAAM,MAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,MAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,OAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,aAAa,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,OAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,MAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,GAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,OAAO,MAAM,OAAA;AAAA,EACzD,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,MAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,UAAU,MAAM,QAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,QAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,QAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,QAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,gBAAgB,MAAM,OAAA;AAAA,EAClE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,QAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,OAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,cAAc,MAAM,MAAA;AAAA,EAChE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,OAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,YAAY,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,QAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,QAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,QAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,OAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAA;AAAA,EAC1D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,SAAS,MAAM,IAAA;AAAA,EAC3D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,IAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAC9D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,WAAW,MAAM,OAAA;AAAA,EAC7D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,gBAAgB,MAAM,OAAA;AAAA,EAClE,IAAI,EAAE,cAAc,IAAI,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,UAAU,MAAM,IAAA;AAAA,EAC5D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EAC/D,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACjE,IAAI,EAAE,cAAc,IAAI,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAChE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,iBAAiB,MAAM,IAAA;AAAA,EACrE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,WAAW,MAAM,IAAA;AAAA,EAC/D,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,gBAAgB,MAAM,IAAA;AAAA,EACpE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,YAAY,MAAM,IAAA;AAAA,EAChE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AAAA,EACjE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,eAAe,MAAM,IAAA;AAAA,EACnE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM,IAAA;AAAA,EAClE,KAAK,EAAE,cAAc,KAAK,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAA;AACnE,GAEaC,KAAkB,OAAO,OAAOD,EAAa,EAAE;AAAA,EAC1D,CAACE,GAAKT,OACJS,EAAIT,EAAG,MAAM,IAAIA,GACVS;AAAA,EAET,CAAA;AACF;AAEO,SAASC,GAAW3F,GAAyC;AAClE,SAAOyF,GAAgBzF,CAAM;AAC/B;AAKO,MAAM4F,KAAuB,IAAI;AAAA,EACtC,OAAO,OAAOJ,EAAa,EAAE,IAAI,CAACP,MAAO,CAACA,EAAG,QAAQA,EAAG,YAAY,CAAC;AACvE,GAEaY,KAAuB,IAAI;AAAA,EACtC,OAAO,OAAOL,EAAa,EAAE,IAAI,CAACP,MAAO,CAACA,EAAG,cAAcA,EAAG,MAAM,CAAC;AACvE;AClJA,SAASa,GAAStO,GAAoB;AACpC,QAAMsO,IAAWtO,EAAK,YAAY;AAElC,MAAI,OAAOsO,KAAa;AACtB,WAAOA;AAGT,QAAMC,IAAcvO,EAAK,QAAQ,YAAY;AAE7C,MAAI,OAAOuO,KAAgB;AACzB,WAAOA;AAGT,QAAMV,IAAUM,GAAWnO,EAAK,QAAQ,MAAM;AAE9C,MAAI,CAAC6N;AACH,UAAM,IAAI,MAAM,oBAAoB7N,EAAK,QAAQ,MAAM,EAAE;AAG3D,SAAO6N,EAAQ;AACjB;AAEO,SAASW,GAASzO,GAA8B;AACrD,MAAI0O,IAAO;AAEX,aAAWzO,KAAQD,EAAU;AAC3B,IAAA0O,KAAQH,GAAStO,CAAI;AAGvB,SAAOyO;AACT;AC7BO,SAASC,GAAQ3O,GAA8B;AACpD,SAAOyO,GAASzO,CAAS,IAAI+M,GAAO/M,CAAS;AAC/C;ACKO,SAAS4O,GACd7F,GACA8F,GACAC,GACS;AACT,SAAO;AAAA,IACL,SAAA/F;AAAA,IACA,MAAA8F;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;ACfO,SAASC,EAAUrO,GAAkBT,GAAoB;AAC9D,QAAM,CAACL,GAAGsK,GAAGC,CAAC,IAAIlK,EAAK,MAEjB4O,IAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,CAACjP,GAAGsK,GAAGC,CAAC,CAAC;AAAA,EAAA,GAG5B6E,IAAS9J,EAAUxE,EAAQ,KAAK,GAChCuO,IAAS7J,EAAI4J,GAAQH,CAAI;AAE/B,SAAO,IAAI,aAAa,CAACI,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACdO,SAASC,EAAWxO,GAAkByO,GAAsB;AACjE,QAAMC,IAAM;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAMD;AAAA,EAAA,GAGFnJ,IAAMhB,EAAQtE,CAAO,GACrBwF,IAAOhB,EAAUc,CAAG,GAEpBiJ,IAAS7J,EAAIc,GAAMkJ,CAAG;AAE5B,SAAO,IAAI,aAAa,CAACH,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,GAAGA,EAAO,KAAK,CAAC,CAAC,CAAC;AAC1E;ACbO,SAASI,GAAS3O,GAAkBkC,GAASC,GAAiB;AACnE,QAAMyM,IAAkC;AAAA,IACtCzM,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,IACpBC,EAAE,KAAK,CAAC,IAAID,EAAE,KAAK,CAAC;AAAA,EAAA;AAGtB,WAASrC,IAAI,GAAGA,IAAI,GAAGA;AACrB,IAAA+O,EAAM/O,CAAC,KAAK,KAAK,MAAM+O,EAAM/O,CAAC,CAAC;AAGjC,QAAMgP,IAAkB;AAAA,IACtB,SAAS3M,EAAE;AAAA,IACX,MAAM0M;AAAA,EAAA,GAGFE,IAAQT,EAAUrO,GAAS6O,CAAS;AAE1C,SAAOtM,EAAKuM,CAAK;AACnB;ACvBA,SAASC,EAAU7P,GAAmB;AACpC,UAASA,IAAI,IAAK,KAAK;AACzB;AAEO,SAASD,GAA+BM,GAAwB;AACrE,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM;AAAA,MACJwP,EAAUxP,EAAK,KAAK,CAAC,CAAC;AAAA,MACtBwP,EAAUxP,EAAK,KAAK,CAAC,CAAC;AAAA,MACtBwP,EAAUxP,EAAK,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EACxB;AAEJ;ACVO,SAASyP,GACdjH,GACAqG,GACY;AACZ,SAAO,EAAE,QAAArG,GAAQ,YAAAqG,EAAA;AACnB;ACSO,SAASa,EAAqBC,GAiBlB;AACjB,QAAM;AAAA,IACJ,OAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,MAAA3N;AAAA,IACA,OAAA4N;AAAA,IACA,QAAAC,IAAS,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB,OAAAC;AAAA,IACA,UAAAC;AAAA,EAAA,IACEN,GAEE,CAACO,GAAGC,GAAGC,CAAC,IAAIR,GACZzN,IAAO+N,IAAIC,IAAIC,IAAIP,GAEnBzN,IACJF,aAAgB,eACZA,IACAA,IACE,aAAa,KAAKA,CAAI,IACtB,IAAI,aAAaC,CAAI;AAE7B,MAAIC,EAAO,WAAWD;AACpB,UAAM,IAAI;AAAA,MACR,qCAAqCA,CAAI,SAASC,EAAO,MAAM;AAAA,IAAA;AAInE,SAAO;AAAA,IACL,MAAMA;AAAA,IACN,OAAAwN;AAAA,IACA,UAAAC;AAAA,IACA,OAAOC,KAASzN,GAAS,CAAC;AAAA,IAC1B,QAAA0N;AAAA,IACA,OAAAC;AAAA,IACA,UAAAC;AAAA,EAAA;AAEJ;AAEO,SAAS/O,GACdmP,GACA1Q,GACAsK,GACAC,GACArH,GACA;AACA,QAAM,CAACqN,GAAGC,GAAGC,CAAC,IAAIC,EAAI,OAChB,EAAE,UAAAR,MAAaQ;AAErB,WAASnG,IAAIiG,IAAIlG,KAAKmG,IAAIzQ,KAAKkQ,IAAWhN;AAC5C;ACnFO,SAASyN,GACdV,GACAW,GACAV,IAAW,GACX;AACA,QAAM1N,IAAOyN,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIC;AAE9C,SAAOH,EAAqB;AAAA,IAC1B,OAAAE;AAAA,IACA,UAAAC;AAAA,IACA,MAAM,IAAI,aAAa1N,CAAI,EAAE,KAAKoO,CAAK;AAAA,EAAA,CACxC;AACH;ACZO,SAASC,GACdZ,GACAa,GACAZ,IAAW,GACX;AACA,QAAM,CAACK,GAAGC,GAAGC,CAAC,IAAIR,GACZ1N,IAAO,IAAI,aAAagO,IAAIC,IAAIC,IAAIP,CAAQ;AAElD,MAAIvP,IAAI;AAER,WAAS4J,IAAI,GAAGA,IAAIgG,GAAGhG;AACrB,aAASD,IAAI,GAAGA,IAAIkG,GAAGlG;AACrB,eAAStK,IAAI,GAAGA,IAAIyQ,GAAGzQ;AACrB,iBAASkD,IAAI,GAAGA,IAAIgN,GAAUhN;AAC5B,UAAAX,EAAK5B,GAAG,IAAImQ,EAAG9Q,GAAGsK,GAAGC,GAAGrH,CAAC;AAMjC,SAAO6M,EAAqB;AAAA,IAC1B,OAAAE;AAAA,IACA,UAAAC;AAAA,IACA,MAAA3N;AAAA,EAAA,CACD;AACH;ACxBO,SAASwO,GAAiBC,GAAkB;AACjD,MAAIA,EAAO,WAAW;AACpB,UAAM,IAAI,MAAM,oBAAoB;AAGtC,QAAMR,IAAIQ,EAAO,CAAC,EAAE,MACdP,IAAIO,EAAO,CAAC,EAAE,MACdT,IAAIS,EAAO,QAEXzO,IAAO,IAAI,aAAagO,IAAIC,IAAIC,CAAC;AAEvC,MAAI9P,IAAI;AAER,WAAS4J,IAAI,GAAGA,IAAIgG,GAAGhG,KAAK;AAC1B,UAAMxH,IAAIiO,EAAOzG,CAAC;AAElB,QAAIxH,EAAE,SAASyN,KAAKzN,EAAE,SAAS0N;AAC7B,YAAM,IAAI,MAAM,sCAAsC;AAGxD,IAAAlO,EAAK,IAAIQ,EAAE,MAAMpC,CAAC,GAClBA,KAAKoC,EAAE,KAAK;AAAA,EACd;AAEA,SAAOgN,EAAqB;AAAA,IAC1B,OAAO,CAACQ,GAAGC,GAAGC,CAAC;AAAA,IACf,MAAAlO;AAAA,EAAA,CACD;AACH;AC5BO,SAAS0O,GAAKhB,GAAiCC,IAAW,GAAG;AAClE,SAAOS,GAAKV,GAAO,GAAGC,CAAQ;AAChC;ACFO,SAASgB,GAAMjB,GAAiCC,IAAW,GAAG;AACnE,QAAM1N,IAAOyN,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIC;AAE9C,SAAOH,EAAqB;AAAA,IAC1B,OAAAE;AAAA,IACA,UAAAC;AAAA,IACA,MAAM,IAAI,aAAa1N,CAAI;AAAA,EAAA,CAC5B;AACH;ACPA,SAAS2O,EAAWP,GAAuB;AAGzC,SAAO,OAAOA,EAAM,QAAQ,UAAU,EAAE,CAAC;AAC3C;AAEA,SAASQ,EAASC,GAAwB;AACxC,SAAOA,EAAK,MAAM,sBAAsB,KAAK,CAAA;AAC/C;AAEA,SAASC,GAAwBC,GAAoB;AACnD,UAAQ;AAAA,IACN,gBAAgBA,CAAU;AAAA,EAAA;AAI9B;AAEO,SAASC,GAAQC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAACzR,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO;AAEjB,MAAIgD,IAAI,GACJC,IAAI,GACJC,IAAI,GAEJS,IAAQ,GACRC,IAAO,GACPC,IAAQ,GAER0N,IAAa,MAEbI,IAAwB,CAAA;AAC5B,QAAMC,IAAuB,CAAA;AAE7B,MAAIC,IAAS,IACTC,IAA2B,CAAA,GAC3BC,IAAkB;AAEtB,aAAWV,KAAQK,GAAO;AACxB,QAAIL,EAAK,WAAW,gCAAgC;AAElD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,2BAA2B;AAEpD,MAAAE,IADeH,EAASC,CAAI,EACR,GAAG,EAAE,GAAG,QAAQ,SAAS,EAAE,KAAK;AAAA,aAC3CA,EAAK,WAAW,gBAAgB;AACzC,MAAArO,IAAImO,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAApO,IAAIkO,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,gBAAgB;AACzC,MAAAnO,IAAIiO,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aACvBA,EAAK,WAAW,mBAAmB;AAC5C,MAAA1N,IAAQwN,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,EAAK,WAAW,kBAAkB;AAC3C,MAAAzN,IAAOuN,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC1BA,EAAK,WAAW,mBAAmB;AAC5C,MAAAxN,IAAQsN,EAAWC,EAASC,CAAI,EAAE,CAAC,CAAC;AAAA,aAC3BA,MAAS,SAAS;AAC3B,MAAAQ,IAAS,IACTC,IAAiB,CAAA,GACjBC,IAAkB;AAClB;AAAA,IACF;AAEA,QAAIF,KAAUR,EAAK,WAAW,GAAG,GAAG;AAClC,MAAAS,EAAe,KAAKT,CAAI,GAEpBA,EAAK,SAAS,aAAa,MAC7BU,IAAkB;AAGpB;AAAA,IACF;AAEA,IAAIF,KAAUE,MACRJ,EAAY,WAAW,MACzBA,IAAc,CAAC,GAAGG,CAAc,IAGlCF,EAAS,KAAKR,EAASC,CAAI,CAAC;AAAA,EAEhC;AAIA,EAFa,WAAW,KAAKE,CAAU,KAGrCD,GAAwBC,CAAU;AAGpC,QAAMzQ,IAAU0F,EAAexD,GAAGC,GAAGC,GAAGS,GAAOC,GAAMC,CAAK,GAEpDmO,IAAKL,EAAY,UAAU,CAAC3R,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDiS,IAAKN,EAAY,UAAU,CAAC3R,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDkS,IAAKP,EAAY,UAAU,CAAC3R,MAAMA,EAAE,SAAS,SAAS,CAAC,GAEvDmS,IAAWR,EAAY,UAAU,CAAC3R,MAAMA,EAAE,SAAS,aAAa,CAAC;AAEvE,MAAIgS,IAAK,KAAKC,IAAK,KAAKC,IAAK,KAAKC,IAAW;AAC3C,UAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAMhR,IAAQyQ,EAAS,IAAI,CAACjP,OAAS;AAAA,IACnC,SAAS;AAAA,MACP,QAAQA,EAAIwP,CAAQ;AAAA,IAAA;AAAA,IAGtB,MAAM,IAAI,aAAa;AAAA,MACrBhB,EAAWxO,EAAIqP,CAAE,CAAC;AAAA,MAClBb,EAAWxO,EAAIsP,CAAE,CAAC;AAAA,MAClBd,EAAWxO,EAAIuP,CAAE,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA,EACD;AAEF,SAAO;AAAA,IACL,SAAApR;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEO,SAASiR,GAAMhS,GAAsBG,IAAY,GAAW;AACjE,QAAMqK,IAAI3E,GAAW7F,EAAU,OAAO,GAEhCsR,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,mBAAmB,GAC9BA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,sCAAsC,GACjDA,EAAM,KAAK,+BAA+B,GAE1CA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,kBAAkB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAEtDmR,EAAM,KAAK,kBAAkB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAEtDmR,EAAM,KAAK,kBAAkB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAEtDmR,EAAM,KAAK,qBAAqB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAEzDmR,EAAM,KAAK,oBAAoB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAExDmR,EAAM,KAAK,qBAAqB9G,EAAE,CAAC,EAAE,QAAQrK,CAAS,CAAC,EAAE,GAEzDmR,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,OAAO,GAClBA,EAAM,KAAK,kBAAkB,GAC7BA,EAAM,KAAK,wBAAwB,GACnCA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB,GAC/BA,EAAM,KAAK,oBAAoB;AAE/B,WAAS/Q,IAAI,GAAGA,IAAIP,EAAU,MAAM,QAAQO,KAAK;AAC/C,UAAMN,IAAOD,EAAU,MAAMO,CAAC;AAE9B,IAAA+Q,EAAM;AAAA,MACJ,GAAGrR,EAAK,QAAQ,MAAM,GAAGM,IAAI,CAAC,IACzBN,EAAK,QAAQ,MAAM,IACnBA,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC,IAC/BF,EAAK,KAAK,CAAC,EAAE,QAAQE,CAAS,CAAC;AAAA,IAAA;AAAA,EAExC;AAEA,SAAOmR,EAAM,KAAK;AAAA,CAAI;AACxB;ACrKA,SAASW,GAAYhB,GAAuB;AAC1C,SAAOA,EAAK,cAAc,WAAW,WAAW;AAClD;AAEA,SAASiB,GAAYjB,GAAuB;AAC1C,QAAMhG,IAAIgG,EAAK,KAAA,EAAO,YAAA;AACtB,SAAOhG,EAAE,WAAW,GAAG,KAAKA,EAAE,WAAW,GAAG;AAC9C;AAOO,SAASkH,GAAWd,GAAyB;AAClD,QAAMC,IAAQD,EAAK,MAAM;AAAA,CAAI,EAAE,IAAI,CAACzR,MAAMA,EAAE,MAAM;AAElD,MAAIwS,IAAS;AAGb,EAAAA;AAGA,QAAMC,IAAQ,OAAOf,EAAMc,GAAQ,CAAC,GAG9BE,IAAwB,CAAA;AAE9B,WAAS/R,IAAI,GAAGA,IAAI,GAAGA,KAAK;AAC1B,UAAMV,IAAIyR,EAAMc,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEjD,QAAIvS,EAAE,WAAW;AACf,YAAM,IAAI,MAAM,wBAAwB;AAG1C,IAAAyS,EAAY,KAAKzS,EAAE,CAAC,IAAIwS,GAAOxS,EAAE,CAAC,IAAIwS,GAAOxS,EAAE,CAAC,IAAIwS,CAAK;AAAA,EAC3D;AAEA,QAAM3R,IAAU+B,EAAc6P,CAAW,GAGnCC,IAAUjB,EAAMc,GAAQ,EAAE,MAAM,KAAK,GAGrCI,IAASlB,EAAMc,GAAQ,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAEtD,MAAIG,EAAQ,WAAWC,EAAO;AAC5B,UAAM,IAAI,MAAM,wBAAwB;AAI1C,EAAIP,GAAYX,EAAMc,CAAM,CAAC,KAC3BA;AAIF,MAAIK,IAAS;AACb,EAAAA,IAAS,CAACP,GAAYZ,EAAMc,CAAM,CAAC,GAEnCA;AAEA,QAAMrR,IAAgB,CAAA;AAEtB,MAAI2R,IAAe,GACfC,IAAYH,EAAO,CAAC;AAEL,EAACC,KAASzN,EAAQtE,CAAO;AAE5C,QAAMkS,IAAaJ,EAAO,OAAO,CAAC5P,GAAGC,MAAMD,IAAIC,GAAG,CAAC;AAEnD,WAAStC,IAAI,GAAGA,IAAIqS,GAAYrS,KAAK;AAGnC,UAAMsS,IAFSvB,EAAMc,GAAQ,EAAE,MAAM,KAAK,EAEpB,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM,GAEtCvD,IAAO4D,IACT,IAAI,aAAaI,CAAM,IACvB3D,EAAWxO,GAAS,IAAI,aAAamS,CAAM,CAAC;AAEhD,IAAA9R,EAAM,KAAK;AAAA,MACT,SAAS;AAAA,QACP,QAAQwR,EAAQG,CAAY;AAAA,MAAA;AAAA,MAE9B,MAAA7D;AAAA,IAAA,CACD,GAED8D,KAEIA,MAAc,KAAKD,IAAeF,EAAO,SAAS,MACpDE,KACAC,IAAYH,EAAOE,CAAY;AAAA,EAEnC;AAEA,SAAO;AAAA,IACL,SAAAhS;AAAA,IACA,OAAAK;AAAA,IACA,YAAYqR;AAAA,EAAA;AAEhB;AAEO,SAASU,GACd9S,GACA+S,GAKQ;AACR,QAAMC,IAAQD,GAAS,SAAS,6BAC1BV,IAAQU,GAAS,SAAS,GAC1BN,IAASM,GAAS,UAAU,IAE5BzB,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK0B,CAAK,GAChB1B,EAAM,KAAK,OAAOe,CAAK,CAAC;AAGxB,QAAM1P,IAAI3C,EAAU,QAAQ,MAAM;AAElC,EAAAsR,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC2O,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC2O,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAGpC,QAAMsQ,wBAAc,IAAA;AAEpB,aAAWhT,KAAQD,EAAU,OAAO;AAClC,UAAMyI,IAASxI,EAAK,QAAQ;AAE5B,IAAKgT,EAAQ,IAAIxK,CAAM,KACrBwK,EAAQ,IAAIxK,GAAQ,EAAE,GAGxBwK,EAAQ,IAAIxK,CAAM,EAAG,KAAKxI,CAAI;AAAA,EAChC;AAEA,QAAM8I,IAAU,CAAC,GAAGkK,EAAQ,MAAM,GAC5BlS,IAAQ,CAAC,GAAGkS,EAAQ,OAAA,CAAQ,EAAE,KAAA;AAEpC,EAAA3B,EAAM,KAAKvI,EAAQ,KAAK,GAAG,CAAC,GAC5BuI,EAAM,KAAKvI,EAAQ,IAAI,CAACtI,MAAMwS,EAAQ,IAAIxS,CAAC,EAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAE/D6Q,EAAM,KAAKmB,IAAS,WAAW,WAAW;AAE1C,aAAWxS,KAAQc,GAAO;AACxB,UAAM8R,IAASJ,IAASxS,EAAK,OAAO8O,EAAU/O,EAAU,SAASC,CAAI;AAErE,IAAAqR,EAAM,KAAK,GAAGuB,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,EAAE;AAAA,EACrD;AAEA,SAAOvB,EAAM,KAAK;AAAA,CAAI;AACxB;AC9IO,SAAS4B,GAAkB/Q,GAAgC;AAChE,QAAMzB,IAAU+B,EAAc;AAAA,IAC5B,GAAGN,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,IACd,GAAGA,EAAK,KAAK,CAAC;AAAA,EAAA,CACf,GAEKgR,IAAU,IAAI,IAAIhR,EAAK,MAAM,IAAI,CAACiR,MAAc,CAACA,EAAK,MAAMA,CAAI,CAAC,CAAC,GAElErS,IAAQoB,EAAK,MAAM,IAAI,CAAClC,MAAc;AAC1C,UAAMmT,IAAOD,EAAQ,IAAIlT,EAAK,SAAS;AAEvC,QAAI,CAACmT;AACH,YAAM,IAAI,MAAM,iBAAiBnT,EAAK,SAAS,GAAG;AAGpD,WAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQmT,EAAK,QAAQ,CAAC;AAAA,MAAA;AAAA,MAGxB,MAAMlE,EAAWxO,GAAS,IAAI,aAAaT,EAAK,QAAQ,CAAC;AAAA,IAAA;AAAA,EAE7D,CAAC;AAED,SAAO;AAAA,IACL,SAAAS;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEO,SAASsS,GAAgBrT,GAAsB;AACpD,QAAM2C,IAAI3C,EAAU,QAAQ,MAAM,MAI5BsT,IAFU,CAAC,GAAG,IAAI,IAAItT,EAAU,MAAM,IAAI,CAACS,MAAMA,EAAE,QAAQ,MAAM,CAAC,CAAC,EAEnD,IAAI,CAACgI,OAAY;AAAA,IACrC,MAAMA;AAAA,IACN,SAAS,CAACA,CAAM;AAAA,EAAA,EAChB;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,CAAC9F,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,IAAA;AAAA,IAGnB,OAAA2Q;AAAA,IAEA,OAAOtT,EAAU,MAAM,IAAI,CAACC,OAAU;AAAA,MACpC,WAAWA,EAAK,QAAQ;AAAA,MAExB,UAAU,MAAM,KAAK8O,EAAU/O,EAAU,SAASC,CAAI,CAAC;AAAA,IAAA,EACvD;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAEV;AC3EA,SAASsT,GAAYjC,GAAiBkC,GAAyB;AAC7D,QAAM/G,IAAM6E,EAAM,UAAU,CAACL,MAASA,EAAK,KAAA,EAAO,YAAA,MAAkBuC,CAAO;AAE3E,MAAI/G,MAAQ;AACV,UAAM,IAAI,MAAM,WAAW+G,CAAO,EAAE;AAGtC,SAAO/G;AACT;AAIO,SAASgH,GAAQpC,GAAyB;AAC/C,QAAMC,IAAQD,EACX,MAAM;AAAA,CAAI,EACV,IAAI,CAACzR,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,GAEX8T,IAAWH,GAAYjC,GAAO,SAAS,GAEvC5Q,IAAU+B,EAAc;AAAA,IAC5B,GAAG6O,EAAMoC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGpC,EAAMoC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,IAC9C,GAAGpC,EAAMoC,IAAW,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM;AAAA,EAAA,CAC/C,GAEKC,IAAaJ,GAAYjC,GAAO,WAAW,GAE3C,CAACsC,CAAM,IAAItC,EAAMqC,IAAa,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,GAExD5S,IAAgB,CAAA;AAEtB,WAASR,IAAI,GAAGA,IAAIqT,GAAQrT,KAAK;AAC/B,UAAMsT,IAASvC,EAAMqC,IAAa,IAAIpT,CAAC,EAAE,MAAM,KAAK,GAE9CkI,IAASoL,EAAO,CAAC,GAEjBjU,IAAI,OAAOiU,EAAO,CAAC,CAAC,GACpB3J,IAAI,OAAO2J,EAAO,CAAC,CAAC,GACpB1J,IAAI,OAAO0J,EAAO,CAAC,CAAC,GAEpBhF,IAAOK,EAAWxO,GAAS,IAAI,aAAa,CAACd,GAAGsK,GAAGC,CAAC,CAAC,CAAC;AAE5D,IAAApJ,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAA0H,EAAA;AAAA,MACX,MAAAoG;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAAnO;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEA,SAAS+S,EAAUjU,GAAqB;AACtC,SAAO,GAAGA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChC;AAEA,SAASkU,GAAcrT,GAAyC;AAC9D,QAAMiC,IAAIjC,EAAQ,MAAM;AAExB,SAAO;AAAA,IACLoT,EAAU,CAACnR,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5BmR,EAAU,CAACnR,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,IAC5BmR,EAAU,CAACnR,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAAA,EAAA;AAEhC;AAEO,SAASqR,GAAMhU,GAA8B;AAClD,QAAMsR,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,SAAS,GACpBA,EAAM,KAAK,SAAS;AAEpB,QAAM2C,IAAeF,GAAc/T,EAAU,OAAO;AACpD,EAAAsR,EAAM,KAAK,GAAG2C,CAAY,GAC1B3C,EAAM,KAAK,WAAW,GACtBA,EAAM,KAAK,GAAGtR,EAAU,MAAM,MAAM,IAAI;AAExC,aAAWC,KAAQD,EAAU,OAAO;AAClC,UAAM8C,IAAIiM,EAAU/O,EAAU,SAASC,CAAI;AAC3C,IAAAqR,EAAM,KAAK,GAAGrR,EAAK,QAAQ,MAAM,IAAI6C,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE;AAAA,EAC7D;AAEA,SAAOwO,EAAM,KAAK;AAAA,CAAI;AACxB;ACrFA,SAAS4C,GAAYC,GAAkC;AACrD,QAAMC,IAAwB,CAAA,GACxBC,IAAU;AAEhB,aAAWC,KAASH,EAAQ,SAASE,CAAO,GAAG;AAC7C,QAAI7D,IAAQ8D,EAAM,CAAC;AACnB,IAAI9D,EAAM,WAAW,GAAG,UAAWA,EAAM,MAAM,GAAG,EAAE,IACpD4D,EAAKE,EAAM,CAAC,CAAC,IAAI9D;AAAA,EACnB;AAEA,SAAO4D;AACT;AAEA,SAASG,GAAaH,GAAuB;AAC3C,MAAI,CAACA,EAAK;AACR,UAAM,IAAI,MAAM,mCAAmC;AAGrD,QAAMvU,IAAIuU,EAAK,QAAQ,MAAM,KAAK,EAAE,IAAI,MAAM;AAC9C,MAAIvU,EAAE,WAAW,EAAG,OAAM,IAAI,MAAM,iBAAiB;AAErD,SAAO4C,EAAc,CAAC5C,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,CAAC;AAC7E;AAEO,SAAS2U,GAAQnD,GAAc;AACpC,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM;AAAA,CAAI,GAE9B9P,IAAI,OAAO+P,EAAM,CAAC,CAAC,GACnB6C,IAAU7C,EAAM,CAAC,GAEjB8C,IAAOF,GAAYC,CAAO,GAC1BzT,IAAU6T,GAAaH,CAAI,GAE3BrT,IAAgB,CAAA;AAEtB,WAASR,IAAI,GAAGA,IAAIgB,GAAGhB,KAAK;AAC1B,UAAM,CAACkI,GAAQ7I,GAAGsK,GAAGC,CAAC,IAAImH,EAAM,IAAI/Q,CAAC,EAAE,MAAM,KAAK,GAE5C4O,IAAO,IAAI,aAAa,CAAC,CAACvP,GAAG,CAACsK,GAAG,CAACC,CAAC,CAAC,GAEpC0E,IAAOK,EAAWxO,GAASyO,CAAI;AAErC,IAAApO,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAA0H,EAAA;AAAA,MACX,MAAAoG;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO,EAAE,SAAAnO,GAAS,OAAAK,EAAA;AACpB;AAEA,SAASgT,GAAcrT,GAA0B;AAC/C,QAAMiC,IAAIjC,EAAQ,MAAM;AAGxB,SAAO,GAAGiC,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC;AAChF;AAEO,SAAS8R,GAAMzU,GAA8B;AAClD,QAAMsR,IAAkB,CAAA,GAElBvQ,IAAQf,EAAU;AACxB,EAAAsR,EAAM,KAAK,OAAOvQ,EAAM,MAAM,CAAC;AAE/B,QAAM2T,IAAaX,GAAc/T,EAAU,OAAO;AAElD,EAAAsR,EAAM,KAAK,YAAYoD,CAAU,kCAAkC;AAEnE,aAAWzU,KAAQc,GAAO;AACxB,UAAMoO,IAAOJ,EAAU/O,EAAU,SAASC,CAAI;AAE9C,IAAAqR,EAAM,KAAK,GAAGrR,EAAK,QAAQ,MAAM,IAAIkP,EAAK,CAAC,CAAC,IAAIA,EAAK,CAAC,CAAC,IAAIA,EAAK,CAAC,CAAC,EAAE;AAAA,EACtE;AAEA,SAAOmC,EAAM,KAAK;AAAA,CAAI;AACxB;AC7EO,SAASqD,GAAaxS,GAAsB;AACjD,QAAMzB,IAAU+B,EAAc;AAAA,IAC5B,GAAGN,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,IACpC,GAAGA,EAAK,WAAW,gBAAgB,CAAC;AAAA,EAAA,CACrC,GAEKoG,IAAYpG,EAAK,WAAW,0BAC5B4G,IAAU5G,EAAK,WAAW,kBAE1BpB,IAAQwH,EAAU,IAAI,CAACqM,GAAoBrU,OAAe;AAAA,IAC9D,SAAS;AAAA,MACP,QAAQwI,EAAQxI,CAAC;AAAA,IAAA;AAAA,IAGnB,MAAM2O,EAAWxO,GAAS,IAAI,aAAakU,CAAQ,CAAC;AAAA,EAAA,EACpD;AAEF,SAAO;AAAA,IACL,SAAAlU;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEO,SAAS8T,GAAW7U,GAAsB;AAC/C,QAAM2C,IAAI3C,EAAU,QAAQ,MAAM,MAE5B8U,IAAmB9U,EAAU,MAAM,IAAI,CAACC,MAASA,EAAK,QAAQ,MAAM,GAEpEqN,IAAW,CAAC,GAAG,IAAI,IAAIwH,CAAgB,CAAC,EAAE,KAAA;AAEhD,SAAO;AAAA,IACL,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,CAACnS,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,QACjB,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,MAAA;AAAA,MAGnB,kBAAAmS;AAAA,MAEA,0BAA0B9U,EAAU,MAAM;AAAA,QAAI,CAACC,MAC7C,MAAM,KAAK8O,EAAU/O,EAAU,SAASC,CAAI,CAAC;AAAA,MAAA;AAAA,MAG/C,iBAAiB,CAAC,GAAG,GAAG,CAAC;AAAA,MAEzB,QAAQD,EAAU,MAAM;AAAA,MAExB,WAAWsN,EAAS;AAAA,MAEpB,UAAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AC3DO,SAASyH,EACdvE,GACAwE,GACAC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAU,CAACjS,MAAegS,IAAUhS,CAAC,KAAKA,GAE1CkS,IAAWD,EAAQJ,CAAI,GACvBM,IAASF,EAAQH,CAAE;AAEzB,SAAII,MAAaC,IAAe9E,IAEZA,IAAQ0E,EAAYG,CAAQ,IAC3BH,EAAYI,CAAM;AACzC;AAEO,SAASC,GACdC,GACAR,GACAC,GACAC,GACAC,GACU;AACV,SAAOK,EAAI,IAAI,CAAC3V,MAAMkV,EAAmBlV,GAAGmV,GAAMC,GAAIC,GAAaC,CAAO,CAAC;AAC7E;ACdA,MAAMM,IAAiD;AAAA,EACrD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AACN,GAEMC,IAA6C;AAAA,EACjD,GAAG;AAAA,EACH,IAAI;AACN,GAEaC,IAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQlF,GAAewE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEF,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF;ACxCA,SAASE,EAAKvV,GAAa;AACzB,SAAOA,EAAI,SAAS,IAAIA,EAAI,MAAM,GAAG,CAAC,IAAIA,EAAI,SAAS,CAAC;AAC1D;AAEA,SAASwV,EAAYjW,GAAW;AAC9B,SAAOA,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;AAChC;AAEO,SAASkW,GAAQzE,GAAyB;AAC/C,QAAMC,IAAQD,EAAK,MAAM,OAAO,EAAE,OAAO,CAACpG,MAAMA,EAAE,SAAS,CAAC;AAE5D,MAAImH,IAAS;AAIb,QAAM2D,IAFQzE,EAAMc,GAAQ,EAEJ,MAAM,8BAA8B,GACtD4D,IAAOD,IAAY,OAAOA,EAAU,CAAC,CAAC,IAAI,QAE1CnC,IAAS,OAAOtC,EAAMc,GAAQ,CAAC;AAErC,MAAI,CAAC,OAAO,SAASwB,CAAM;AACzB,UAAM,IAAI,MAAM,wBAAwB;AAQ1C,QAAMqC,IAAgB,CAAA;AAEtB,WAAS,IAAI,GAAG,IAAIrC,GAAQ,KAAK;AAC/B,UAAM3C,IAAOK,EAAMc,GAAQ,GAErBxS,IAAI,OAAOqR,EAAK,MAAM,IAAI,EAAE,CAAC,GAC7B/G,IAAI,OAAO+G,EAAK,MAAM,IAAI,EAAE,CAAC,GAC7B9G,IAAI,OAAO8G,EAAK,MAAM,IAAI,EAAE,CAAC;AAInC,QAAIxI,IAFWwI,EAAK,MAAM,IAAI,EAAE,EAAE,KAAA,EAEZ,QAAQ,UAAU,EAAE;AAC1C,IAAAxI,IAASA,EAAO,OAAO,CAAC,EAAE,gBAAgBA,EAAO,MAAM,CAAC,EAAE,YAAA,GAE1DwN,EAAM,KAAK;AAAA,MACT,QAAAxN;AAAA,MACA,MAAM,IAAI;AAAA,QACRkN,EAAiB,aAAa,CAAC/V,GAAGsK,GAAGC,CAAC,GAAG,MAAM,UAAU;AAAA,MAAA;AAAA,IAC3D,CACD;AAAA,EACH;AAEA,MAAIzJ,IAAU;AAEd,QAAMwV,IAAU5E,EAAMc,CAAM;AAE5B,MAAI8D,GAAS;AACX,UAAMC,IAAOD,EAAQ,KAAA,EAAO,MAAM,KAAK,EAAE,IAAI,MAAM,GAE7C/Q,IAASwQ,EAAiB;AAAA,MAC9B;AAAA,QACEQ,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,QACXA,EAAK,CAAC,KAAK;AAAA,MAAA;AAAA,MAEb;AAAA,MACA;AAAA,IAAA,GAGIC,IACJjR,EAAO,CAAC,MAAM,KACdA,EAAO,CAAC,MAAM,KACdA,EAAO,CAAC,MAAM,KACdA,EAAO,CAAC,MAAM,KACdA,EAAO,CAAC,MAAM,KACdA,EAAO,CAAC,MAAM;AAEhB,IAAAzE,IACI+B,EADM2T,IACQjR,IACA,CAACA,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAGA,EAAO,CAAC,CAAC,CAD1B;AAAA,EAE1B;AAEA,QAAMpE,IAAgBkV,EAAM,IAAI,CAACI,OAAU;AAAA,IACzC,SAAS,EAAE,QAAQA,EAAK,OAAA;AAAA,IACxB,MAAM3V,IACFwO,EAAWxO,GAAS2V,EAAK,IAAI,IAC7B,IAAI,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAAA,EACpC;AAEF,SAAO;AAAA,IACL,SAAA3V;AAAA,IACA,OAAAK;AAAA,IACA,MAAAiV;AAAA,EAAA;AAEJ;AAEO,SAASM,GACdtW,GACA+S,GAIQ;AACR,QAAMC,IACJD,GAAS,UACRA,GAAS,SAAS,SACf,0BAA0BA,EAAQ,IAAI,KACtC,8BAEAzB,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK0B,CAAK,GAChB1B,EAAM,KAAK,OAAOtR,EAAU,MAAM,MAAM,CAAC;AAEzC,WAASO,IAAI,GAAGA,IAAIP,EAAU,MAAM,QAAQO,KAAK;AAC/C,UAAMN,IAAOD,EAAU,MAAMO,CAAC,GAExB4O,IAAOJ,EAAU/O,EAAU,SAASC,CAAI,GAExC,CAACL,GAAGsK,GAAGC,CAAC,IAAIwL,EAAiB;AAAA,MACjC,MAAM,KAAKxG,CAAI;AAAA,MACf;AAAA,MACA;AAAA,IAAA;AAGF,IAAAmC,EAAM;AAAA,MACJsE,EAAK,GAAG,IACNA,EAAK,KAAK,IACVA,EAAK3V,EAAK,QAAQ,MAAM,IACxB2V,EAAK,OAAOrV,IAAI,CAAC,CAAC,IAClBsV,EAAYjW,CAAC,IACbiW,EAAY3L,CAAC,IACb2L,EAAY1L,CAAC;AAAA,IAAA;AAAA,EAEnB;AAEA,QAAMxH,IAAI3C,EAAU,QAAQ,MAAM,MAE5B,CAAC4C,GAAGC,GAAGC,CAAC,IAAI6S,EAAiB;AAAA,IACjC,CAAChT,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC;AAAA,IACjB;AAAA,IACA;AAAA,EAAA;AAGF,SAAA2O,EAAM,KAAK,CAAC1O,GAAGC,GAAGC,CAAC,EAAE,IAAI,CAACjD,MAAMA,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAEhDyR,EAAM,KAAK;AAAA,CAAI;AACxB;AChKA,MAAMiF,IAAkB;AAExB,SAASC,GAAYvF,GAAc;AACjC,QAAMrO,IAAI,OAAOqO,EAAK,MAAM,GAAG,EAAE,CAAC,GAC5BpO,IAAI,OAAOoO,EAAK,MAAM,IAAI,EAAE,CAAC,GAC7BnO,IAAI,OAAOmO,EAAK,MAAM,IAAI,EAAE,CAAC,GAE7B1N,IAAQ,OAAO0N,EAAK,MAAM,IAAI,EAAE,CAAC,GACjCzN,IAAO,OAAOyN,EAAK,MAAM,IAAI,EAAE,CAAC,GAChCxN,IAAQ,OAAOwN,EAAK,MAAM,IAAI,EAAE,CAAC;AAEvC,SAAO,EAAE,GAAArO,GAAG,GAAAC,GAAG,GAAAC,GAAG,OAAAS,GAAO,MAAAC,GAAM,OAAAC,EAAA;AACjC;AAEA,SAASgT,GACP7T,GACAC,GACAC,GACA4T,GACAC,GACAC,GACS;AAET,MAAIhU,KAAK,QAAQC,KAAK,QAAQC,KAAK,KAAM,QAAO;AAGhD,QAAM+T,IAAS;AAOf,SALI,EAAAjU,IAAI8T,IAAUG,KACdhU,IAAI8T,IAAUE,KACd/T,IAAI8T,IAAUC,KAGdjU,MAAM,KAAKC,MAAM,KAAKC,MAAM;AAGlC;AAEO,SAASgU,GAAQzF,GAAyB;AAC/C,QAAMC,IAAQD,EAAK,MAAM,OAAO;AAEhC,MAAI0F,IAOO;AASX,QAAMd,IAAsB,CAAA;AAE5B,MAAIe,IAAO,OACPC,IAAO,OACPC,IAAO,OAEPC,IAAO,QACPC,IAAO,QACPC,IAAO;AAEX,aAAWpG,KAAQK,GAAO;AACxB,QAAIL,EAAK,WAAW,QAAQ,GAAG;AAC7B,MAAA8F,IAAUP,GAAYvF,CAAI;AAC1B;AAAA,IACF;AAEA,QAAI,CAACA,EAAK,WAAW,QAAQ,KAAK,CAACA,EAAK,WAAW,QAAQ;AACzD;AAGF,UAAMrR,IAAI,OAAOqR,EAAK,MAAM,IAAI,EAAE,CAAC,GAC7B/G,IAAI,OAAO+G,EAAK,MAAM,IAAI,EAAE,CAAC,GAC7B9G,IAAI,OAAO8G,EAAK,MAAM,IAAI,EAAE,CAAC;AAEnC,QAAIxI,IAASwI,EAAK,MAAM,IAAI,EAAE,EAAE,KAAA;AAEhC,IAAKxI,MACHA,IAASwI,EAAK,MAAM,IAAI,EAAE,EAAE,QAAQ,UAAU,EAAE,EAAE,KAAA,GAClDxI,IAASA,EAAO,OAAO,CAAC,EAAE,gBAAgBA,EAAO,MAAM,CAAC,EAAE,YAAA,IAG5DwN,EAAM,KAAK,EAAE,QAAAxN,GAAQ,GAAA7I,GAAG,GAAAsK,GAAG,GAAAC,GAAG,GAE9B6M,IAAO,KAAK,IAAIA,GAAMpX,CAAC,GACvBqX,IAAO,KAAK,IAAIA,GAAM/M,CAAC,GACvBgN,IAAO,KAAK,IAAIA,GAAM/M,CAAC,GAEvBgN,IAAO,KAAK,IAAIA,GAAMvX,CAAC,GACvBwX,IAAO,KAAK,IAAIA,GAAMlN,CAAC,GACvBmN,IAAO,KAAK,IAAIA,GAAMlN,CAAC;AAAA,EACzB;AAEA,MAAI8L,EAAM,WAAW;AACnB,UAAM,IAAI,MAAM,+BAA+B;AAGjD,QAAMS,IAAUS,IAAOH,GACjBL,IAAUS,IAAOH,GACjBL,IAAUS,IAAOH;AAEvB,MAAIxW,IAAU+B,EAAc,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAEnD6U,IAAUN,IAAOT,GACjBgB,IAAUN,IAAOV,GACjBiB,IAAUN,IAAOX;AAMrB,MAHEQ,MAAY,QACZN,GAAaM,EAAQ,GAAGA,EAAQ,GAAGA,EAAQ,GAAGL,GAASC,GAASC,CAAO;AAGvE,IAAAlW,IAAU0F;AAAA,MACR2Q,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,IAAA,GAGVO,IAAU,GACVC,IAAU,GACVC,IAAU;AAAA,OACL;AACL,UAAM5U,IAAI,KAAK,IAAI8T,IAAU,IAAIH,GAAiB,CAAG,GAC/C1T,IAAI,KAAK,IAAI8T,IAAU,IAAIJ,GAAiB,CAAG,GAC/CzT,IAAI,KAAK,IAAI8T,IAAU,IAAIL,GAAiB,CAAG;AAErD,IAAA7V,IAAU+B,EAAc,CAACG,GAAG,GAAG,GAAG,GAAGC,GAAG,GAAG,GAAG,GAAGC,CAAC,CAAC;AAAA,EACrD;AAEA,QAAM/B,IAAgBkV,EAAM,IAAI,CAAC,EAAE,QAAAxN,GAAQ,GAAA7I,GAAG,GAAAsK,GAAG,GAAAC,SAAS;AAAA,IACxD,SAAS,EAAE,QAAA1B,EAAA;AAAA,IACX,MAAMyG;AAAA,MACJxO;AAAA,MACA,IAAI,aAAa,CAACd,IAAI0X,GAASpN,IAAIqN,GAASpN,IAAIqN,CAAO,CAAC;AAAA,IAAA;AAAA,EAC1D,EACA;AAEF,SAAO;AAAA,IACL,SAAA9W;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEO,SAAS0W,GACdzX,GACA+S,GAGQ;AACR,QAAMC,IAAQD,GAAS,SAAS,6BAE1BzB,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,aAAa0B,CAAK,EAAE;AAE/B,MAAI7R,IAAQ;AAEZ,aAAWlB,KAAQD,EAAU,OAAO;AAClC,UAAM8C,IAAIiM,EAAU/O,EAAU,SAASC,CAAI,GAErCwI,IAASxI,EAAK,QAAQ;AAE5B,IAAAqR,EAAM;AAAA,MACJ;AAAA,QACE;AAAA,QACAnQ,EAAM,SAAA,EAAW,SAAS,CAAC;AAAA,QAC3B;AAAA,QACAsH,EAAO,OAAO,CAAC;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA3F,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;AAAA,QAC1BA,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;AAAA,QAC1BA,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA2F,EAAO,SAAS,CAAC;AAAA,MAAA,EACjB,KAAK,EAAE;AAAA,IAAA,GAGXtH;AAAA,EACF;AAEA,SAAAmQ,EAAM,KAAK,KAAK,GAETA,EAAM,KAAK;AAAA,CAAI;AACxB;AC/LO,SAASoG,GAAOrG,GAAyB;AAC9C,QAAMC,IAAQD,EAAK,MAAM;AAAA,CAAI,EAAE,IAAI,CAACzR,MAAMA,EAAE,MAAM;AAElD,MAAI+X,IAA0B,CAAA;AAC9B,QAAMC,IAAsB,CAAA;AAG5B,WAASrX,IAAI,GAAGA,IAAI+Q,EAAM,QAAQ/Q,KAAK;AACrC,UAAM0Q,IAAOK,EAAM/Q,CAAC;AAEpB,QAAI,oBAAoB,KAAK0Q,CAAI,GAAG;AAClC,eAASxF,IAAI,GAAGA,KAAK,GAAGA;AACtB,QAAAkM,EAAY,KAAKrG,EAAM/Q,IAAIkL,CAAC,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC;AAGxD;AAAA,IACF;AAAA,EACF;AAEA,MAAIkM,EAAY,WAAW;AACzB,UAAM,IAAI,MAAM,iCAAiC;AAGnD,QAAMjX,IAAU+B,EAAc;AAAA,IAC5B,GAAGkV,EAAY,CAAC;AAAA,IAChB,GAAGA,EAAY,CAAC;AAAA,IAChB,GAAGA,EAAY,CAAC;AAAA,EAAA,CACjB;AAGD,MAAIE,IAAY,YACZC,IAAgB;AAEpB,aAAW7G,KAAQK,GAAO;AACxB,QAAI,qBAAqB,KAAKL,CAAI,GAAG;AACnC,MAAA6G,IAAgB,IAMhBD,IAJc5G,EAAK;AAAA,QACjB;AAAA,MAAA,IAGkB,CAAC,GAAG,YAAA,KAAiB;AAEzC;AAAA,IACF;AAEA,QAAI,CAAC6G,EAAe;AAEpB,UAAMC,IAAQ9G,EAAK,MAAM,KAAK;AAE9B,QACE8G,EAAM,SAAS,KACf,CAAC,YAAY,KAAKA,EAAM,CAAC,CAAC,KAC1BA,EAAM,MAAM,GAAG,CAAC,EAAE,KAAK,CAACnY,MAAM,OAAO,MAAM,CAACA,CAAC,CAAC;AAE9C;AAGF,IAAAgY,EAAU,KAAK3G,CAAI;AAAA,EACrB;AAEA,MAAI2G,EAAU,WAAW;AACvB,UAAM,IAAI,MAAM,kCAAkC;AAGpD,QAAMI,IAAYH,MAAc,WAE1B9W,IAAgB,CAAA;AAEtB,aAAWkQ,KAAQ2G,GAAW;AAC5B,UAAM,CAACnP,GAAQ7I,GAAGsK,GAAGC,CAAC,IAAI8G,EAAK,MAAM,KAAK;AAE1C,QAAIpC;AAEJ,IAAImJ,IACFnJ,IAAO,IAAI,aAAa,CAAC,CAACjP,GAAG,CAACsK,GAAG,CAACC,CAAC,CAAC,IAIpC0E,IAAOK,EAAWxO,GAAS,IAAI,aAAa,CAAC,CAACd,GAAG,CAACsK,GAAG,CAACC,CAAC,CAAC,CAAC,GAG3DpJ,EAAM,KAAK;AAAA,MACT,SAAS,EAAE,QAAA0H,EAAA;AAAA,MACX,MAAAoG;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAAnO;AAAA,IACA,OAAAK;AAAA,EAAA;AAEJ;AAEO,SAASkX,GAAKjY,GAA8B;AACjD,QAAMsR,IAAkB,CAAA;AAExB,EAAAA,EAAM,KAAK,SAAS,GACpBA,EAAM,KAAK,GAAG,GAEdA,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,0BAA0B;AAErC,QAAM3O,IAAI3C,EAAU,QAAQ,MAAM;AAElC,EAAAsR,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC2O,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GACpC2O,EAAM,KAAK,GAAG3O,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,EAAE,GAEpC2O,EAAM,KAAK,EAAE,GAEbA,EAAM,KAAK,0BAA0B;AAErC,aAAWrR,KAAQD,EAAU,OAAO;AAClC,UAAM6S,IAAS5S,EAAK;AAEpB,IAAAqR,EAAM;AAAA,MACJ,GAAGrR,EAAK,QAAQ,MAAM,IAAS4S,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,CAAC;AAAA,IAAA;AAAA,EAEtE;AAEA,SAAOvB,EAAM,KAAK;AAAA,CAAI;AACxB;AChHO,SAAS4G,GAAOlY,GAAsB;AAC3C,SAAO;AAAA,IACL,SAASA,EAAU,QAAQ,MAAM;AAAA,IACjC,OAAOA,EAAU,MAAM,IAAI,CAACS,OAAO;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,MAAM,KAAKA,EAAE,IAAI;AAAA,IAAA,EACvB;AAAA,EAAA;AAEN;AAyBO,SAAS0X,GAAShW,GAAsB;AAC7C,SAAO;AAAA,IACL,SAASM,EAAcN,EAAK,OAAO;AAAA,IACnC,OAAOA,EAAK,MAAM,IAAI,CAAC1B,OAAY;AAAA,MACjC,SAASA,EAAE;AAAA,MACX,MAAM,IAAI,aAAaA,EAAE,IAAI;AAAA,IAAA,EAC7B;AAAA,EAAA;AAEN;AC5DA,MAAM2X,IAAiD;AAAA,EACrD,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AACd,GAEMC,KAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAChB,GAEaC,KAAmB;AAAA,EAC9B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQ7H,GAAewE,GAA4BC,GAA0B;AAC3E,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAmD;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACE7C,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAmD;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF,GCxCME,KAA+C;AAAA,EACnD,KAAK;AAAA,EACL,KAAK,KAAK,KAAK;AAAA,EACf,MAAM,KAAK,KAAK;AAClB,GAEMC,KAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GAEaC,KAAkB;AAAA,EAC7B,aAAaF;AAAA,EACb,SAASC;AAAA,EAET,QAAQhI,GAAewE,GAA2BC,GAAyB;AACzE,WAAOF;AAAA,MACLvE;AAAA,MACAwE;AAAA,MACAC;AAAA,MACAsD;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aACEhD,GACAR,GACAC,GACA;AACA,WAAOM;AAAA,MACLC;AAAA,MACAR;AAAA,MACAC;AAAA,MACAsD;AAAA,MACAC;AAAA,IAAA;AAAA,EAEJ;AACF;"}
|