@zephyr3d/scene 0.9.3 → 0.9.4
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/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/app/engine.js +119 -71
- package/dist/app/engine.js.map +1 -1
- package/dist/asset/assetmanager.js +296 -244
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/model.js +57 -57
- package/dist/asset/model.js.map +1 -1
- package/dist/index.d.ts +684 -33
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +123 -108
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +29 -17
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +1 -0
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +86 -87
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +234 -228
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +143 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +1275 -1091
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/serialization/manager.js +321 -277
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +2 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +2 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +2 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font_asset.js","sources":["../../../src/text/font/font_asset.ts"],"sourcesContent":["import { SFNTReader } from './sfnt_reader';\r\nimport type { FontMetrics, GlyphContour, GlyphData, GlyphPoint } from './types';\r\n\r\nexport type FontAssetFetchOptions = {\r\n pageSize?: number;\r\n glyphSize?: number;\r\n};\r\n\r\nexport type FontAssetMSDFAtlasSettings = Readonly<{\r\n pageSize: number;\r\n glyphSize: number;\r\n}>;\r\n\r\ntype TableRecord = {\r\n offset: number;\r\n length: number;\r\n};\r\n\r\ntype GlyphHeader = {\r\n numberOfContours: number;\r\n xMin: number;\r\n yMin: number;\r\n xMax: number;\r\n yMax: number;\r\n};\r\n\r\ntype CompositeComponent = {\r\n glyphIndex: number;\r\n dx: number;\r\n dy: number;\r\n xx: number;\r\n xy: number;\r\n yx: number;\r\n yy: number;\r\n};\r\n\r\ntype CoverageTable =\r\n | { format: 1; glyphs: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; startIndex: number }[] };\r\n\r\ntype ClassDefTable =\r\n | { format: 1; startGlyphId: number; classes: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; classId: number }[] };\r\n\r\ntype GPOSPairSubtable =\r\n | {\r\n kind: 'format1';\r\n coverage: CoverageTable;\r\n pairs: Map<number, Map<number, PairAdjustment>>;\r\n }\r\n | {\r\n kind: 'format2';\r\n coverage: CoverageTable;\r\n classDef1: ClassDefTable;\r\n classDef2: ClassDefTable;\r\n class1Count: number;\r\n class2Count: number;\r\n values: PairAdjustment[];\r\n };\r\n\r\n/**\r\n * Minimal horizontal pair adjustment extracted from GPOS.\r\n *\r\n * @public\r\n */\r\nexport type PairAdjustment = {\r\n firstXPlacement: number;\r\n firstXAdvance: number;\r\n secondXPlacement: number;\r\n secondXAdvance: number;\r\n};\r\n\r\nconst ARG_1_AND_2_ARE_WORDS = 1 << 0;\r\nconst ARGS_ARE_XY_VALUES = 1 << 1;\r\nconst WE_HAVE_A_SCALE = 1 << 3;\r\nconst MORE_COMPONENTS = 1 << 5;\r\nconst WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\r\nconst WE_HAVE_A_TWO_BY_TWO = 1 << 7;\r\nconst DEFAULT_MSDF_ATLAS_PAGE_SIZE = 1024;\r\nconst DEFAULT_MSDF_GLYPH_SIZE = 32;\r\n\r\n/**\r\n * Minimal runtime font asset for TrueType outlines.\r\n *\r\n * @public\r\n */\r\nexport class FontAsset {\r\n private readonly _reader: SFNTReader;\r\n private readonly _tables: Map<string, TableRecord>;\r\n private readonly _glyphOffsets: Uint32Array<ArrayBuffer>;\r\n private readonly _advanceWidths: Uint16Array<ArrayBuffer>;\r\n private readonly _leftSideBearings: Int16Array<ArrayBuffer>;\r\n private readonly _glyphCache: Map<number, GlyphData | null>;\r\n private readonly _cmapFormat4: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _cmapFormat12: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _kernPairs: Map<number, number>;\r\n private readonly _gposPairs: GPOSPairSubtable[];\r\n private readonly _metrics: FontMetrics;\r\n private readonly _numberOfHMetrics: number;\r\n private readonly _msdfAtlasSettings: FontAssetMSDFAtlasSettings;\r\n private constructor(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n this._reader = new SFNTReader(buffer);\r\n this._tables = parseTableDirectory(this._reader);\r\n const head = this.requireTable('head');\r\n const maxp = this.requireTable('maxp');\r\n const hhea = this.requireTable('hhea');\r\n const hmtx = this.requireTable('hmtx');\r\n const loca = this.requireTable('loca');\r\n this.requireTable('glyf');\r\n this.requireTable('cmap');\r\n this._numberOfHMetrics = this._reader.uint16(hhea.offset + 34);\r\n this._metrics = {\r\n unitsPerEm: this._reader.uint16(head.offset + 18),\r\n ascent: this._reader.int16(hhea.offset + 4),\r\n descent: this._reader.int16(hhea.offset + 6),\r\n lineGap: this._reader.int16(hhea.offset + 8),\r\n glyphCount: this._reader.uint16(maxp.offset + 4)\r\n };\r\n this._glyphOffsets = parseGlyphOffsets(\r\n this._reader,\r\n loca.offset,\r\n this._metrics.glyphCount,\r\n this._reader.int16(head.offset + 50)\r\n );\r\n const metrics = parseHorizontalMetrics(\r\n this._reader,\r\n hmtx.offset,\r\n this._metrics.glyphCount,\r\n this._numberOfHMetrics\r\n );\r\n this._advanceWidths = metrics.advanceWidths;\r\n this._leftSideBearings = metrics.leftSideBearings;\r\n const cmap = parseBestCMap(this._reader, this.requireTable('cmap').offset);\r\n this._cmapFormat4 = cmap.format4;\r\n this._cmapFormat12 = cmap.format12;\r\n this._kernPairs = parseKernPairs(this._reader, this.getTable('kern'));\r\n this._gposPairs = parseGPOSPairs(this._reader, this.getTable('GPOS'));\r\n this._glyphCache = new Map();\r\n this._msdfAtlasSettings = Object.freeze({\r\n pageSize: normalizeMSDFAtlasPageSize(options?.pageSize),\r\n glyphSize: normalizeMSDFGlyphSize(options?.glyphSize)\r\n });\r\n }\r\n static fromBuffer(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n return new FontAsset(buffer, options);\r\n }\r\n get metrics(): FontMetrics {\r\n return this._metrics;\r\n }\r\n get msdfAtlasSettings(): FontAssetMSDFAtlasSettings {\r\n return this._msdfAtlasSettings;\r\n }\r\n get msdfAtlasPageSize() {\r\n return this._msdfAtlasSettings.pageSize;\r\n }\r\n get msdfGlyphSize() {\r\n return this._msdfAtlasSettings.glyphSize;\r\n }\r\n getGlyphIndex(codePoint: number) {\r\n if (this._cmapFormat12) {\r\n const glyphIndex = lookupCMapFormat12(this._reader, this._cmapFormat12.offset, codePoint);\r\n if (glyphIndex !== 0) {\r\n return glyphIndex;\r\n }\r\n }\r\n if (this._cmapFormat4 && codePoint <= 0xffff) {\r\n return lookupCMapFormat4(this._reader, this._cmapFormat4.offset, codePoint);\r\n }\r\n return 0;\r\n }\r\n getKerning(leftGlyphIndex: number, rightGlyphIndex: number) {\r\n const gpos = this.getPairAdjustment(leftGlyphIndex, rightGlyphIndex);\r\n if (gpos) {\r\n return gpos.firstXAdvance + gpos.secondXAdvance;\r\n }\r\n return this._kernPairs.get((leftGlyphIndex << 16) | rightGlyphIndex) ?? 0;\r\n }\r\n getPairAdjustment(leftGlyphIndex: number, rightGlyphIndex: number): PairAdjustment | null {\r\n return lookupGPOSPair(this._gposPairs, leftGlyphIndex, rightGlyphIndex);\r\n }\r\n getGlyph(glyphIndex: number): GlyphData | null {\r\n if (glyphIndex < 0 || glyphIndex >= this._metrics.glyphCount) {\r\n return null;\r\n }\r\n if (this._glyphCache.has(glyphIndex)) {\r\n return this._glyphCache.get(glyphIndex)!;\r\n }\r\n const glyph = this.loadGlyph(glyphIndex, 0);\r\n this._glyphCache.set(glyphIndex, glyph);\r\n return glyph;\r\n }\r\n private getTable(tag: string) {\r\n return this._tables.get(tag) ?? null;\r\n }\r\n private requireTable(tag: string) {\r\n const table = this.getTable(tag);\r\n if (!table) {\r\n throw new Error(`Font table not found: ${tag}`);\r\n }\r\n return table;\r\n }\r\n private loadGlyph(glyphIndex: number, depth: number): GlyphData | null {\r\n if (depth > 16) {\r\n throw new Error(`Composite glyph nesting too deep: ${glyphIndex}`);\r\n }\r\n const glyf = this.requireTable('glyf');\r\n const offset = this._glyphOffsets[glyphIndex];\r\n const nextOffset = this._glyphOffsets[glyphIndex + 1];\r\n if (offset === nextOffset) {\r\n return buildGlyphData(glyphIndex, this._advanceWidths, this._leftSideBearings, [], 0, 0, 0, 0);\r\n }\r\n const glyphOffset = glyf.offset + offset;\r\n const header = parseGlyphHeader(this._reader, glyphOffset);\r\n if (header.numberOfContours >= 0) {\r\n const contours = parseSimpleGlyph(this._reader, glyphOffset, header.numberOfContours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n header.xMin,\r\n header.yMin,\r\n header.xMax,\r\n header.yMax\r\n );\r\n }\r\n const contours = parseCompositeGlyph(this._reader, glyphOffset, (childIndex) =>\r\n this.loadGlyph(childIndex, depth + 1)\r\n );\r\n const bounds = computeBounds(contours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n bounds.xMin,\r\n bounds.yMin,\r\n bounds.xMax,\r\n bounds.yMax\r\n );\r\n }\r\n}\r\n\r\nfunction parseTableDirectory(reader: SFNTReader) {\r\n const numTables = reader.uint16(4);\r\n const tables = new Map<string, TableRecord>();\r\n let offset = 12;\r\n for (let i = 0; i < numTables; i++) {\r\n const tag = reader.tag(offset);\r\n tables.set(tag, {\r\n offset: reader.uint32(offset + 8),\r\n length: reader.uint32(offset + 12)\r\n });\r\n offset += 16;\r\n }\r\n return tables;\r\n}\r\n\r\nfunction parseGlyphOffsets(reader: SFNTReader, offset: number, glyphCount: number, indexToLocFormat: number) {\r\n const result = new Uint32Array(glyphCount + 1);\r\n if (indexToLocFormat === 0) {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint16(offset + i * 2) * 2;\r\n }\r\n } else {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint32(offset + i * 4);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseHorizontalMetrics(\r\n reader: SFNTReader,\r\n offset: number,\r\n glyphCount: number,\r\n numberOfHMetrics: number\r\n) {\r\n const advanceWidths = new Uint16Array(glyphCount);\r\n const leftSideBearings = new Int16Array(glyphCount);\r\n let cursor = offset;\r\n let lastAdvanceWidth = 0;\r\n for (let i = 0; i < glyphCount; i++) {\r\n if (i < numberOfHMetrics) {\r\n lastAdvanceWidth = reader.uint16(cursor);\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n }\r\n return { advanceWidths, leftSideBearings };\r\n}\r\n\r\nfunction parseBestCMap(reader: SFNTReader, offset: number) {\r\n const numTables = reader.uint16(offset + 2);\r\n let format4: { offset: number; platformId: number; encodingId: number } | null = null;\r\n let format12: { offset: number; platformId: number; encodingId: number } | null = null;\r\n for (let i = 0; i < numTables; i++) {\r\n const recordOffset = offset + 4 + i * 8;\r\n const platformId = reader.uint16(recordOffset);\r\n const encodingId = reader.uint16(recordOffset + 2);\r\n const subtableOffset = offset + reader.uint32(recordOffset + 4);\r\n const format = reader.uint16(subtableOffset);\r\n if (format === 12) {\r\n if (!format12 || isPreferredCMap(platformId, encodingId, format12.platformId, format12.encodingId)) {\r\n format12 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n } else if (format === 4) {\r\n if (!format4 || isPreferredCMap(platformId, encodingId, format4.platformId, format4.encodingId)) {\r\n format4 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n }\r\n }\r\n return { format4, format12 };\r\n}\r\n\r\nfunction isPreferredCMap(\r\n platformId: number,\r\n encodingId: number,\r\n currentPlatformId: number,\r\n currentEncodingId: number\r\n) {\r\n const nextScore = getCMapScore(platformId, encodingId);\r\n const currentScore = getCMapScore(currentPlatformId, currentEncodingId);\r\n return nextScore > currentScore;\r\n}\r\n\r\nfunction getCMapScore(platformId: number, encodingId: number) {\r\n if (platformId === 3 && encodingId === 10) {\r\n return 5;\r\n }\r\n if (platformId === 0 && encodingId <= 6) {\r\n return 4;\r\n }\r\n if (platformId === 3 && encodingId === 1) {\r\n return 3;\r\n }\r\n if (platformId === 0) {\r\n return 2;\r\n }\r\n return 1;\r\n}\r\n\r\nfunction lookupCMapFormat12(reader: SFNTReader, offset: number, codePoint: number) {\r\n const nGroups = reader.uint32(offset + 12);\r\n let low = 0;\r\n let high = nGroups - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const groupOffset = offset + 16 + mid * 12;\r\n const startCharCode = reader.uint32(groupOffset);\r\n const endCharCode = reader.uint32(groupOffset + 4);\r\n if (codePoint < startCharCode) {\r\n high = mid - 1;\r\n } else if (codePoint > endCharCode) {\r\n low = mid + 1;\r\n } else {\r\n return reader.uint32(groupOffset + 8) + (codePoint - startCharCode);\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction lookupCMapFormat4(reader: SFNTReader, offset: number, codePoint: number) {\r\n const segCount = reader.uint16(offset + 6) >> 1;\r\n const endCodeOffset = offset + 14;\r\n const startCodeOffset = endCodeOffset + segCount * 2 + 2;\r\n const idDeltaOffset = startCodeOffset + segCount * 2;\r\n const idRangeOffsetOffset = idDeltaOffset + segCount * 2;\r\n for (let i = 0; i < segCount; i++) {\r\n const endCode = reader.uint16(endCodeOffset + i * 2);\r\n if (codePoint > endCode) {\r\n continue;\r\n }\r\n const startCode = reader.uint16(startCodeOffset + i * 2);\r\n if (codePoint < startCode) {\r\n return 0;\r\n }\r\n const idDelta = reader.int16(idDeltaOffset + i * 2);\r\n const idRangeOffset = reader.uint16(idRangeOffsetOffset + i * 2);\r\n if (idRangeOffset === 0) {\r\n return (codePoint + idDelta) & 0xffff;\r\n }\r\n const glyphIndexAddress = idRangeOffsetOffset + i * 2 + idRangeOffset + (codePoint - startCode) * 2;\r\n const glyphIndex = reader.uint16(glyphIndexAddress);\r\n return glyphIndex === 0 ? 0 : (glyphIndex + idDelta) & 0xffff;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseKernPairs(reader: SFNTReader, table: TableRecord | null) {\r\n const result = new Map<number, number>();\r\n if (!table || table.length < 4) {\r\n return result;\r\n }\r\n const version = reader.uint16(table.offset);\r\n if (version !== 0) {\r\n return result;\r\n }\r\n const nTables = reader.uint16(table.offset + 2);\r\n let cursor = table.offset + 4;\r\n for (let i = 0; i < nTables; i++) {\r\n const length = reader.uint16(cursor + 2);\r\n const coverage = reader.uint16(cursor + 4);\r\n const format = coverage >> 8;\r\n if (format === 0) {\r\n const nPairs = reader.uint16(cursor + 6);\r\n let pairOffset = cursor + 14;\r\n for (let j = 0; j < nPairs; j++) {\r\n const left = reader.uint16(pairOffset);\r\n const right = reader.uint16(pairOffset + 2);\r\n const value = reader.int16(pairOffset + 4);\r\n result.set((left << 16) | right, value);\r\n pairOffset += 6;\r\n }\r\n }\r\n cursor += length;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseGPOSPairs(reader: SFNTReader, table: TableRecord | null) {\r\n if (!table || table.length < 10) {\r\n return [];\r\n }\r\n const majorVersion = reader.uint16(table.offset);\r\n if (majorVersion !== 1) {\r\n return [];\r\n }\r\n const featureListOffset = reader.uint16(table.offset + 6);\r\n const lookupListOffset = reader.uint16(table.offset + 8);\r\n if (!featureListOffset || !lookupListOffset) {\r\n return [];\r\n }\r\n const featureLookupIndices = collectGPOSFeatureLookupIndices(reader, table.offset + featureListOffset);\r\n if (featureLookupIndices.length === 0) {\r\n return [];\r\n }\r\n return parseGPOSLookupSubtables(\r\n reader,\r\n table.offset + lookupListOffset,\r\n table.offset,\r\n featureLookupIndices\r\n );\r\n}\r\n\r\nfunction collectGPOSFeatureLookupIndices(reader: SFNTReader, featureListOffset: number) {\r\n const featureCount = reader.uint16(featureListOffset);\r\n const featureTags = new Set(['kern']);\r\n const lookupIndices = new Set<number>();\r\n for (let i = 0; i < featureCount; i++) {\r\n const recordOffset = featureListOffset + 2 + i * 6;\r\n const tag = reader.tag(recordOffset);\r\n if (!featureTags.has(tag)) {\r\n continue;\r\n }\r\n const featureOffset = featureListOffset + reader.uint16(recordOffset + 4);\r\n const lookupIndexCount = reader.uint16(featureOffset + 2);\r\n for (let j = 0; j < lookupIndexCount; j++) {\r\n lookupIndices.add(reader.uint16(featureOffset + 4 + j * 2));\r\n }\r\n }\r\n return [...lookupIndices].sort((a, b) => a - b);\r\n}\r\n\r\nfunction parseGPOSLookupSubtables(\r\n reader: SFNTReader,\r\n lookupListOffset: number,\r\n gposOffset: number,\r\n lookupIndices: number[]\r\n) {\r\n const lookupCount = reader.uint16(lookupListOffset);\r\n const result: GPOSPairSubtable[] = [];\r\n for (const lookupIndex of lookupIndices) {\r\n if (lookupIndex >= lookupCount) {\r\n continue;\r\n }\r\n const lookupOffset = lookupListOffset + reader.uint16(lookupListOffset + 2 + lookupIndex * 2);\r\n const lookupType = reader.uint16(lookupOffset);\r\n const subtableCount = reader.uint16(lookupOffset + 4);\r\n for (let i = 0; i < subtableCount; i++) {\r\n const subtableOffset = lookupOffset + reader.uint16(lookupOffset + 6 + i * 2);\r\n if (lookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n } else if (lookupType === 9) {\r\n const extensionLookupType = reader.uint16(subtableOffset + 2);\r\n const extensionOffset = reader.uint32(subtableOffset + 4);\r\n if (extensionLookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset + extensionOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parsePairPosSubtable(reader: SFNTReader, offset: number): GPOSPairSubtable | null {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n return parsePairPosFormat1(reader, offset);\r\n }\r\n if (format === 2) {\r\n return parsePairPosFormat2(reader, offset);\r\n }\r\n return null;\r\n}\r\n\r\nfunction parsePairPosFormat1(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const pairSetCount = reader.uint16(offset + 8);\r\n const pairs = new Map<number, Map<number, PairAdjustment>>();\r\n for (let i = 0; i < pairSetCount; i++) {\r\n const firstGlyph = getCoverageGlyph(coverage, i);\r\n if (firstGlyph < 0) {\r\n continue;\r\n }\r\n const pairSetOffset = offset + reader.uint16(offset + 10 + i * 2);\r\n const pairValueCount = reader.uint16(pairSetOffset);\r\n let cursor = pairSetOffset + 2;\r\n const secondMap = new Map<number, PairAdjustment>();\r\n for (let j = 0; j < pairValueCount; j++) {\r\n const secondGlyph = reader.uint16(cursor);\r\n cursor += 2;\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n const adjustment = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n } satisfies PairAdjustment;\r\n if (\r\n adjustment.firstXPlacement !== 0 ||\r\n adjustment.firstXAdvance !== 0 ||\r\n adjustment.secondXPlacement !== 0 ||\r\n adjustment.secondXAdvance !== 0\r\n ) {\r\n secondMap.set(secondGlyph, adjustment);\r\n }\r\n }\r\n pairs.set(firstGlyph, secondMap);\r\n }\r\n return { kind: 'format1', coverage, pairs };\r\n}\r\n\r\nfunction parsePairPosFormat2(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const classDef1 = parseClassDefTable(reader, offset + reader.uint16(offset + 8));\r\n const classDef2 = parseClassDefTable(reader, offset + reader.uint16(offset + 10));\r\n const class1Count = reader.uint16(offset + 12);\r\n const class2Count = reader.uint16(offset + 14);\r\n const values: PairAdjustment[] = new Array(class1Count * class2Count);\r\n let cursor = offset + 16;\r\n for (let c1 = 0; c1 < class1Count; c1++) {\r\n for (let c2 = 0; c2 < class2Count; c2++) {\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n values[c1 * class2Count + c2] = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n };\r\n }\r\n }\r\n return { kind: 'format2', coverage, classDef1, classDef2, class1Count, class2Count, values };\r\n}\r\n\r\nfunction parseCoverageTable(reader: SFNTReader, offset: number): CoverageTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const glyphCount = reader.uint16(offset + 2);\r\n const glyphs = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n glyphs[i] = reader.uint16(offset + 4 + i * 2);\r\n }\r\n return { format: 1, glyphs };\r\n }\r\n const rangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; startIndex: number }[] = [];\r\n for (let i = 0; i < rangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n startIndex: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getCoverageGlyph(coverage: CoverageTable, index: number) {\r\n if (coverage.format === 1) {\r\n return coverage.glyphs[index] ?? -1;\r\n }\r\n for (const range of coverage.ranges) {\r\n const rangeLength = range.end - range.start + 1;\r\n if (index >= range.startIndex && index < range.startIndex + rangeLength) {\r\n return range.start + (index - range.startIndex);\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction coverageContains(coverage: CoverageTable, glyphIndex: number) {\r\n if (coverage.format === 1) {\r\n return binarySearchU16(coverage.glyphs, glyphIndex) >= 0;\r\n }\r\n for (const range of coverage.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction parseClassDefTable(reader: SFNTReader, offset: number): ClassDefTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const startGlyphId = reader.uint16(offset + 2);\r\n const glyphCount = reader.uint16(offset + 4);\r\n const classes = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n classes[i] = reader.uint16(offset + 6 + i * 2);\r\n }\r\n return { format: 1, startGlyphId, classes };\r\n }\r\n const classRangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; classId: number }[] = [];\r\n for (let i = 0; i < classRangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n classId: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getGlyphClass(classDef: ClassDefTable, glyphIndex: number) {\r\n if (classDef.format === 1) {\r\n const index = glyphIndex - classDef.startGlyphId;\r\n return index >= 0 && index < classDef.classes.length ? classDef.classes[index] : 0;\r\n }\r\n for (const range of classDef.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return range.classId;\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction readValueRecordX(reader: SFNTReader, offset: number, valueFormat: number) {\r\n let cursor = offset;\r\n let xPlacement = 0;\r\n let xAdvance = 0;\r\n if (valueFormat & 0x0001) {\r\n xPlacement = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0002) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0004) {\r\n xAdvance = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0008) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0010) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0020) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0040) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0080) {\r\n cursor += 2;\r\n }\r\n return { xPlacement, xAdvance };\r\n}\r\n\r\nfunction getValueRecordSize(valueFormat: number) {\r\n let size = 0;\r\n for (let bit = 0; bit < 8; bit++) {\r\n if (valueFormat & (1 << bit)) {\r\n size += 2;\r\n }\r\n }\r\n return size;\r\n}\r\n\r\nfunction lookupGPOSPair(subtables: GPOSPairSubtable[], leftGlyphIndex: number, rightGlyphIndex: number) {\r\n let merged: PairAdjustment | null = null;\r\n for (const subtable of subtables) {\r\n if (!coverageContains(subtable.coverage, leftGlyphIndex)) {\r\n continue;\r\n }\r\n if (subtable.kind === 'format1') {\r\n const secondMap = subtable.pairs.get(leftGlyphIndex);\r\n if (secondMap) {\r\n const adjustment = secondMap.get(rightGlyphIndex);\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n } else {\r\n const class1 = getGlyphClass(subtable.classDef1, leftGlyphIndex);\r\n const class2 = getGlyphClass(subtable.classDef2, rightGlyphIndex);\r\n if (class1 < subtable.class1Count && class2 < subtable.class2Count) {\r\n const adjustment = subtable.values[class1 * subtable.class2Count + class2];\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction binarySearchU16(values: Uint16Array<ArrayBuffer>, target: number) {\r\n let low = 0;\r\n let high = values.length - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const value = values[mid];\r\n if (value < target) {\r\n low = mid + 1;\r\n } else if (value > target) {\r\n high = mid - 1;\r\n } else {\r\n return mid;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction mergePairAdjustment(base: PairAdjustment | null, next: PairAdjustment): PairAdjustment {\r\n if (!base) {\r\n return { ...next };\r\n }\r\n return {\r\n firstXPlacement: base.firstXPlacement + next.firstXPlacement,\r\n firstXAdvance: base.firstXAdvance + next.firstXAdvance,\r\n secondXPlacement: base.secondXPlacement + next.secondXPlacement,\r\n secondXAdvance: base.secondXAdvance + next.secondXAdvance\r\n };\r\n}\r\n\r\nfunction parseGlyphHeader(reader: SFNTReader, offset: number): GlyphHeader {\r\n return {\r\n numberOfContours: reader.int16(offset),\r\n xMin: reader.int16(offset + 2),\r\n yMin: reader.int16(offset + 4),\r\n xMax: reader.int16(offset + 6),\r\n yMax: reader.int16(offset + 8)\r\n };\r\n}\r\n\r\nfunction parseSimpleGlyph(reader: SFNTReader, offset: number, numberOfContours: number): GlyphContour[] {\r\n const endPts: number[] = [];\r\n let cursor = offset + 10;\r\n for (let i = 0; i < numberOfContours; i++) {\r\n endPts.push(reader.uint16(cursor));\r\n cursor += 2;\r\n }\r\n const pointCount = endPts[numberOfContours - 1] + 1;\r\n const instructionLength = reader.uint16(cursor);\r\n cursor += 2 + instructionLength;\r\n const flags = new Uint8Array(pointCount);\r\n for (let i = 0; i < pointCount; ) {\r\n const flag = reader.uint8(cursor++);\r\n flags[i++] = flag;\r\n if (flag & 0x08) {\r\n const repeatCount = reader.uint8(cursor++);\r\n for (let j = 0; j < repeatCount; j++) {\r\n flags[i++] = flag;\r\n }\r\n }\r\n }\r\n const xs = new Int16Array(pointCount);\r\n const ys = new Int16Array(pointCount);\r\n let currentX = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x02) {\r\n const dx = reader.uint8(cursor++);\r\n currentX += flag & 0x10 ? dx : -dx;\r\n } else if (!(flag & 0x10)) {\r\n currentX += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n xs[i] = currentX;\r\n }\r\n let currentY = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x04) {\r\n const dy = reader.uint8(cursor++);\r\n currentY += flag & 0x20 ? dy : -dy;\r\n } else if (!(flag & 0x20)) {\r\n currentY += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n ys[i] = currentY;\r\n }\r\n const points: GlyphPoint[] = [];\r\n for (let i = 0; i < pointCount; i++) {\r\n points.push({\r\n x: xs[i],\r\n y: ys[i],\r\n onCurve: !!(flags[i] & 0x01)\r\n });\r\n }\r\n const contours: GlyphContour[] = [];\r\n let start = 0;\r\n for (const end of endPts) {\r\n contours.push(expandImplicitPoints(points.slice(start, end + 1)));\r\n start = end + 1;\r\n }\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeGlyph(\r\n reader: SFNTReader,\r\n offset: number,\r\n loadGlyph: (glyphIndex: number) => GlyphData | null\r\n): GlyphContour[] {\r\n let cursor = offset + 10;\r\n const contours: GlyphContour[] = [];\r\n let flags = 0;\r\n do {\r\n flags = reader.uint16(cursor);\r\n const glyphIndex = reader.uint16(cursor + 2);\r\n cursor += 4;\r\n const component = parseCompositeComponent(reader, cursor, flags, glyphIndex);\r\n cursor = component.cursor;\r\n const child = loadGlyph(component.data.glyphIndex);\r\n if (child) {\r\n for (const contour of child.contours) {\r\n contours.push(\r\n contour.map((point) => ({\r\n x: point.x * component.data.xx + point.y * component.data.xy + component.data.dx,\r\n y: point.x * component.data.yx + point.y * component.data.yy + component.data.dy,\r\n onCurve: point.onCurve\r\n }))\r\n );\r\n }\r\n }\r\n } while (flags & MORE_COMPONENTS);\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeComponent(reader: SFNTReader, offset: number, flags: number, glyphIndex: number) {\r\n let cursor = offset;\r\n let arg1 = 0;\r\n let arg2 = 0;\r\n if (flags & ARG_1_AND_2_ARE_WORDS) {\r\n arg1 = reader.int16(cursor);\r\n arg2 = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n arg1 = reader.int8(cursor);\r\n arg2 = reader.int8(cursor + 1);\r\n cursor += 2;\r\n }\r\n let dx = 0;\r\n let dy = 0;\r\n if (flags & ARGS_ARE_XY_VALUES) {\r\n dx = arg1;\r\n dy = arg2;\r\n }\r\n let xx = 1;\r\n let xy = 0;\r\n let yx = 0;\r\n let yy = 1;\r\n if (flags & WE_HAVE_A_SCALE) {\r\n const scale = readF2Dot14(reader, cursor);\r\n cursor += 2;\r\n xx = scale;\r\n yy = scale;\r\n } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\r\n xx = readF2Dot14(reader, cursor);\r\n yy = readF2Dot14(reader, cursor + 2);\r\n cursor += 4;\r\n } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\r\n xx = readF2Dot14(reader, cursor);\r\n xy = readF2Dot14(reader, cursor + 2);\r\n yx = readF2Dot14(reader, cursor + 4);\r\n yy = readF2Dot14(reader, cursor + 6);\r\n cursor += 8;\r\n }\r\n return {\r\n data: { glyphIndex, dx, dy, xx, xy, yx, yy } satisfies CompositeComponent,\r\n cursor\r\n };\r\n}\r\n\r\nfunction readF2Dot14(reader: SFNTReader, offset: number) {\r\n return reader.int16(offset) / 16384;\r\n}\r\n\r\nfunction expandImplicitPoints(points: GlyphPoint[]) {\r\n if (points.length === 0) {\r\n return points;\r\n }\r\n const result: GlyphPoint[] = [];\r\n for (let i = 0; i < points.length; i++) {\r\n const current = points[i];\r\n const next = points[(i + 1) % points.length];\r\n result.push(current);\r\n if (!current.onCurve && !next.onCurve) {\r\n result.push({\r\n x: (current.x + next.x) * 0.5,\r\n y: (current.y + next.y) * 0.5,\r\n onCurve: true\r\n });\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction computeBounds(contours: GlyphContour[]) {\r\n if (contours.length === 0) {\r\n return { xMin: 0, yMin: 0, xMax: 0, yMax: 0 };\r\n }\r\n let xMin = Number.POSITIVE_INFINITY;\r\n let yMin = Number.POSITIVE_INFINITY;\r\n let xMax = Number.NEGATIVE_INFINITY;\r\n let yMax = Number.NEGATIVE_INFINITY;\r\n for (const contour of contours) {\r\n for (const point of contour) {\r\n xMin = Math.min(xMin, point.x);\r\n yMin = Math.min(yMin, point.y);\r\n xMax = Math.max(xMax, point.x);\r\n yMax = Math.max(yMax, point.y);\r\n }\r\n }\r\n return { xMin, yMin, xMax, yMax };\r\n}\r\n\r\nfunction buildGlyphData(\r\n glyphIndex: number,\r\n advanceWidths: Uint16Array<ArrayBuffer>,\r\n leftSideBearings: Int16Array<ArrayBuffer>,\r\n contours: GlyphContour[],\r\n xMin: number,\r\n yMin: number,\r\n xMax: number,\r\n yMax: number\r\n): GlyphData {\r\n return {\r\n glyphIndex,\r\n advanceWidth: advanceWidths[glyphIndex] ?? 0,\r\n leftSideBearing: leftSideBearings[glyphIndex] ?? 0,\r\n xMin,\r\n yMin,\r\n xMax,\r\n yMax,\r\n contours\r\n };\r\n}\r\n\r\nfunction normalizeMSDFAtlasPageSize(value: number | undefined) {\r\n return Math.max(32, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_ATLAS_PAGE_SIZE));\r\n}\r\n\r\nfunction normalizeMSDFGlyphSize(value: number | undefined) {\r\n return Math.max(8, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_GLYPH_SIZE));\r\n}\r\n"],"names":["ARG_1_AND_2_ARE_WORDS","ARGS_ARE_XY_VALUES","WE_HAVE_A_SCALE","MORE_COMPONENTS","WE_HAVE_AN_X_AND_Y_SCALE","WE_HAVE_A_TWO_BY_TWO","DEFAULT_MSDF_ATLAS_PAGE_SIZE","DEFAULT_MSDF_GLYPH_SIZE","FontAsset","_reader","_tables","_glyphOffsets","_advanceWidths","_leftSideBearings","_glyphCache","_cmapFormat4","_cmapFormat12","_kernPairs","_gposPairs","_metrics","_numberOfHMetrics","_msdfAtlasSettings","buffer","options","SFNTReader","parseTableDirectory","head","requireTable","maxp","hhea","hmtx","loca","uint16","offset","unitsPerEm","ascent","int16","descent","lineGap","glyphCount","parseGlyphOffsets","metrics","parseHorizontalMetrics","advanceWidths","leftSideBearings","cmap","parseBestCMap","format4","format12","parseKernPairs","getTable","parseGPOSPairs","Map","Object","freeze","pageSize","normalizeMSDFAtlasPageSize","glyphSize","normalizeMSDFGlyphSize","fromBuffer","msdfAtlasSettings","msdfAtlasPageSize","msdfGlyphSize","getGlyphIndex","codePoint","glyphIndex","lookupCMapFormat12","lookupCMapFormat4","getKerning","leftGlyphIndex","rightGlyphIndex","gpos","getPairAdjustment","firstXAdvance","secondXAdvance","get","lookupGPOSPair","getGlyph","has","glyph","loadGlyph","set","tag","table","Error","depth","glyf","nextOffset","buildGlyphData","glyphOffset","header","parseGlyphHeader","numberOfContours","contours","parseSimpleGlyph","xMin","yMin","xMax","yMax","parseCompositeGlyph","childIndex","bounds","computeBounds","reader","numTables","tables","i","uint32","length","indexToLocFormat","result","Uint32Array","numberOfHMetrics","Uint16Array","Int16Array","cursor","lastAdvanceWidth","recordOffset","platformId","encodingId","subtableOffset","format","isPreferredCMap","currentPlatformId","currentEncodingId","nextScore","getCMapScore","currentScore","nGroups","low","high","mid","groupOffset","startCharCode","endCharCode","segCount","endCodeOffset","startCodeOffset","idDeltaOffset","idRangeOffsetOffset","endCode","startCode","idDelta","idRangeOffset","glyphIndexAddress","version","nTables","coverage","nPairs","pairOffset","j","left","right","value","majorVersion","featureListOffset","lookupListOffset","featureLookupIndices","collectGPOSFeatureLookupIndices","parseGPOSLookupSubtables","featureCount","featureTags","Set","lookupIndices","featureOffset","lookupIndexCount","add","sort","a","b","gposOffset","lookupCount","lookupIndex","lookupOffset","lookupType","subtableCount","parsed","parsePairPosSubtable","push","extensionLookupType","extensionOffset","parsePairPosFormat1","parsePairPosFormat2","parseCoverageTable","valueFormat1","valueFormat2","pairSetCount","pairs","firstGlyph","getCoverageGlyph","pairSetOffset","pairValueCount","secondMap","secondGlyph","value1","readValueRecordX","getValueRecordSize","value2","adjustment","firstXPlacement","xPlacement","xAdvance","secondXPlacement","kind","classDef1","parseClassDefTable","classDef2","class1Count","class2Count","values","Array","c1","c2","glyphs","rangeCount","ranges","rangeOffset","start","end","startIndex","index","range","rangeLength","coverageContains","binarySearchU16","startGlyphId","classes","classRangeCount","classId","getGlyphClass","classDef","valueFormat","size","bit","subtables","merged","subtable","mergePairAdjustment","class1","class2","target","base","next","endPts","pointCount","instructionLength","flags","Uint8Array","flag","uint8","repeatCount","xs","ys","currentX","dx","currentY","dy","points","x","y","onCurve","expandImplicitPoints","slice","component","parseCompositeComponent","child","data","contour","map","point","xx","xy","yx","yy","arg1","arg2","int8","scale","readF2Dot14","current","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","Math","min","max","advanceWidth","leftSideBearing","round","isFinite"],"mappings":";;AAwEA,MAAMA,wBAAwB,CAAK,IAAA,CAAA;AACnC,MAAMC,qBAAqB,CAAK,IAAA,CAAA;AAChC,MAAMC,kBAAkB,CAAK,IAAA,CAAA;AAC7B,MAAMC,kBAAkB,CAAK,IAAA,CAAA;AAC7B,MAAMC,2BAA2B,CAAK,IAAA,CAAA;AACtC,MAAMC,uBAAuB,CAAK,IAAA,CAAA;AAClC,MAAMC,4BAA+B,GAAA,IAAA;AACrC,MAAMC,uBAA0B,GAAA,EAAA;AAEhC;;;;AAIC,IACM,MAAMC,SAAAA,CAAAA;IACMC,OAAoB;IACpBC,OAAkC;IAClCC,aAAwC;IACxCC,cAAyC;IACzCC,iBAA2C;IAC3CC,WAA2C;IAC3CC,YAAgF;IAChFC,aAAiF;IACjFC,UAAgC;IAChCC,UAA+B;IAC/BC,QAAsB;IACtBC,iBAA0B;IAC1BC,kBAA+C;IAChE,WAAoBC,CAAAA,MAAmB,EAAEC,OAA+B,CAAE;AACxE,QAAA,IAAI,CAACd,OAAO,GAAG,IAAIe,UAAWF,CAAAA,MAAAA,CAAAA;AAC9B,QAAA,IAAI,CAACZ,OAAO,GAAGe,mBAAoB,CAAA,IAAI,CAAChB,OAAO,CAAA;AAC/C,QAAA,MAAMiB,IAAO,GAAA,IAAI,CAACC,YAAY,CAAC,MAAA,CAAA;AAC/B,QAAA,MAAMC,IAAO,GAAA,IAAI,CAACD,YAAY,CAAC,MAAA,CAAA;AAC/B,QAAA,MAAME,IAAO,GAAA,IAAI,CAACF,YAAY,CAAC,MAAA,CAAA;AAC/B,QAAA,MAAMG,IAAO,GAAA,IAAI,CAACH,YAAY,CAAC,MAAA,CAAA;AAC/B,QAAA,MAAMI,IAAO,GAAA,IAAI,CAACJ,YAAY,CAAC,MAAA,CAAA;QAC/B,IAAI,CAACA,YAAY,CAAC,MAAA,CAAA;QAClB,IAAI,CAACA,YAAY,CAAC,MAAA,CAAA;QAClB,IAAI,CAACP,iBAAiB,GAAG,IAAI,CAACX,OAAO,CAACuB,MAAM,CAACH,IAAKI,CAAAA,MAAM,GAAG,EAAA,CAAA;QAC3D,IAAI,CAACd,QAAQ,GAAG;YACde,UAAY,EAAA,IAAI,CAACzB,OAAO,CAACuB,MAAM,CAACN,IAAAA,CAAKO,MAAM,GAAG,EAAA,CAAA;YAC9CE,MAAQ,EAAA,IAAI,CAAC1B,OAAO,CAAC2B,KAAK,CAACP,IAAAA,CAAKI,MAAM,GAAG,CAAA,CAAA;YACzCI,OAAS,EAAA,IAAI,CAAC5B,OAAO,CAAC2B,KAAK,CAACP,IAAAA,CAAKI,MAAM,GAAG,CAAA,CAAA;YAC1CK,OAAS,EAAA,IAAI,CAAC7B,OAAO,CAAC2B,KAAK,CAACP,IAAAA,CAAKI,MAAM,GAAG,CAAA,CAAA;YAC1CM,UAAY,EAAA,IAAI,CAAC9B,OAAO,CAACuB,MAAM,CAACJ,IAAAA,CAAKK,MAAM,GAAG,CAAA;AAChD,SAAA;QACA,IAAI,CAACtB,aAAa,GAAG6B,iBACnB,CAAA,IAAI,CAAC/B,OAAO,EACZsB,IAAKE,CAAAA,MAAM,EACX,IAAI,CAACd,QAAQ,CAACoB,UAAU,EACxB,IAAI,CAAC9B,OAAO,CAAC2B,KAAK,CAACV,IAAKO,CAAAA,MAAM,GAAG,EAAA,CAAA,CAAA;AAEnC,QAAA,MAAMQ,UAAUC,sBACd,CAAA,IAAI,CAACjC,OAAO,EACZqB,IAAKG,CAAAA,MAAM,EACX,IAAI,CAACd,QAAQ,CAACoB,UAAU,EACxB,IAAI,CAACnB,iBAAiB,CAAA;AAExB,QAAA,IAAI,CAACR,cAAc,GAAG6B,OAAAA,CAAQE,aAAa;AAC3C,QAAA,IAAI,CAAC9B,iBAAiB,GAAG4B,OAAAA,CAAQG,gBAAgB;QACjD,MAAMC,IAAAA,GAAOC,aAAc,CAAA,IAAI,CAACrC,OAAO,EAAE,IAAI,CAACkB,YAAY,CAAC,MAAA,CAAA,CAAQM,MAAM,CAAA;AACzE,QAAA,IAAI,CAAClB,YAAY,GAAG8B,IAAAA,CAAKE,OAAO;AAChC,QAAA,IAAI,CAAC/B,aAAa,GAAG6B,IAAAA,CAAKG,QAAQ;QAClC,IAAI,CAAC/B,UAAU,GAAGgC,cAAe,CAAA,IAAI,CAACxC,OAAO,EAAE,IAAI,CAACyC,QAAQ,CAAC,MAAA,CAAA,CAAA;QAC7D,IAAI,CAAChC,UAAU,GAAGiC,cAAe,CAAA,IAAI,CAAC1C,OAAO,EAAE,IAAI,CAACyC,QAAQ,CAAC,MAAA,CAAA,CAAA;QAC7D,IAAI,CAACpC,WAAW,GAAG,IAAIsC,GAAAA,EAAAA;AACvB,QAAA,IAAI,CAAC/B,kBAAkB,GAAGgC,MAAAA,CAAOC,MAAM,CAAC;AACtCC,YAAAA,QAAAA,EAAUC,2BAA2BjC,OAASgC,EAAAA,QAAAA,CAAAA;AAC9CE,YAAAA,SAAAA,EAAWC,uBAAuBnC,OAASkC,EAAAA,SAAAA;AAC7C,SAAA,CAAA;AACF;AACA,IAAA,OAAOE,UAAWrC,CAAAA,MAAmB,EAAEC,OAA+B,EAAE;QACtE,OAAO,IAAIf,UAAUc,MAAQC,EAAAA,OAAAA,CAAAA;AAC/B;AACA,IAAA,IAAIkB,OAAuB,GAAA;QACzB,OAAO,IAAI,CAACtB,QAAQ;AACtB;AACA,IAAA,IAAIyC,iBAAgD,GAAA;QAClD,OAAO,IAAI,CAACvC,kBAAkB;AAChC;AACA,IAAA,IAAIwC,iBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAACxC,kBAAkB,CAACkC,QAAQ;AACzC;AACA,IAAA,IAAIO,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACzC,kBAAkB,CAACoC,SAAS;AAC1C;AACAM,IAAAA,aAAAA,CAAcC,SAAiB,EAAE;QAC/B,IAAI,IAAI,CAAChD,aAAa,EAAE;YACtB,MAAMiD,UAAAA,GAAaC,kBAAmB,CAAA,IAAI,CAACzD,OAAO,EAAE,IAAI,CAACO,aAAa,CAACiB,MAAM,EAAE+B,SAAAA,CAAAA;AAC/E,YAAA,IAAIC,eAAe,CAAG,EAAA;gBACpB,OAAOA,UAAAA;AACT;AACF;AACA,QAAA,IAAI,IAAI,CAAClD,YAAY,IAAIiD,aAAa,MAAQ,EAAA;YAC5C,OAAOG,iBAAAA,CAAkB,IAAI,CAAC1D,OAAO,EAAE,IAAI,CAACM,YAAY,CAACkB,MAAM,EAAE+B,SAAAA,CAAAA;AACnE;QACA,OAAO,CAAA;AACT;IACAI,UAAWC,CAAAA,cAAsB,EAAEC,eAAuB,EAAE;AAC1D,QAAA,MAAMC,IAAO,GAAA,IAAI,CAACC,iBAAiB,CAACH,cAAgBC,EAAAA,eAAAA,CAAAA;AACpD,QAAA,IAAIC,IAAM,EAAA;AACR,YAAA,OAAOA,IAAKE,CAAAA,aAAa,GAAGF,IAAAA,CAAKG,cAAc;AACjD;QACA,OAAO,IAAI,CAACzD,UAAU,CAAC0D,GAAG,CAAEN,cAAkB,IAAA,EAAA,GAAMC,eAAoB,CAAA,IAAA,CAAA;AAC1E;IACAE,iBAAkBH,CAAAA,cAAsB,EAAEC,eAAuB,EAAyB;AACxF,QAAA,OAAOM,cAAe,CAAA,IAAI,CAAC1D,UAAU,EAAEmD,cAAgBC,EAAAA,eAAAA,CAAAA;AACzD;AACAO,IAAAA,QAAAA,CAASZ,UAAkB,EAAoB;QAC7C,IAAIA,UAAAA,GAAa,KAAKA,UAAc,IAAA,IAAI,CAAC9C,QAAQ,CAACoB,UAAU,EAAE;YAC5D,OAAO,IAAA;AACT;AACA,QAAA,IAAI,IAAI,CAACzB,WAAW,CAACgE,GAAG,CAACb,UAAa,CAAA,EAAA;AACpC,YAAA,OAAO,IAAI,CAACnD,WAAW,CAAC6D,GAAG,CAACV,UAAAA,CAAAA;AAC9B;AACA,QAAA,MAAMc,KAAQ,GAAA,IAAI,CAACC,SAAS,CAACf,UAAY,EAAA,CAAA,CAAA;AACzC,QAAA,IAAI,CAACnD,WAAW,CAACmE,GAAG,CAAChB,UAAYc,EAAAA,KAAAA,CAAAA;QACjC,OAAOA,KAAAA;AACT;AACQ7B,IAAAA,QAAAA,CAASgC,GAAW,EAAE;AAC5B,QAAA,OAAO,IAAI,CAACxE,OAAO,CAACiE,GAAG,CAACO,GAAQ,CAAA,IAAA,IAAA;AAClC;AACQvD,IAAAA,YAAAA,CAAauD,GAAW,EAAE;AAChC,QAAA,MAAMC,KAAQ,GAAA,IAAI,CAACjC,QAAQ,CAACgC,GAAAA,CAAAA;AAC5B,QAAA,IAAI,CAACC,KAAO,EAAA;AACV,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,sBAAsB,EAAEF,GAAK,CAAA,CAAA,CAAA;AAChD;QACA,OAAOC,KAAAA;AACT;IACQH,SAAUf,CAAAA,UAAkB,EAAEoB,KAAa,EAAoB;AACrE,QAAA,IAAIA,QAAQ,EAAI,EAAA;AACd,YAAA,MAAM,IAAID,KAAAA,CAAM,CAAC,kCAAkC,EAAEnB,UAAY,CAAA,CAAA,CAAA;AACnE;AACA,QAAA,MAAMqB,IAAO,GAAA,IAAI,CAAC3D,YAAY,CAAC,MAAA,CAAA;AAC/B,QAAA,MAAMM,MAAS,GAAA,IAAI,CAACtB,aAAa,CAACsD,UAAW,CAAA;AAC7C,QAAA,MAAMsB,aAAa,IAAI,CAAC5E,aAAa,CAACsD,aAAa,CAAE,CAAA;AACrD,QAAA,IAAIhC,WAAWsD,UAAY,EAAA;AACzB,YAAA,OAAOC,cAAevB,CAAAA,UAAAA,EAAY,IAAI,CAACrD,cAAc,EAAE,IAAI,CAACC,iBAAiB,EAAE,EAAE,EAAE,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,CAAA;AAC9F;QACA,MAAM4E,WAAAA,GAAcH,IAAKrD,CAAAA,MAAM,GAAGA,MAAAA;AAClC,QAAA,MAAMyD,MAASC,GAAAA,gBAAAA,CAAiB,IAAI,CAAClF,OAAO,EAAEgF,WAAAA,CAAAA;QAC9C,IAAIC,MAAAA,CAAOE,gBAAgB,IAAI,CAAG,EAAA;YAChC,MAAMC,QAAAA,GAAWC,iBAAiB,IAAI,CAACrF,OAAO,EAAEgF,WAAAA,EAAaC,OAAOE,gBAAgB,CAAA;YACpF,OAAOJ,cAAAA,CACLvB,YACA,IAAI,CAACrD,cAAc,EACnB,IAAI,CAACC,iBAAiB,EACtBgF,UACAH,MAAOK,CAAAA,IAAI,EACXL,MAAOM,CAAAA,IAAI,EACXN,MAAOO,CAAAA,IAAI,EACXP,MAAAA,CAAOQ,IAAI,CAAA;AAEf;AACA,QAAA,MAAML,QAAWM,GAAAA,mBAAAA,CAAoB,IAAI,CAAC1F,OAAO,EAAEgF,WAAAA,EAAa,CAACW,UAAAA,GAC/D,IAAI,CAACpB,SAAS,CAACoB,YAAYf,KAAQ,GAAA,CAAA,CAAA,CAAA;AAErC,QAAA,MAAMgB,SAASC,aAAcT,CAAAA,QAAAA,CAAAA;QAC7B,OAAOL,cAAAA,CACLvB,YACA,IAAI,CAACrD,cAAc,EACnB,IAAI,CAACC,iBAAiB,EACtBgF,UACAQ,MAAON,CAAAA,IAAI,EACXM,MAAOL,CAAAA,IAAI,EACXK,MAAOJ,CAAAA,IAAI,EACXI,MAAAA,CAAOH,IAAI,CAAA;AAEf;AACF;AAEA,SAASzE,oBAAoB8E,MAAkB,EAAA;IAC7C,MAAMC,SAAAA,GAAYD,MAAOvE,CAAAA,MAAM,CAAC,CAAA,CAAA;AAChC,IAAA,MAAMyE,SAAS,IAAIrD,GAAAA,EAAAA;AACnB,IAAA,IAAInB,MAAS,GAAA,EAAA;AACb,IAAA,IAAK,IAAIyE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIF,WAAWE,CAAK,EAAA,CAAA;QAClC,MAAMxB,GAAAA,GAAMqB,MAAOrB,CAAAA,GAAG,CAACjD,MAAAA,CAAAA;QACvBwE,MAAOxB,CAAAA,GAAG,CAACC,GAAK,EAAA;YACdjD,MAAQsE,EAAAA,MAAAA,CAAOI,MAAM,CAAC1E,MAAS,GAAA,CAAA,CAAA;YAC/B2E,MAAQL,EAAAA,MAAAA,CAAOI,MAAM,CAAC1E,MAAS,GAAA,EAAA;AACjC,SAAA,CAAA;QACAA,MAAU,IAAA,EAAA;AACZ;IACA,OAAOwE,MAAAA;AACT;AAEA,SAASjE,kBAAkB+D,MAAkB,EAAEtE,MAAc,EAAEM,UAAkB,EAAEsE,gBAAwB,EAAA;IACzG,MAAMC,MAAAA,GAAS,IAAIC,WAAAA,CAAYxE,UAAa,GAAA,CAAA,CAAA;AAC5C,IAAA,IAAIsE,qBAAqB,CAAG,EAAA;AAC1B,QAAA,IAAK,IAAIH,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKnE,YAAYmE,CAAK,EAAA,CAAA;YACpCI,MAAM,CAACJ,EAAE,GAAGH,MAAAA,CAAOvE,MAAM,CAACC,MAAAA,GAASyE,IAAI,CAAK,CAAA,GAAA,CAAA;AAC9C;KACK,MAAA;AACL,QAAA,IAAK,IAAIA,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKnE,YAAYmE,CAAK,EAAA,CAAA;AACpCI,YAAAA,MAAM,CAACJ,CAAE,CAAA,GAAGH,OAAOI,MAAM,CAAC1E,SAASyE,CAAI,GAAA,CAAA,CAAA;AACzC;AACF;IACA,OAAOI,MAAAA;AACT;AAEA,SAASpE,uBACP6D,MAAkB,EAClBtE,MAAc,EACdM,UAAkB,EAClByE,gBAAwB,EAAA;IAExB,MAAMrE,aAAAA,GAAgB,IAAIsE,WAAY1E,CAAAA,UAAAA,CAAAA;IACtC,MAAMK,gBAAAA,GAAmB,IAAIsE,UAAW3E,CAAAA,UAAAA,CAAAA;AACxC,IAAA,IAAI4E,MAASlF,GAAAA,MAAAA;AACb,IAAA,IAAImF,gBAAmB,GAAA,CAAA;AACvB,IAAA,IAAK,IAAIV,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAInE,YAAYmE,CAAK,EAAA,CAAA;AACnC,QAAA,IAAIA,IAAIM,gBAAkB,EAAA;YACxBI,gBAAmBb,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAAA,CAAAA;YACjCxE,aAAa,CAAC+D,EAAE,GAAGU,gBAAAA;AACnBxE,YAAAA,gBAAgB,CAAC8D,CAAE,CAAA,GAAGH,MAAOnE,CAAAA,KAAK,CAAC+E,MAAS,GAAA,CAAA,CAAA;YAC5CA,MAAU,IAAA,CAAA;SACL,MAAA;YACLxE,aAAa,CAAC+D,EAAE,GAAGU,gBAAAA;AACnBxE,YAAAA,gBAAgB,CAAC8D,CAAAA,CAAE,GAAGH,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;YACnCA,MAAU,IAAA,CAAA;AACZ;AACF;IACA,OAAO;AAAExE,QAAAA,aAAAA;AAAeC,QAAAA;AAAiB,KAAA;AAC3C;AAEA,SAASE,aAAAA,CAAcyD,MAAkB,EAAEtE,MAAc,EAAA;AACvD,IAAA,MAAMuE,SAAYD,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AACzC,IAAA,IAAIc,OAA6E,GAAA,IAAA;AACjF,IAAA,IAAIC,QAA8E,GAAA,IAAA;AAClF,IAAA,IAAK,IAAI0D,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIF,WAAWE,CAAK,EAAA,CAAA;QAClC,MAAMW,YAAAA,GAAepF,MAAS,GAAA,CAAA,GAAIyE,CAAI,GAAA,CAAA;QACtC,MAAMY,UAAAA,GAAaf,MAAOvE,CAAAA,MAAM,CAACqF,YAAAA,CAAAA;AACjC,QAAA,MAAME,UAAahB,GAAAA,MAAAA,CAAOvE,MAAM,CAACqF,YAAe,GAAA,CAAA,CAAA;AAChD,QAAA,MAAMG,cAAiBvF,GAAAA,MAAAA,GAASsE,MAAOI,CAAAA,MAAM,CAACU,YAAe,GAAA,CAAA,CAAA;QAC7D,MAAMI,MAAAA,GAASlB,MAAOvE,CAAAA,MAAM,CAACwF,cAAAA,CAAAA;AAC7B,QAAA,IAAIC,WAAW,EAAI,EAAA;YACjB,IAAI,CAACzE,QAAY0E,IAAAA,eAAAA,CAAgBJ,UAAYC,EAAAA,UAAAA,EAAYvE,SAASsE,UAAU,EAAEtE,QAASuE,CAAAA,UAAU,CAAG,EAAA;gBAClGvE,QAAW,GAAA;oBAAEf,MAAQuF,EAAAA,cAAAA;AAAgBF,oBAAAA,UAAAA;AAAYC,oBAAAA;AAAW,iBAAA;AAC9D;SACK,MAAA,IAAIE,WAAW,CAAG,EAAA;YACvB,IAAI,CAAC1E,OAAW2E,IAAAA,eAAAA,CAAgBJ,UAAYC,EAAAA,UAAAA,EAAYxE,QAAQuE,UAAU,EAAEvE,OAAQwE,CAAAA,UAAU,CAAG,EAAA;gBAC/FxE,OAAU,GAAA;oBAAEd,MAAQuF,EAAAA,cAAAA;AAAgBF,oBAAAA,UAAAA;AAAYC,oBAAAA;AAAW,iBAAA;AAC7D;AACF;AACF;IACA,OAAO;AAAExE,QAAAA,OAAAA;AAASC,QAAAA;AAAS,KAAA;AAC7B;AAEA,SAAS0E,gBACPJ,UAAkB,EAClBC,UAAkB,EAClBI,iBAAyB,EACzBC,iBAAyB,EAAA;IAEzB,MAAMC,SAAAA,GAAYC,aAAaR,UAAYC,EAAAA,UAAAA,CAAAA;IAC3C,MAAMQ,YAAAA,GAAeD,aAAaH,iBAAmBC,EAAAA,iBAAAA,CAAAA;AACrD,IAAA,OAAOC,SAAYE,GAAAA,YAAAA;AACrB;AAEA,SAASD,YAAAA,CAAaR,UAAkB,EAAEC,UAAkB,EAAA;IAC1D,IAAID,UAAAA,KAAe,CAAKC,IAAAA,UAAAA,KAAe,EAAI,EAAA;QACzC,OAAO,CAAA;AACT;IACA,IAAID,UAAAA,KAAe,CAAKC,IAAAA,UAAAA,IAAc,CAAG,EAAA;QACvC,OAAO,CAAA;AACT;IACA,IAAID,UAAAA,KAAe,CAAKC,IAAAA,UAAAA,KAAe,CAAG,EAAA;QACxC,OAAO,CAAA;AACT;AACA,IAAA,IAAID,eAAe,CAAG,EAAA;QACpB,OAAO,CAAA;AACT;IACA,OAAO,CAAA;AACT;AAEA,SAASpD,kBAAmBqC,CAAAA,MAAkB,EAAEtE,MAAc,EAAE+B,SAAiB,EAAA;AAC/E,IAAA,MAAMgE,OAAUzB,GAAAA,MAAAA,CAAOI,MAAM,CAAC1E,MAAS,GAAA,EAAA,CAAA;AACvC,IAAA,IAAIgG,GAAM,GAAA,CAAA;AACV,IAAA,IAAIC,OAAOF,OAAU,GAAA,CAAA;AACrB,IAAA,MAAOC,OAAOC,IAAM,CAAA;QAClB,MAAMC,GAAAA,GAAM,GAACF,GAAMC,IAAS,IAAA,CAAA;QAC5B,MAAME,WAAAA,GAAcnG,MAAS,GAAA,EAAA,GAAKkG,GAAM,GAAA,EAAA;QACxC,MAAME,aAAAA,GAAgB9B,MAAOI,CAAAA,MAAM,CAACyB,WAAAA,CAAAA;AACpC,QAAA,MAAME,WAAc/B,GAAAA,MAAAA,CAAOI,MAAM,CAACyB,WAAc,GAAA,CAAA,CAAA;AAChD,QAAA,IAAIpE,YAAYqE,aAAe,EAAA;AAC7BH,YAAAA,IAAAA,GAAOC,GAAM,GAAA,CAAA;SACR,MAAA,IAAInE,YAAYsE,WAAa,EAAA;AAClCL,YAAAA,GAAAA,GAAME,GAAM,GAAA,CAAA;SACP,MAAA;AACL,YAAA,OAAO5B,OAAOI,MAAM,CAACyB,cAAc,CAAMpE,CAAAA,IAAAA,YAAYqE,aAAY,CAAA;AACnE;AACF;IACA,OAAO,CAAA;AACT;AAEA,SAASlE,iBAAkBoC,CAAAA,MAAkB,EAAEtE,MAAc,EAAE+B,SAAiB,EAAA;AAC9E,IAAA,MAAMuE,QAAWhC,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,SAAS,CAAM,CAAA,IAAA,CAAA;AAC9C,IAAA,MAAMuG,gBAAgBvG,MAAS,GAAA,EAAA;IAC/B,MAAMwG,eAAAA,GAAkBD,aAAgBD,GAAAA,QAAAA,GAAW,CAAI,GAAA,CAAA;IACvD,MAAMG,aAAAA,GAAgBD,kBAAkBF,QAAW,GAAA,CAAA;IACnD,MAAMI,mBAAAA,GAAsBD,gBAAgBH,QAAW,GAAA,CAAA;AACvD,IAAA,IAAK,IAAI7B,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI6B,UAAU7B,CAAK,EAAA,CAAA;AACjC,QAAA,MAAMkC,OAAUrC,GAAAA,MAAAA,CAAOvE,MAAM,CAACwG,gBAAgB9B,CAAI,GAAA,CAAA,CAAA;AAClD,QAAA,IAAI1C,YAAY4E,OAAS,EAAA;AACvB,YAAA;AACF;AACA,QAAA,MAAMC,SAAYtC,GAAAA,MAAAA,CAAOvE,MAAM,CAACyG,kBAAkB/B,CAAI,GAAA,CAAA,CAAA;AACtD,QAAA,IAAI1C,YAAY6E,SAAW,EAAA;YACzB,OAAO,CAAA;AACT;AACA,QAAA,MAAMC,OAAUvC,GAAAA,MAAAA,CAAOnE,KAAK,CAACsG,gBAAgBhC,CAAI,GAAA,CAAA,CAAA;AACjD,QAAA,MAAMqC,aAAgBxC,GAAAA,MAAAA,CAAOvE,MAAM,CAAC2G,sBAAsBjC,CAAI,GAAA,CAAA,CAAA;AAC9D,QAAA,IAAIqC,kBAAkB,CAAG,EAAA;YACvB,OAAQ/E,YAAY8E,OAAW,GAAA,MAAA;AACjC;QACA,MAAME,iBAAAA,GAAoBL,sBAAsBjC,CAAI,GAAA,CAAA,GAAIqC,gBAAgB,CAAC/E,SAAY6E,GAAAA,SAAQ,IAAK,CAAA;QAClG,MAAM5E,UAAAA,GAAasC,MAAOvE,CAAAA,MAAM,CAACgH,iBAAAA,CAAAA;AACjC,QAAA,OAAO/E,UAAe,KAAA,CAAA,GAAI,CAAI,GAACA,aAAa6E,OAAW,GAAA,MAAA;AACzD;IACA,OAAO,CAAA;AACT;AAEA,SAAS7F,cAAAA,CAAesD,MAAkB,EAAEpB,KAAyB,EAAA;AACnE,IAAA,MAAM2B,SAAS,IAAI1D,GAAAA,EAAAA;AACnB,IAAA,IAAI,CAAC+B,KAAAA,IAASA,KAAMyB,CAAAA,MAAM,GAAG,CAAG,EAAA;QAC9B,OAAOE,MAAAA;AACT;AACA,IAAA,MAAMmC,OAAU1C,GAAAA,MAAAA,CAAOvE,MAAM,CAACmD,MAAMlD,MAAM,CAAA;AAC1C,IAAA,IAAIgH,YAAY,CAAG,EAAA;QACjB,OAAOnC,MAAAA;AACT;AACA,IAAA,MAAMoC,UAAU3C,MAAOvE,CAAAA,MAAM,CAACmD,KAAAA,CAAMlD,MAAM,GAAG,CAAA,CAAA;IAC7C,IAAIkF,MAAAA,GAAShC,KAAMlD,CAAAA,MAAM,GAAG,CAAA;AAC5B,IAAA,IAAK,IAAIyE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIwC,SAASxC,CAAK,EAAA,CAAA;AAChC,QAAA,MAAME,MAASL,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAS,GAAA,CAAA,CAAA;AACtC,QAAA,MAAMgC,QAAW5C,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAS,GAAA,CAAA,CAAA;AACxC,QAAA,MAAMM,SAAS0B,QAAY,IAAA,CAAA;AAC3B,QAAA,IAAI1B,WAAW,CAAG,EAAA;AAChB,YAAA,MAAM2B,MAAS7C,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAS,GAAA,CAAA,CAAA;AACtC,YAAA,IAAIkC,aAAalC,MAAS,GAAA,EAAA;AAC1B,YAAA,IAAK,IAAImC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIF,QAAQE,CAAK,EAAA,CAAA;gBAC/B,MAAMC,IAAAA,GAAOhD,MAAOvE,CAAAA,MAAM,CAACqH,UAAAA,CAAAA;AAC3B,gBAAA,MAAMG,KAAQjD,GAAAA,MAAAA,CAAOvE,MAAM,CAACqH,UAAa,GAAA,CAAA,CAAA;AACzC,gBAAA,MAAMI,KAAQlD,GAAAA,MAAAA,CAAOnE,KAAK,CAACiH,UAAa,GAAA,CAAA,CAAA;AACxCvC,gBAAAA,MAAAA,CAAO7B,GAAG,CAAC,IAACsE,IAAQ,KAAMC,KAAOC,EAAAA,KAAAA,CAAAA;gBACjCJ,UAAc,IAAA,CAAA;AAChB;AACF;QACAlC,MAAUP,IAAAA,MAAAA;AACZ;IACA,OAAOE,MAAAA;AACT;AAEA,SAAS3D,cAAAA,CAAeoD,MAAkB,EAAEpB,KAAyB,EAAA;AACnE,IAAA,IAAI,CAACA,KAAAA,IAASA,KAAMyB,CAAAA,MAAM,GAAG,EAAI,EAAA;AAC/B,QAAA,OAAO,EAAE;AACX;AACA,IAAA,MAAM8C,YAAenD,GAAAA,MAAAA,CAAOvE,MAAM,CAACmD,MAAMlD,MAAM,CAAA;AAC/C,IAAA,IAAIyH,iBAAiB,CAAG,EAAA;AACtB,QAAA,OAAO,EAAE;AACX;AACA,IAAA,MAAMC,oBAAoBpD,MAAOvE,CAAAA,MAAM,CAACmD,KAAAA,CAAMlD,MAAM,GAAG,CAAA,CAAA;AACvD,IAAA,MAAM2H,mBAAmBrD,MAAOvE,CAAAA,MAAM,CAACmD,KAAAA,CAAMlD,MAAM,GAAG,CAAA,CAAA;IACtD,IAAI,CAAC0H,iBAAqB,IAAA,CAACC,gBAAkB,EAAA;AAC3C,QAAA,OAAO,EAAE;AACX;AACA,IAAA,MAAMC,oBAAuBC,GAAAA,+BAAAA,CAAgCvD,MAAQpB,EAAAA,KAAAA,CAAMlD,MAAM,GAAG0H,iBAAAA,CAAAA;IACpF,IAAIE,oBAAAA,CAAqBjD,MAAM,KAAK,CAAG,EAAA;AACrC,QAAA,OAAO,EAAE;AACX;IACA,OAAOmD,wBAAAA,CACLxD,QACApB,KAAMlD,CAAAA,MAAM,GAAG2H,gBACfzE,EAAAA,KAAAA,CAAMlD,MAAM,EACZ4H,oBAAAA,CAAAA;AAEJ;AAEA,SAASC,+BAAAA,CAAgCvD,MAAkB,EAAEoD,iBAAyB,EAAA;IACpF,MAAMK,YAAAA,GAAezD,MAAOvE,CAAAA,MAAM,CAAC2H,iBAAAA,CAAAA;IACnC,MAAMM,WAAAA,GAAc,IAAIC,GAAI,CAAA;AAAC,QAAA;AAAO,KAAA,CAAA;AACpC,IAAA,MAAMC,gBAAgB,IAAID,GAAAA,EAAAA;AAC1B,IAAA,IAAK,IAAIxD,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIsD,cAActD,CAAK,EAAA,CAAA;QACrC,MAAMW,YAAAA,GAAesC,iBAAoB,GAAA,CAAA,GAAIjD,CAAI,GAAA,CAAA;QACjD,MAAMxB,GAAAA,GAAMqB,MAAOrB,CAAAA,GAAG,CAACmC,YAAAA,CAAAA;AACvB,QAAA,IAAI,CAAC4C,WAAAA,CAAYnF,GAAG,CAACI,GAAM,CAAA,EAAA;AACzB,YAAA;AACF;AACA,QAAA,MAAMkF,aAAgBT,GAAAA,iBAAAA,GAAoBpD,MAAOvE,CAAAA,MAAM,CAACqF,YAAe,GAAA,CAAA,CAAA;AACvE,QAAA,MAAMgD,gBAAmB9D,GAAAA,MAAAA,CAAOvE,MAAM,CAACoI,aAAgB,GAAA,CAAA,CAAA;AACvD,QAAA,IAAK,IAAId,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIe,kBAAkBf,CAAK,EAAA,CAAA;AACzCa,YAAAA,aAAAA,CAAcG,GAAG,CAAC/D,MAAAA,CAAOvE,MAAM,CAACoI,aAAAA,GAAgB,IAAId,CAAI,GAAA,CAAA,CAAA,CAAA;AAC1D;AACF;IACA,OAAO;AAAIa,QAAAA,GAAAA;AAAc,KAAA,CAACI,IAAI,CAAC,CAACC,CAAAA,EAAGC,IAAMD,CAAIC,GAAAA,CAAAA,CAAAA;AAC/C;AAEA,SAASV,yBACPxD,MAAkB,EAClBqD,gBAAwB,EACxBc,UAAkB,EAClBP,aAAuB,EAAA;IAEvB,MAAMQ,WAAAA,GAAcpE,MAAOvE,CAAAA,MAAM,CAAC4H,gBAAAA,CAAAA;AAClC,IAAA,MAAM9C,SAA6B,EAAE;IACrC,KAAK,MAAM8D,eAAeT,aAAe,CAAA;AACvC,QAAA,IAAIS,eAAeD,WAAa,EAAA;AAC9B,YAAA;AACF;AACA,QAAA,MAAME,eAAejB,gBAAmBrD,GAAAA,MAAAA,CAAOvE,MAAM,CAAC4H,gBAAAA,GAAmB,IAAIgB,WAAc,GAAA,CAAA,CAAA;QAC3F,MAAME,UAAAA,GAAavE,MAAOvE,CAAAA,MAAM,CAAC6I,YAAAA,CAAAA;AACjC,QAAA,MAAME,aAAgBxE,GAAAA,MAAAA,CAAOvE,MAAM,CAAC6I,YAAe,GAAA,CAAA,CAAA;AACnD,QAAA,IAAK,IAAInE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIqE,eAAerE,CAAK,EAAA,CAAA;AACtC,YAAA,MAAMc,iBAAiBqD,YAAetE,GAAAA,MAAAA,CAAOvE,MAAM,CAAC6I,YAAAA,GAAe,IAAInE,CAAI,GAAA,CAAA,CAAA;AAC3E,YAAA,IAAIoE,eAAe,CAAG,EAAA;gBACpB,MAAME,MAAAA,GAASC,qBAAqB1E,MAAQiB,EAAAA,cAAAA,CAAAA;AAC5C,gBAAA,IAAIwD,MAAQ,EAAA;AACVlE,oBAAAA,MAAAA,CAAOoE,IAAI,CAACF,MAAAA,CAAAA;AACd;aACK,MAAA,IAAIF,eAAe,CAAG,EAAA;AAC3B,gBAAA,MAAMK,mBAAsB5E,GAAAA,MAAAA,CAAOvE,MAAM,CAACwF,cAAiB,GAAA,CAAA,CAAA;AAC3D,gBAAA,MAAM4D,eAAkB7E,GAAAA,MAAAA,CAAOI,MAAM,CAACa,cAAiB,GAAA,CAAA,CAAA;AACvD,gBAAA,IAAI2D,wBAAwB,CAAG,EAAA;oBAC7B,MAAMH,MAAAA,GAASC,oBAAqB1E,CAAAA,MAAAA,EAAQiB,cAAiB4D,GAAAA,eAAAA,CAAAA;AAC7D,oBAAA,IAAIJ,MAAQ,EAAA;AACVlE,wBAAAA,MAAAA,CAAOoE,IAAI,CAACF,MAAAA,CAAAA;AACd;AACF;AACF;AACF;AACF;IACA,OAAOlE,MAAAA;AACT;AAEA,SAASmE,oBAAAA,CAAqB1E,MAAkB,EAAEtE,MAAc,EAAA;IAC9D,MAAMwF,MAAAA,GAASlB,MAAOvE,CAAAA,MAAM,CAACC,MAAAA,CAAAA;AAC7B,IAAA,IAAIwF,WAAW,CAAG,EAAA;AAChB,QAAA,OAAO4D,oBAAoB9E,MAAQtE,EAAAA,MAAAA,CAAAA;AACrC;AACA,IAAA,IAAIwF,WAAW,CAAG,EAAA;AAChB,QAAA,OAAO6D,oBAAoB/E,MAAQtE,EAAAA,MAAAA,CAAAA;AACrC;IACA,OAAO,IAAA;AACT;AAEA,SAASoJ,mBAAAA,CAAoB9E,MAAkB,EAAEtE,MAAc,EAAA;AAC7D,IAAA,MAAMkH,WAAWoC,kBAAmBhF,CAAAA,MAAAA,EAAQtE,SAASsE,MAAOvE,CAAAA,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAC5E,IAAA,MAAMuJ,YAAejF,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,IAAA,MAAMwJ,YAAelF,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,IAAA,MAAMyJ,YAAenF,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,IAAA,MAAM0J,QAAQ,IAAIvI,GAAAA,EAAAA;AAClB,IAAA,IAAK,IAAIsD,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIgF,cAAchF,CAAK,EAAA,CAAA;QACrC,MAAMkF,UAAAA,GAAaC,iBAAiB1C,QAAUzC,EAAAA,CAAAA,CAAAA;AAC9C,QAAA,IAAIkF,aAAa,CAAG,EAAA;AAClB,YAAA;AACF;AACA,QAAA,MAAME,gBAAgB7J,MAASsE,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAAA,GAAS,KAAKyE,CAAI,GAAA,CAAA,CAAA;QAC/D,MAAMqF,cAAAA,GAAiBxF,MAAOvE,CAAAA,MAAM,CAAC8J,aAAAA,CAAAA;AACrC,QAAA,IAAI3E,SAAS2E,aAAgB,GAAA,CAAA;AAC7B,QAAA,MAAME,YAAY,IAAI5I,GAAAA,EAAAA;AACtB,QAAA,IAAK,IAAIkG,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIyC,gBAAgBzC,CAAK,EAAA,CAAA;YACvC,MAAM2C,WAAAA,GAAc1F,MAAOvE,CAAAA,MAAM,CAACmF,MAAAA,CAAAA;YAClCA,MAAU,IAAA,CAAA;YACV,MAAM+E,MAAAA,GAASC,gBAAiB5F,CAAAA,MAAAA,EAAQY,MAAQqE,EAAAA,YAAAA,CAAAA;AAChDrE,YAAAA,MAAAA,IAAUiF,kBAAmBZ,CAAAA,YAAAA,CAAAA;YAC7B,MAAMa,MAAAA,GAASF,gBAAiB5F,CAAAA,MAAAA,EAAQY,MAAQsE,EAAAA,YAAAA,CAAAA;AAChDtE,YAAAA,MAAAA,IAAUiF,kBAAmBX,CAAAA,YAAAA,CAAAA;AAC7B,YAAA,MAAMa,UAAa,GAAA;AACjBC,gBAAAA,eAAAA,EAAiBL,OAAOM,UAAU;AAClC/H,gBAAAA,aAAAA,EAAeyH,OAAOO,QAAQ;AAC9BC,gBAAAA,gBAAAA,EAAkBL,OAAOG,UAAU;AACnC9H,gBAAAA,cAAAA,EAAgB2H,OAAOI;AACzB,aAAA;AACA,YAAA,IACEH,UAAWC,CAAAA,eAAe,KAAK,CAAA,IAC/BD,WAAW7H,aAAa,KAAK,CAC7B6H,IAAAA,UAAAA,CAAWI,gBAAgB,KAAK,CAAA,IAChCJ,UAAW5H,CAAAA,cAAc,KAAK,CAC9B,EAAA;gBACAsH,SAAU/G,CAAAA,GAAG,CAACgH,WAAaK,EAAAA,UAAAA,CAAAA;AAC7B;AACF;QACAX,KAAM1G,CAAAA,GAAG,CAAC2G,UAAYI,EAAAA,SAAAA,CAAAA;AACxB;IACA,OAAO;QAAEW,IAAM,EAAA,SAAA;AAAWxD,QAAAA,QAAAA;AAAUwC,QAAAA;AAAM,KAAA;AAC5C;AAEA,SAASL,mBAAAA,CAAoB/E,MAAkB,EAAEtE,MAAc,EAAA;AAC7D,IAAA,MAAMkH,WAAWoC,kBAAmBhF,CAAAA,MAAAA,EAAQtE,SAASsE,MAAOvE,CAAAA,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAC5E,IAAA,MAAMuJ,YAAejF,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,IAAA,MAAMwJ,YAAelF,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,IAAA,MAAM2K,YAAYC,kBAAmBtG,CAAAA,MAAAA,EAAQtE,SAASsE,MAAOvE,CAAAA,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAC7E,IAAA,MAAM6K,YAAYD,kBAAmBtG,CAAAA,MAAAA,EAAQtE,SAASsE,MAAOvE,CAAAA,MAAM,CAACC,MAAS,GAAA,EAAA,CAAA,CAAA;AAC7E,IAAA,MAAM8K,WAAcxG,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,EAAA,CAAA;AAC3C,IAAA,MAAM+K,WAAczG,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,EAAA,CAAA;IAC3C,MAAMgL,MAAAA,GAA2B,IAAIC,KAAAA,CAAMH,WAAcC,GAAAA,WAAAA,CAAAA;AACzD,IAAA,IAAI7F,SAASlF,MAAS,GAAA,EAAA;AACtB,IAAA,IAAK,IAAIkL,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAKJ,aAAaI,EAAM,EAAA,CAAA;AACvC,QAAA,IAAK,IAAIC,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAKJ,aAAaI,EAAM,EAAA,CAAA;YACvC,MAAMlB,MAAAA,GAASC,gBAAiB5F,CAAAA,MAAAA,EAAQY,MAAQqE,EAAAA,YAAAA,CAAAA;AAChDrE,YAAAA,MAAAA,IAAUiF,kBAAmBZ,CAAAA,YAAAA,CAAAA;YAC7B,MAAMa,MAAAA,GAASF,gBAAiB5F,CAAAA,MAAAA,EAAQY,MAAQsE,EAAAA,YAAAA,CAAAA;AAChDtE,YAAAA,MAAAA,IAAUiF,kBAAmBX,CAAAA,YAAAA,CAAAA;AAC7BwB,YAAAA,MAAM,CAACE,EAAAA,GAAKH,WAAcI,GAAAA,EAAAA,CAAG,GAAG;AAC9Bb,gBAAAA,eAAAA,EAAiBL,OAAOM,UAAU;AAClC/H,gBAAAA,aAAAA,EAAeyH,OAAOO,QAAQ;AAC9BC,gBAAAA,gBAAAA,EAAkBL,OAAOG,UAAU;AACnC9H,gBAAAA,cAAAA,EAAgB2H,OAAOI;AACzB,aAAA;AACF;AACF;IACA,OAAO;QAAEE,IAAM,EAAA,SAAA;AAAWxD,QAAAA,QAAAA;AAAUyD,QAAAA,SAAAA;AAAWE,QAAAA,SAAAA;AAAWC,QAAAA,WAAAA;AAAaC,QAAAA,WAAAA;AAAaC,QAAAA;AAAO,KAAA;AAC7F;AAEA,SAAS1B,kBAAAA,CAAmBhF,MAAkB,EAAEtE,MAAc,EAAA;IAC5D,MAAMwF,MAAAA,GAASlB,MAAOvE,CAAAA,MAAM,CAACC,MAAAA,CAAAA;AAC7B,IAAA,IAAIwF,WAAW,CAAG,EAAA;AAChB,QAAA,MAAMlF,UAAagE,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;QAC1C,MAAMoL,MAAAA,GAAS,IAAIpG,WAAY1E,CAAAA,UAAAA,CAAAA;AAC/B,QAAA,IAAK,IAAImE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAInE,YAAYmE,CAAK,EAAA,CAAA;YACnC2G,MAAM,CAAC3G,EAAE,GAAGH,MAAAA,CAAOvE,MAAM,CAACC,MAAAA,GAAS,IAAIyE,CAAI,GAAA,CAAA,CAAA;AAC7C;QACA,OAAO;YAAEe,MAAQ,EAAA,CAAA;AAAG4F,YAAAA;AAAO,SAAA;AAC7B;AACA,IAAA,MAAMC,UAAa/G,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC1C,IAAA,MAAMsL,SAA+D,EAAE;AACvE,IAAA,IAAK,IAAI7G,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI4G,YAAY5G,CAAK,EAAA,CAAA;QACnC,MAAM8G,WAAAA,GAAcvL,MAAS,GAAA,CAAA,GAAIyE,CAAI,GAAA,CAAA;AACrC6G,QAAAA,MAAAA,CAAOrC,IAAI,CAAC;YACVuC,KAAOlH,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAAA,CAAAA;YACrBE,GAAKnH,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAc,GAAA,CAAA,CAAA;YACjCG,UAAYpH,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAc,GAAA,CAAA;AAC1C,SAAA,CAAA;AACF;IACA,OAAO;QAAE/F,MAAQ,EAAA,CAAA;AAAG8F,QAAAA;AAAO,KAAA;AAC7B;AAEA,SAAS1B,gBAAAA,CAAiB1C,QAAuB,EAAEyE,KAAa,EAAA;IAC9D,IAAIzE,QAAAA,CAAS1B,MAAM,KAAK,CAAG,EAAA;AACzB,QAAA,OAAO0B,QAASkE,CAAAA,MAAM,CAACO,KAAAA,CAAM,IAAI,EAAC;AACpC;AACA,IAAA,KAAK,MAAMC,KAAAA,IAAS1E,QAASoE,CAAAA,MAAM,CAAE;AACnC,QAAA,MAAMO,cAAcD,KAAMH,CAAAA,GAAG,GAAGG,KAAAA,CAAMJ,KAAK,GAAG,CAAA;QAC9C,IAAIG,KAAAA,IAASC,MAAMF,UAAU,IAAIC,QAAQC,KAAMF,CAAAA,UAAU,GAAGG,WAAa,EAAA;AACvE,YAAA,OAAOD,MAAMJ,KAAK,IAAIG,KAAQC,GAAAA,KAAAA,CAAMF,UAAU,CAAD;AAC/C;AACF;AACA,IAAA,OAAO,EAAC;AACV;AAEA,SAASI,gBAAAA,CAAiB5E,QAAuB,EAAElF,UAAkB,EAAA;IACnE,IAAIkF,QAAAA,CAAS1B,MAAM,KAAK,CAAG,EAAA;AACzB,QAAA,OAAOuG,eAAgB7E,CAAAA,QAAAA,CAASkE,MAAM,EAAEpJ,UAAe,CAAA,IAAA,CAAA;AACzD;AACA,IAAA,KAAK,MAAM4J,KAAAA,IAAS1E,QAASoE,CAAAA,MAAM,CAAE;AACnC,QAAA,IAAItJ,cAAc4J,KAAMJ,CAAAA,KAAK,IAAIxJ,UAAc4J,IAAAA,KAAAA,CAAMH,GAAG,EAAE;YACxD,OAAO,IAAA;AACT;AACF;IACA,OAAO,KAAA;AACT;AAEA,SAASb,kBAAAA,CAAmBtG,MAAkB,EAAEtE,MAAc,EAAA;IAC5D,MAAMwF,MAAAA,GAASlB,MAAOvE,CAAAA,MAAM,CAACC,MAAAA,CAAAA;AAC7B,IAAA,IAAIwF,WAAW,CAAG,EAAA;AAChB,QAAA,MAAMwG,YAAe1H,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC5C,QAAA,MAAMM,UAAagE,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;QAC1C,MAAMiM,OAAAA,GAAU,IAAIjH,WAAY1E,CAAAA,UAAAA,CAAAA;AAChC,QAAA,IAAK,IAAImE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAInE,YAAYmE,CAAK,EAAA,CAAA;YACnCwH,OAAO,CAACxH,EAAE,GAAGH,MAAAA,CAAOvE,MAAM,CAACC,MAAAA,GAAS,IAAIyE,CAAI,GAAA,CAAA,CAAA;AAC9C;QACA,OAAO;YAAEe,MAAQ,EAAA,CAAA;AAAGwG,YAAAA,YAAAA;AAAcC,YAAAA;AAAQ,SAAA;AAC5C;AACA,IAAA,MAAMC,eAAkB5H,GAAAA,MAAAA,CAAOvE,MAAM,CAACC,MAAS,GAAA,CAAA,CAAA;AAC/C,IAAA,MAAMsL,SAA4D,EAAE;AACpE,IAAA,IAAK,IAAI7G,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIyH,iBAAiBzH,CAAK,EAAA,CAAA;QACxC,MAAM8G,WAAAA,GAAcvL,MAAS,GAAA,CAAA,GAAIyE,CAAI,GAAA,CAAA;AACrC6G,QAAAA,MAAAA,CAAOrC,IAAI,CAAC;YACVuC,KAAOlH,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAAA,CAAAA;YACrBE,GAAKnH,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAc,GAAA,CAAA,CAAA;YACjCY,OAAS7H,EAAAA,MAAAA,CAAOvE,MAAM,CAACwL,WAAc,GAAA,CAAA;AACvC,SAAA,CAAA;AACF;IACA,OAAO;QAAE/F,MAAQ,EAAA,CAAA;AAAG8F,QAAAA;AAAO,KAAA;AAC7B;AAEA,SAASc,aAAAA,CAAcC,QAAuB,EAAErK,UAAkB,EAAA;IAChE,IAAIqK,QAAAA,CAAS7G,MAAM,KAAK,CAAG,EAAA;QACzB,MAAMmG,KAAAA,GAAQ3J,UAAaqK,GAAAA,QAAAA,CAASL,YAAY;AAChD,QAAA,OAAOL,KAAS,IAAA,CAAA,IAAKA,KAAQU,GAAAA,QAAAA,CAASJ,OAAO,CAACtH,MAAM,GAAG0H,QAASJ,CAAAA,OAAO,CAACN,KAAAA,CAAM,GAAG,CAAA;AACnF;AACA,IAAA,KAAK,MAAMC,KAAAA,IAASS,QAASf,CAAAA,MAAM,CAAE;AACnC,QAAA,IAAItJ,cAAc4J,KAAMJ,CAAAA,KAAK,IAAIxJ,UAAc4J,IAAAA,KAAAA,CAAMH,GAAG,EAAE;AACxD,YAAA,OAAOG,MAAMO,OAAO;AACtB;AACF;IACA,OAAO,CAAA;AACT;AAEA,SAASjC,gBAAiB5F,CAAAA,MAAkB,EAAEtE,MAAc,EAAEsM,WAAmB,EAAA;AAC/E,IAAA,IAAIpH,MAASlF,GAAAA,MAAAA;AACb,IAAA,IAAIuK,UAAa,GAAA,CAAA;AACjB,IAAA,IAAIC,QAAW,GAAA,CAAA;AACf,IAAA,IAAI8B,cAAc,MAAQ,EAAA;QACxB/B,UAAajG,GAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;QAC1BA,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxB9B,QAAWlG,GAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;QACxBA,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAIoH,cAAc,MAAQ,EAAA;QACxBpH,MAAU,IAAA,CAAA;AACZ;IACA,OAAO;AAAEqF,QAAAA,UAAAA;AAAYC,QAAAA;AAAS,KAAA;AAChC;AAEA,SAASL,mBAAmBmC,WAAmB,EAAA;AAC7C,IAAA,IAAIC,IAAO,GAAA,CAAA;AACX,IAAA,IAAK,IAAIC,GAAAA,GAAM,CAAGA,EAAAA,GAAAA,GAAM,GAAGA,GAAO,EAAA,CAAA;QAChC,IAAIF,WAAAA,GAAe,KAAKE,GAAM,EAAA;YAC5BD,IAAQ,IAAA,CAAA;AACV;AACF;IACA,OAAOA,IAAAA;AACT;AAEA,SAAS5J,cAAe8J,CAAAA,SAA6B,EAAErK,cAAsB,EAAEC,eAAuB,EAAA;AACpG,IAAA,IAAIqK,MAAgC,GAAA,IAAA;IACpC,KAAK,MAAMC,YAAYF,SAAW,CAAA;AAChC,QAAA,IAAI,CAACX,gBAAAA,CAAiBa,QAASzF,CAAAA,QAAQ,EAAE9E,cAAiB,CAAA,EAAA;AACxD,YAAA;AACF;QACA,IAAIuK,QAAAA,CAASjC,IAAI,KAAK,SAAW,EAAA;AAC/B,YAAA,MAAMX,SAAY4C,GAAAA,QAAAA,CAASjD,KAAK,CAAChH,GAAG,CAACN,cAAAA,CAAAA;AACrC,YAAA,IAAI2H,SAAW,EAAA;gBACb,MAAMM,UAAAA,GAAaN,SAAUrH,CAAAA,GAAG,CAACL,eAAAA,CAAAA;AACjC,gBAAA,IAAIgI,UAAY,EAAA;AACdqC,oBAAAA,MAAAA,GAASE,oBAAoBF,MAAQrC,EAAAA,UAAAA,CAAAA;AACvC;AACF;SACK,MAAA;AACL,YAAA,MAAMwC,MAAST,GAAAA,aAAAA,CAAcO,QAAShC,CAAAA,SAAS,EAAEvI,cAAAA,CAAAA;AACjD,YAAA,MAAM0K,MAASV,GAAAA,aAAAA,CAAcO,QAAS9B,CAAAA,SAAS,EAAExI,eAAAA,CAAAA;AACjD,YAAA,IAAIwK,SAASF,QAAS7B,CAAAA,WAAW,IAAIgC,MAASH,GAAAA,QAAAA,CAAS5B,WAAW,EAAE;gBAClE,MAAMV,UAAAA,GAAasC,SAAS3B,MAAM,CAAC6B,SAASF,QAAS5B,CAAAA,WAAW,GAAG+B,MAAO,CAAA;AAC1E,gBAAA,IAAIzC,UAAY,EAAA;AACdqC,oBAAAA,MAAAA,GAASE,oBAAoBF,MAAQrC,EAAAA,UAAAA,CAAAA;AACvC;AACF;AACF;AACF;IACA,OAAOqC,MAAAA;AACT;AAEA,SAASX,eAAAA,CAAgBf,MAAgC,EAAE+B,MAAc,EAAA;AACvE,IAAA,IAAI/G,GAAM,GAAA,CAAA;IACV,IAAIC,IAAAA,GAAO+E,MAAOrG,CAAAA,MAAM,GAAG,CAAA;AAC3B,IAAA,MAAOqB,OAAOC,IAAM,CAAA;QAClB,MAAMC,GAAAA,GAAM,GAACF,GAAMC,IAAS,IAAA,CAAA;QAC5B,MAAMuB,KAAAA,GAAQwD,MAAM,CAAC9E,GAAI,CAAA;AACzB,QAAA,IAAIsB,QAAQuF,MAAQ,EAAA;AAClB/G,YAAAA,GAAAA,GAAME,GAAM,GAAA,CAAA;SACP,MAAA,IAAIsB,QAAQuF,MAAQ,EAAA;AACzB9G,YAAAA,IAAAA,GAAOC,GAAM,GAAA,CAAA;SACR,MAAA;YACL,OAAOA,GAAAA;AACT;AACF;AACA,IAAA,OAAO,EAAC;AACV;AAEA,SAAS0G,mBAAAA,CAAoBI,IAA2B,EAAEC,IAAoB,EAAA;AAC5E,IAAA,IAAI,CAACD,IAAM,EAAA;QACT,OAAO;AAAE,YAAA,GAAGC;AAAK,SAAA;AACnB;IACA,OAAO;AACL3C,QAAAA,eAAAA,EAAiB0C,IAAK1C,CAAAA,eAAe,GAAG2C,IAAAA,CAAK3C,eAAe;AAC5D9H,QAAAA,aAAAA,EAAewK,IAAKxK,CAAAA,aAAa,GAAGyK,IAAAA,CAAKzK,aAAa;AACtDiI,QAAAA,gBAAAA,EAAkBuC,IAAKvC,CAAAA,gBAAgB,GAAGwC,IAAAA,CAAKxC,gBAAgB;AAC/DhI,QAAAA,cAAAA,EAAgBuK,IAAKvK,CAAAA,cAAc,GAAGwK,IAAAA,CAAKxK;AAC7C,KAAA;AACF;AAEA,SAASiB,gBAAAA,CAAiBY,MAAkB,EAAEtE,MAAc,EAAA;IAC1D,OAAO;QACL2D,gBAAkBW,EAAAA,MAAAA,CAAOnE,KAAK,CAACH,MAAAA,CAAAA;QAC/B8D,IAAMQ,EAAAA,MAAAA,CAAOnE,KAAK,CAACH,MAAS,GAAA,CAAA,CAAA;QAC5B+D,IAAMO,EAAAA,MAAAA,CAAOnE,KAAK,CAACH,MAAS,GAAA,CAAA,CAAA;QAC5BgE,IAAMM,EAAAA,MAAAA,CAAOnE,KAAK,CAACH,MAAS,GAAA,CAAA,CAAA;QAC5BiE,IAAMK,EAAAA,MAAAA,CAAOnE,KAAK,CAACH,MAAS,GAAA,CAAA;AAC9B,KAAA;AACF;AAEA,SAAS6D,gBAAiBS,CAAAA,MAAkB,EAAEtE,MAAc,EAAE2D,gBAAwB,EAAA;AACpF,IAAA,MAAMuJ,SAAmB,EAAE;AAC3B,IAAA,IAAIhI,SAASlF,MAAS,GAAA,EAAA;AACtB,IAAA,IAAK,IAAIyE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAId,kBAAkBc,CAAK,EAAA,CAAA;AACzCyI,QAAAA,MAAAA,CAAOjE,IAAI,CAAC3E,MAAOvE,CAAAA,MAAM,CAACmF,MAAAA,CAAAA,CAAAA;QAC1BA,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,MAAMiI,UAAaD,GAAAA,MAAM,CAACvJ,gBAAAA,GAAmB,EAAE,GAAG,CAAA;IAClD,MAAMyJ,iBAAAA,GAAoB9I,MAAOvE,CAAAA,MAAM,CAACmF,MAAAA,CAAAA;AACxCA,IAAAA,MAAAA,IAAU,CAAIkI,GAAAA,iBAAAA;IACd,MAAMC,KAAAA,GAAQ,IAAIC,UAAWH,CAAAA,UAAAA,CAAAA;AAC7B,IAAA,IAAK,IAAI1I,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI0I,UAAc,EAAA;QAChC,MAAMI,IAAAA,GAAOjJ,MAAOkJ,CAAAA,KAAK,CAACtI,MAAAA,EAAAA,CAAAA;QAC1BmI,KAAK,CAAC5I,IAAI,GAAG8I,IAAAA;AACb,QAAA,IAAIA,OAAO,IAAM,EAAA;YACf,MAAME,WAAAA,GAAcnJ,MAAOkJ,CAAAA,KAAK,CAACtI,MAAAA,EAAAA,CAAAA;AACjC,YAAA,IAAK,IAAImC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIoG,aAAapG,CAAK,EAAA,CAAA;gBACpCgG,KAAK,CAAC5I,IAAI,GAAG8I,IAAAA;AACf;AACF;AACF;IACA,MAAMG,EAAAA,GAAK,IAAIzI,UAAWkI,CAAAA,UAAAA,CAAAA;IAC1B,MAAMQ,EAAAA,GAAK,IAAI1I,UAAWkI,CAAAA,UAAAA,CAAAA;AAC1B,IAAA,IAAIS,QAAW,GAAA,CAAA;AACf,IAAA,IAAK,IAAInJ,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI0I,YAAY1I,CAAK,EAAA,CAAA;QACnC,MAAM8I,IAAAA,GAAOF,KAAK,CAAC5I,CAAE,CAAA;AACrB,QAAA,IAAI8I,OAAO,IAAM,EAAA;YACf,MAAMM,EAAAA,GAAKvJ,MAAOkJ,CAAAA,KAAK,CAACtI,MAAAA,EAAAA,CAAAA;YACxB0I,QAAYL,IAAAA,IAAAA,GAAO,IAAOM,GAAAA,EAAAA,GAAK,CAACA,EAAAA;AAClC,SAAA,MAAO,IAAI,EAAEN,IAAAA,GAAO,IAAG,CAAI,EAAA;YACzBK,QAAYtJ,IAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;YACzBA,MAAU,IAAA,CAAA;AACZ;QACAwI,EAAE,CAACjJ,EAAE,GAAGmJ,QAAAA;AACV;AACA,IAAA,IAAIE,QAAW,GAAA,CAAA;AACf,IAAA,IAAK,IAAIrJ,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI0I,YAAY1I,CAAK,EAAA,CAAA;QACnC,MAAM8I,IAAAA,GAAOF,KAAK,CAAC5I,CAAE,CAAA;AACrB,QAAA,IAAI8I,OAAO,IAAM,EAAA;YACf,MAAMQ,EAAAA,GAAKzJ,MAAOkJ,CAAAA,KAAK,CAACtI,MAAAA,EAAAA,CAAAA;YACxB4I,QAAYP,IAAAA,IAAAA,GAAO,IAAOQ,GAAAA,EAAAA,GAAK,CAACA,EAAAA;AAClC,SAAA,MAAO,IAAI,EAAER,IAAAA,GAAO,IAAG,CAAI,EAAA;YACzBO,QAAYxJ,IAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;YACzBA,MAAU,IAAA,CAAA;AACZ;QACAyI,EAAE,CAAClJ,EAAE,GAAGqJ,QAAAA;AACV;AACA,IAAA,MAAME,SAAuB,EAAE;AAC/B,IAAA,IAAK,IAAIvJ,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI0I,YAAY1I,CAAK,EAAA,CAAA;AACnCuJ,QAAAA,MAAAA,CAAO/E,IAAI,CAAC;YACVgF,CAAGP,EAAAA,EAAE,CAACjJ,CAAE,CAAA;YACRyJ,CAAGP,EAAAA,EAAE,CAAClJ,CAAE,CAAA;AACR0J,YAAAA,OAAAA,EAAS,CAAC,EAAEd,KAAK,CAAC5I,CAAAA,CAAE,GAAG,IAAG;AAC5B,SAAA,CAAA;AACF;AACA,IAAA,MAAMb,WAA2B,EAAE;AACnC,IAAA,IAAI4H,KAAQ,GAAA,CAAA;IACZ,KAAK,MAAMC,OAAOyB,MAAQ,CAAA;AACxBtJ,QAAAA,QAAAA,CAASqF,IAAI,CAACmF,oBAAAA,CAAqBJ,OAAOK,KAAK,CAAC7C,OAAOC,GAAM,GAAA,CAAA,CAAA,CAAA,CAAA;AAC7DD,QAAAA,KAAAA,GAAQC,GAAM,GAAA,CAAA;AAChB;IACA,OAAO7H,QAAAA;AACT;AAEA,SAASM,mBACPI,CAAAA,MAAkB,EAClBtE,MAAc,EACd+C,SAAmD,EAAA;AAEnD,IAAA,IAAImC,SAASlF,MAAS,GAAA,EAAA;AACtB,IAAA,MAAM4D,WAA2B,EAAE;AACnC,IAAA,IAAIyJ,KAAQ,GAAA,CAAA;IACZ,GAAG;QACDA,KAAQ/I,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAAA,CAAAA;AACtB,QAAA,MAAMlD,UAAasC,GAAAA,MAAAA,CAAOvE,MAAM,CAACmF,MAAS,GAAA,CAAA,CAAA;QAC1CA,MAAU,IAAA,CAAA;AACV,QAAA,MAAMoJ,SAAYC,GAAAA,uBAAAA,CAAwBjK,MAAQY,EAAAA,MAAAA,EAAQmI,KAAOrL,EAAAA,UAAAA,CAAAA;AACjEkD,QAAAA,MAAAA,GAASoJ,UAAUpJ,MAAM;AACzB,QAAA,MAAMsJ,KAAQzL,GAAAA,SAAAA,CAAUuL,SAAUG,CAAAA,IAAI,CAACzM,UAAU,CAAA;AACjD,QAAA,IAAIwM,KAAO,EAAA;AACT,YAAA,KAAK,MAAME,OAAAA,IAAWF,KAAM5K,CAAAA,QAAQ,CAAE;AACpCA,gBAAAA,QAAAA,CAASqF,IAAI,CACXyF,OAAAA,CAAQC,GAAG,CAAC,CAACC,SAAW;AACtBX,wBAAAA,CAAAA,EAAGW,MAAMX,CAAC,GAAGK,UAAUG,IAAI,CAACI,EAAE,GAAGD,KAAAA,CAAMV,CAAC,GAAGI,SAAAA,CAAUG,IAAI,CAACK,EAAE,GAAGR,SAAUG,CAAAA,IAAI,CAACZ,EAAE;AAChFK,wBAAAA,CAAAA,EAAGU,MAAMX,CAAC,GAAGK,UAAUG,IAAI,CAACM,EAAE,GAAGH,KAAAA,CAAMV,CAAC,GAAGI,SAAAA,CAAUG,IAAI,CAACO,EAAE,GAAGV,SAAUG,CAAAA,IAAI,CAACV,EAAE;AAChFI,wBAAAA,OAAAA,EAASS,MAAMT;qBACjB,CAAA,CAAA,CAAA;AAEJ;AACF;AACF,KAAA,OAASd,QAAQnP,eAAiB;IAClC,OAAO0F,QAAAA;AACT;AAEA,SAAS2K,wBAAwBjK,MAAkB,EAAEtE,MAAc,EAAEqN,KAAa,EAAErL,UAAkB,EAAA;AACpG,IAAA,IAAIkD,MAASlF,GAAAA,MAAAA;AACb,IAAA,IAAIiP,IAAO,GAAA,CAAA;AACX,IAAA,IAAIC,IAAO,GAAA,CAAA;AACX,IAAA,IAAI7B,QAAQtP,qBAAuB,EAAA;QACjCkR,IAAO3K,GAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAAA,CAAAA;QACpBgK,IAAO5K,GAAAA,MAAAA,CAAOnE,KAAK,CAAC+E,MAAS,GAAA,CAAA,CAAA;QAC7BA,MAAU,IAAA,CAAA;KACL,MAAA;QACL+J,IAAO3K,GAAAA,MAAAA,CAAO6K,IAAI,CAACjK,MAAAA,CAAAA;QACnBgK,IAAO5K,GAAAA,MAAAA,CAAO6K,IAAI,CAACjK,MAAS,GAAA,CAAA,CAAA;QAC5BA,MAAU,IAAA,CAAA;AACZ;AACA,IAAA,IAAI2I,EAAK,GAAA,CAAA;AACT,IAAA,IAAIE,EAAK,GAAA,CAAA;AACT,IAAA,IAAIV,QAAQrP,kBAAoB,EAAA;QAC9B6P,EAAKoB,GAAAA,IAAAA;QACLlB,EAAKmB,GAAAA,IAAAA;AACP;AACA,IAAA,IAAIL,EAAK,GAAA,CAAA;AACT,IAAA,IAAIC,EAAK,GAAA,CAAA;AACT,IAAA,IAAIC,EAAK,GAAA,CAAA;AACT,IAAA,IAAIC,EAAK,GAAA,CAAA;AACT,IAAA,IAAI3B,QAAQpP,eAAiB,EAAA;QAC3B,MAAMmR,KAAAA,GAAQC,YAAY/K,MAAQY,EAAAA,MAAAA,CAAAA;QAClCA,MAAU,IAAA,CAAA;QACV2J,EAAKO,GAAAA,KAAAA;QACLJ,EAAKI,GAAAA,KAAAA;KACA,MAAA,IAAI/B,QAAQlP,wBAA0B,EAAA;AAC3C0Q,QAAAA,EAAAA,GAAKQ,YAAY/K,MAAQY,EAAAA,MAAAA,CAAAA;QACzB8J,EAAKK,GAAAA,WAAAA,CAAY/K,QAAQY,MAAS,GAAA,CAAA,CAAA;QAClCA,MAAU,IAAA,CAAA;KACL,MAAA,IAAImI,QAAQjP,oBAAsB,EAAA;AACvCyQ,QAAAA,EAAAA,GAAKQ,YAAY/K,MAAQY,EAAAA,MAAAA,CAAAA;QACzB4J,EAAKO,GAAAA,WAAAA,CAAY/K,QAAQY,MAAS,GAAA,CAAA,CAAA;QAClC6J,EAAKM,GAAAA,WAAAA,CAAY/K,QAAQY,MAAS,GAAA,CAAA,CAAA;QAClC8J,EAAKK,GAAAA,WAAAA,CAAY/K,QAAQY,MAAS,GAAA,CAAA,CAAA;QAClCA,MAAU,IAAA,CAAA;AACZ;IACA,OAAO;QACLuJ,IAAM,EAAA;AAAEzM,YAAAA,UAAAA;AAAY6L,YAAAA,EAAAA;AAAIE,YAAAA,EAAAA;AAAIc,YAAAA,EAAAA;AAAIC,YAAAA,EAAAA;AAAIC,YAAAA,EAAAA;AAAIC,YAAAA;AAAG,SAAA;AAC3C9J,QAAAA;AACF,KAAA;AACF;AAEA,SAASmK,WAAAA,CAAY/K,MAAkB,EAAEtE,MAAc,EAAA;IACrD,OAAOsE,MAAAA,CAAOnE,KAAK,CAACH,MAAU,CAAA,GAAA,KAAA;AAChC;AAEA,SAASoO,qBAAqBJ,MAAoB,EAAA;IAChD,IAAIA,MAAAA,CAAOrJ,MAAM,KAAK,CAAG,EAAA;QACvB,OAAOqJ,MAAAA;AACT;AACA,IAAA,MAAMnJ,SAAuB,EAAE;AAC/B,IAAA,IAAK,IAAIJ,CAAI,GAAA,CAAA,EAAGA,IAAIuJ,MAAOrJ,CAAAA,MAAM,EAAEF,CAAK,EAAA,CAAA;QACtC,MAAM6K,OAAAA,GAAUtB,MAAM,CAACvJ,CAAE,CAAA;QACzB,MAAMwI,IAAAA,GAAOe,MAAM,CAAC,CAACvJ,IAAI,CAAA,IAAKuJ,MAAOrJ,CAAAA,MAAM,CAAC;AAC5CE,QAAAA,MAAAA,CAAOoE,IAAI,CAACqG,OAAAA,CAAAA;AACZ,QAAA,IAAI,CAACA,OAAQnB,CAAAA,OAAO,IAAI,CAAClB,IAAAA,CAAKkB,OAAO,EAAE;AACrCtJ,YAAAA,MAAAA,CAAOoE,IAAI,CAAC;gBACVgF,CAAG,EAACqB,CAAAA,OAAQrB,CAAAA,CAAC,GAAGhB,IAAKgB,CAAAA,CAAC,IAAI,GAAA;gBAC1BC,CAAG,EAACoB,CAAAA,OAAQpB,CAAAA,CAAC,GAAGjB,IAAKiB,CAAAA,CAAC,IAAI,GAAA;gBAC1BC,OAAS,EAAA;AACX,aAAA,CAAA;AACF;AACF;IACA,OAAOtJ,MAAAA;AACT;AAEA,SAASR,cAAcT,QAAwB,EAAA;IAC7C,IAAIA,QAAAA,CAASe,MAAM,KAAK,CAAG,EAAA;QACzB,OAAO;YAAEb,IAAM,EAAA,CAAA;YAAGC,IAAM,EAAA,CAAA;YAAGC,IAAM,EAAA,CAAA;YAAGC,IAAM,EAAA;AAAE,SAAA;AAC9C;IACA,IAAIH,IAAAA,GAAOyL,OAAOC,iBAAiB;IACnC,IAAIzL,IAAAA,GAAOwL,OAAOC,iBAAiB;IACnC,IAAIxL,IAAAA,GAAOuL,OAAOE,iBAAiB;IACnC,IAAIxL,IAAAA,GAAOsL,OAAOE,iBAAiB;IACnC,KAAK,MAAMf,WAAW9K,QAAU,CAAA;QAC9B,KAAK,MAAMgL,SAASF,OAAS,CAAA;AAC3B5K,YAAAA,IAAAA,GAAO4L,IAAKC,CAAAA,GAAG,CAAC7L,IAAAA,EAAM8K,MAAMX,CAAC,CAAA;AAC7BlK,YAAAA,IAAAA,GAAO2L,IAAKC,CAAAA,GAAG,CAAC5L,IAAAA,EAAM6K,MAAMV,CAAC,CAAA;AAC7BlK,YAAAA,IAAAA,GAAO0L,IAAKE,CAAAA,GAAG,CAAC5L,IAAAA,EAAM4K,MAAMX,CAAC,CAAA;AAC7BhK,YAAAA,IAAAA,GAAOyL,IAAKE,CAAAA,GAAG,CAAC3L,IAAAA,EAAM2K,MAAMV,CAAC,CAAA;AAC/B;AACF;IACA,OAAO;AAAEpK,QAAAA,IAAAA;AAAMC,QAAAA,IAAAA;AAAMC,QAAAA,IAAAA;AAAMC,QAAAA;AAAK,KAAA;AAClC;AAEA,SAASV,cACPvB,CAAAA,UAAkB,EAClBtB,aAAuC,EACvCC,gBAAyC,EACzCiD,QAAwB,EACxBE,IAAY,EACZC,IAAY,EACZC,IAAY,EACZC,IAAY,EAAA;IAEZ,OAAO;AACLjC,QAAAA,UAAAA;QACA6N,YAAcnP,EAAAA,aAAa,CAACsB,UAAAA,CAAW,IAAI,CAAA;QAC3C8N,eAAiBnP,EAAAA,gBAAgB,CAACqB,UAAAA,CAAW,IAAI,CAAA;AACjD8B,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;AACAL,QAAAA;AACF,KAAA;AACF;AAEA,SAASrC,2BAA2BiG,KAAyB,EAAA;IAC3D,OAAOkI,IAAAA,CAAKE,GAAG,CAAC,EAAIF,EAAAA,IAAAA,CAAKK,KAAK,CAACR,MAAOS,CAAAA,QAAQ,CAACxI,KAAAA,CAAAA,GAASA,KAASnJ,GAAAA,4BAAAA,CAAAA,CAAAA;AACnE;AAEA,SAASoD,uBAAuB+F,KAAyB,EAAA;IACvD,OAAOkI,IAAAA,CAAKE,GAAG,CAAC,CAAGF,EAAAA,IAAAA,CAAKK,KAAK,CAACR,MAAOS,CAAAA,QAAQ,CAACxI,KAAAA,CAAAA,GAASA,KAASlJ,GAAAA,uBAAAA,CAAAA,CAAAA;AAClE;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class SFNTReader {
|
|
2
|
+
_buffer;
|
|
3
|
+
_byteOffset;
|
|
4
|
+
_view;
|
|
5
|
+
constructor(_buffer, _byteOffset = 0){
|
|
6
|
+
this._buffer = _buffer;
|
|
7
|
+
this._byteOffset = _byteOffset;
|
|
8
|
+
this._view = new DataView(_buffer);
|
|
9
|
+
}
|
|
10
|
+
get buffer() {
|
|
11
|
+
return this._buffer;
|
|
12
|
+
}
|
|
13
|
+
uint8(offset) {
|
|
14
|
+
return this._view.getUint8(this._byteOffset + offset);
|
|
15
|
+
}
|
|
16
|
+
int8(offset) {
|
|
17
|
+
return this._view.getInt8(this._byteOffset + offset);
|
|
18
|
+
}
|
|
19
|
+
uint16(offset) {
|
|
20
|
+
return this._view.getUint16(this._byteOffset + offset, false);
|
|
21
|
+
}
|
|
22
|
+
int16(offset) {
|
|
23
|
+
return this._view.getInt16(this._byteOffset + offset, false);
|
|
24
|
+
}
|
|
25
|
+
uint32(offset) {
|
|
26
|
+
return this._view.getUint32(this._byteOffset + offset, false);
|
|
27
|
+
}
|
|
28
|
+
int32(offset) {
|
|
29
|
+
return this._view.getInt32(this._byteOffset + offset, false);
|
|
30
|
+
}
|
|
31
|
+
fixed(offset) {
|
|
32
|
+
return this.int32(offset) / 65536;
|
|
33
|
+
}
|
|
34
|
+
tag(offset) {
|
|
35
|
+
return String.fromCharCode(this.uint8(offset), this.uint8(offset + 1), this.uint8(offset + 2), this.uint8(offset + 3));
|
|
36
|
+
}
|
|
37
|
+
slice(offset, length) {
|
|
38
|
+
return new DataView(this._buffer, this._byteOffset + offset, length);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { SFNTReader };
|
|
43
|
+
//# sourceMappingURL=sfnt_reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfnt_reader.js","sources":["../../../src/text/font/sfnt_reader.ts"],"sourcesContent":["export class SFNTReader {\r\n private readonly _view: DataView;\r\n constructor(\r\n private readonly _buffer: ArrayBuffer,\r\n private readonly _byteOffset = 0\r\n ) {\r\n this._view = new DataView(_buffer);\r\n }\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n uint8(offset: number) {\r\n return this._view.getUint8(this._byteOffset + offset);\r\n }\r\n int8(offset: number) {\r\n return this._view.getInt8(this._byteOffset + offset);\r\n }\r\n uint16(offset: number) {\r\n return this._view.getUint16(this._byteOffset + offset, false);\r\n }\r\n int16(offset: number) {\r\n return this._view.getInt16(this._byteOffset + offset, false);\r\n }\r\n uint32(offset: number) {\r\n return this._view.getUint32(this._byteOffset + offset, false);\r\n }\r\n int32(offset: number) {\r\n return this._view.getInt32(this._byteOffset + offset, false);\r\n }\r\n fixed(offset: number) {\r\n return this.int32(offset) / 65536;\r\n }\r\n tag(offset: number) {\r\n return String.fromCharCode(\r\n this.uint8(offset),\r\n this.uint8(offset + 1),\r\n this.uint8(offset + 2),\r\n this.uint8(offset + 3)\r\n );\r\n }\r\n slice(offset: number, length: number) {\r\n return new DataView(this._buffer, this._byteOffset + offset, length);\r\n }\r\n}\r\n"],"names":["SFNTReader","_view","_byteOffset","_buffer","DataView","buffer","uint8","offset","getUint8","int8","getInt8","uint16","getUint16","int16","getInt16","uint32","getUint32","int32","getInt32","fixed","tag","String","fromCharCode","slice","length"],"mappings":"AAAO,MAAMA,UAAAA,CAAAA;;;IACMC,KAAgB;AACjC,IAAA,WAAA,CACE,OAAqC,EACrC,WAAiBC,GAAc,CAAC,CAChC;aAFiBC,OAAAA,GAAAA,OAAAA;aACAD,WAAAA,GAAAA,WAAAA;AAEjB,QAAA,IAAI,CAACD,KAAK,GAAG,IAAIG,QAASD,CAAAA,OAAAA,CAAAA;AAC5B;AACA,IAAA,IAAIE,MAAS,GAAA;QACX,OAAO,IAAI,CAACF,OAAO;AACrB;AACAG,IAAAA,KAAAA,CAAMC,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACO,QAAQ,CAAC,IAAI,CAACN,WAAW,GAAGK,MAAAA,CAAAA;AAChD;AACAE,IAAAA,IAAAA,CAAKF,MAAc,EAAE;QACnB,OAAO,IAAI,CAACN,KAAK,CAACS,OAAO,CAAC,IAAI,CAACR,WAAW,GAAGK,MAAAA,CAAAA;AAC/C;AACAI,IAAAA,MAAAA,CAAOJ,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACW,SAAS,CAAC,IAAI,CAACV,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAM,IAAAA,KAAAA,CAAMN,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACa,QAAQ,CAAC,IAAI,CAACZ,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAQ,IAAAA,MAAAA,CAAOR,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACe,SAAS,CAAC,IAAI,CAACd,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAU,IAAAA,KAAAA,CAAMV,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACiB,QAAQ,CAAC,IAAI,CAAChB,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAY,IAAAA,KAAAA,CAAMZ,MAAc,EAAE;AACpB,QAAA,OAAO,IAAI,CAACU,KAAK,CAACV,MAAU,CAAA,GAAA,KAAA;AAC9B;AACAa,IAAAA,GAAAA,CAAIb,MAAc,EAAE;QAClB,OAAOc,MAAAA,CAAOC,YAAY,CACxB,IAAI,CAAChB,KAAK,CAACC,MAAAA,CAAAA,EACX,IAAI,CAACD,KAAK,CAACC,SAAS,CACpB,CAAA,EAAA,IAAI,CAACD,KAAK,CAACC,MAAAA,GAAS,IACpB,IAAI,CAACD,KAAK,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAExB;IACAgB,KAAMhB,CAAAA,MAAc,EAAEiB,MAAc,EAAE;QACpC,OAAO,IAAIpB,QAAS,CAAA,IAAI,CAACD,OAAO,EAAE,IAAI,CAACD,WAAW,GAAGK,MAAQiB,EAAAA,MAAAA,CAAAA;AAC/D;AACF;;;;"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { clamp } from '@zephyr3d/base';
|
|
2
|
+
import { buildMSDFShape } from './shape.js';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_PADDING = 1;
|
|
5
|
+
const CHANNEL_MASKS = [
|
|
6
|
+
1,
|
|
7
|
+
2,
|
|
8
|
+
4
|
|
9
|
+
];
|
|
10
|
+
const EPSILON = 1e-8;
|
|
11
|
+
const CONTOUR_PROBE_DISTANCES = [
|
|
12
|
+
1,
|
|
13
|
+
4,
|
|
14
|
+
16
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Generate a runtime RGB(A) distance field bitmap from a parsed glyph.
|
|
18
|
+
*
|
|
19
|
+
* Distances are encoded in output texel units, which matches the shader-side
|
|
20
|
+
* `distanceRange` logic and keeps the field scale-invariant across font sizes.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/ function generateMSDF(glyph, options) {
|
|
24
|
+
const shape = buildMSDFShape(glyph.contours);
|
|
25
|
+
const width = Math.max(1, options.width | 0);
|
|
26
|
+
const height = Math.max(1, options.height | 0);
|
|
27
|
+
const padding = options.padding ?? DEFAULT_PADDING;
|
|
28
|
+
const boundsWidth = Math.max(1, glyph.xMax - glyph.xMin);
|
|
29
|
+
const boundsHeight = Math.max(1, glyph.yMax - glyph.yMin);
|
|
30
|
+
const drawableWidth = Math.max(1, width - padding * 2);
|
|
31
|
+
const drawableHeight = Math.max(1, height - padding * 2);
|
|
32
|
+
const scale = Math.min(drawableWidth / boundsWidth, drawableHeight / boundsHeight);
|
|
33
|
+
const placedWidth = boundsWidth * scale;
|
|
34
|
+
const placedHeight = boundsHeight * scale;
|
|
35
|
+
const translateX = padding + (drawableWidth - placedWidth) * 0.5 - glyph.xMin * scale;
|
|
36
|
+
const translateY = padding + (drawableHeight - placedHeight) * 0.5 + glyph.yMax * scale;
|
|
37
|
+
const contourInsideSigns = shape.contours.map((contour)=>determineContourInsideSign(contour, shape.contours));
|
|
38
|
+
const fields = new Float32Array(width * height * 4);
|
|
39
|
+
for(let y = 0; y < height; y++){
|
|
40
|
+
for(let x = 0; x < width; x++){
|
|
41
|
+
const sourceX = (x + 0.5 - translateX) / scale;
|
|
42
|
+
const sourceY = -(y + 0.5 - translateY) / scale;
|
|
43
|
+
const inside = pointInShape(sourceX, sourceY, shape.contours);
|
|
44
|
+
let minDistance = Number.POSITIVE_INFINITY;
|
|
45
|
+
const channelSamples = [
|
|
46
|
+
null,
|
|
47
|
+
null,
|
|
48
|
+
null
|
|
49
|
+
];
|
|
50
|
+
for(let contourIndex = 0; contourIndex < shape.contours.length; contourIndex++){
|
|
51
|
+
const contour = shape.contours[contourIndex];
|
|
52
|
+
const insideSign = contourInsideSigns[contourIndex];
|
|
53
|
+
for (const edge of contour){
|
|
54
|
+
const sample = sampleEdge(edge, sourceX, sourceY, insideSign);
|
|
55
|
+
if (sample.absDistance < minDistance) {
|
|
56
|
+
minDistance = sample.absDistance;
|
|
57
|
+
}
|
|
58
|
+
for(let channelIndex = 0; channelIndex < CHANNEL_MASKS.length; channelIndex++){
|
|
59
|
+
if ((edge.color & CHANNEL_MASKS[channelIndex]) !== 0 && betterSample(sample, channelSamples[channelIndex])) {
|
|
60
|
+
channelSamples[channelIndex] = sample;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!Number.isFinite(minDistance)) {
|
|
66
|
+
minDistance = 0;
|
|
67
|
+
}
|
|
68
|
+
const sdfDistance = (inside ? minDistance : -minDistance) * scale;
|
|
69
|
+
const base = (y * width + x) * 4;
|
|
70
|
+
fields[base + 0] = (channelSamples[0]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
71
|
+
fields[base + 1] = (channelSamples[1]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
72
|
+
fields[base + 2] = (channelSamples[2]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
73
|
+
fields[base + 3] = sdfDistance;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
applyMedianCorrection(fields, width, height, options.range);
|
|
77
|
+
const pixels = new Uint8Array(width * height * 4);
|
|
78
|
+
for(let i = 0; i < width * height; i++){
|
|
79
|
+
const base = i * 4;
|
|
80
|
+
pixels[base + 0] = encodeDistance(fields[base + 0], options.range);
|
|
81
|
+
pixels[base + 1] = encodeDistance(fields[base + 1], options.range);
|
|
82
|
+
pixels[base + 2] = encodeDistance(fields[base + 2], options.range);
|
|
83
|
+
pixels[base + 3] = encodeDistance(fields[base + 3], options.range);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
width,
|
|
87
|
+
height,
|
|
88
|
+
pixels,
|
|
89
|
+
scale,
|
|
90
|
+
translateX,
|
|
91
|
+
translateY
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function encodeDistance(distance, range) {
|
|
95
|
+
return Math.round(clamp(0.5 + distance / (2 * Math.max(range, 1e-6)), 0, 1) * 255);
|
|
96
|
+
}
|
|
97
|
+
function betterSample(next, current) {
|
|
98
|
+
return !current || next.absDistance < current.absDistance - 1e-6 || Math.abs(next.absDistance - current.absDistance) <= 1e-6 && next.dot < current.dot;
|
|
99
|
+
}
|
|
100
|
+
function sampleEdge(edge, x, y, insideSign) {
|
|
101
|
+
return edge.kind === 'line' ? sampleLineEdge(edge, x, y, insideSign) : sampleQuadraticEdge(edge, x, y, insideSign);
|
|
102
|
+
}
|
|
103
|
+
function sampleLineEdge(edge, x, y, insideSign) {
|
|
104
|
+
const dx = edge.p1.x - edge.p0.x;
|
|
105
|
+
const dy = edge.p1.y - edge.p0.y;
|
|
106
|
+
const lenSq = dx * dx + dy * dy;
|
|
107
|
+
if (lenSq <= EPSILON) {
|
|
108
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, 1, 0, x, y, insideSign);
|
|
109
|
+
}
|
|
110
|
+
const qx = x - edge.p0.x;
|
|
111
|
+
const qy = y - edge.p0.y;
|
|
112
|
+
const t = (qx * dx + qy * dy) / lenSq;
|
|
113
|
+
if (t <= 0) {
|
|
114
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, dx, dy, x, y, insideSign);
|
|
115
|
+
}
|
|
116
|
+
if (t >= 1) {
|
|
117
|
+
return sampleEndpoint(edge.p1.x, edge.p1.y, dx, dy, x, y, insideSign);
|
|
118
|
+
}
|
|
119
|
+
const cx = edge.p0.x + dx * t;
|
|
120
|
+
const cy = edge.p0.y + dy * t;
|
|
121
|
+
const deltaX = x - cx;
|
|
122
|
+
const deltaY = y - cy;
|
|
123
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
124
|
+
return {
|
|
125
|
+
distance: signedPerpendicularDistance(dx, dy, deltaX, deltaY, insideSign),
|
|
126
|
+
absDistance,
|
|
127
|
+
dot: directionDot(deltaX, deltaY, dx, dy, absDistance)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function sampleQuadraticEdge(edge, x, y, insideSign) {
|
|
131
|
+
const t = findNearestQuadraticParameter(edge, x, y);
|
|
132
|
+
if (t <= EPSILON) {
|
|
133
|
+
const tangent = quadraticEndpointTangent(edge, true);
|
|
134
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, tangent.x, tangent.y, x, y, insideSign);
|
|
135
|
+
}
|
|
136
|
+
if (t >= 1 - EPSILON) {
|
|
137
|
+
const tangent = quadraticEndpointTangent(edge, false);
|
|
138
|
+
return sampleEndpoint(edge.p2.x, edge.p2.y, tangent.x, tangent.y, x, y, insideSign);
|
|
139
|
+
}
|
|
140
|
+
const point = evaluateQuadratic(edge, t);
|
|
141
|
+
const tangent = quadraticTangent(edge, t);
|
|
142
|
+
const deltaX = x - point.x;
|
|
143
|
+
const deltaY = y - point.y;
|
|
144
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
145
|
+
return {
|
|
146
|
+
distance: signedPerpendicularDistance(tangent.x, tangent.y, deltaX, deltaY, insideSign),
|
|
147
|
+
absDistance,
|
|
148
|
+
dot: directionDot(deltaX, deltaY, tangent.x, tangent.y, absDistance)
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function sampleEndpoint(px, py, tx, ty, x, y, insideSign) {
|
|
152
|
+
const deltaX = x - px;
|
|
153
|
+
const deltaY = y - py;
|
|
154
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
155
|
+
return {
|
|
156
|
+
distance: signedPerpendicularDistance(tx, ty, deltaX, deltaY, insideSign),
|
|
157
|
+
absDistance,
|
|
158
|
+
dot: directionDot(deltaX, deltaY, tx, ty, absDistance)
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function signedPerpendicularDistance(tx, ty, dx, dy, insideSign) {
|
|
162
|
+
const tangentLength = Math.hypot(tx, ty);
|
|
163
|
+
if (tangentLength <= EPSILON) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
return insideSign * cross(tx, ty, dx, dy) / tangentLength;
|
|
167
|
+
}
|
|
168
|
+
function directionDot(dx, dy, tx, ty, absDistance) {
|
|
169
|
+
const tangentLength = Math.hypot(tx, ty);
|
|
170
|
+
if (absDistance <= EPSILON || tangentLength <= EPSILON) {
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
return Math.abs((dx * tx + dy * ty) / (absDistance * tangentLength));
|
|
174
|
+
}
|
|
175
|
+
function findNearestQuadraticParameter(edge, x, y) {
|
|
176
|
+
const ax = edge.p0.x - 2 * edge.p1.x + edge.p2.x;
|
|
177
|
+
const ay = edge.p0.y - 2 * edge.p1.y + edge.p2.y;
|
|
178
|
+
const bx = 2 * (edge.p1.x - edge.p0.x);
|
|
179
|
+
const by = 2 * (edge.p1.y - edge.p0.y);
|
|
180
|
+
const cx = edge.p0.x - x;
|
|
181
|
+
const cy = edge.p0.y - y;
|
|
182
|
+
const roots = solveCubic(2 * dot(ax, ay, ax, ay), 3 * dot(ax, ay, bx, by), dot(bx, by, bx, by) + 2 * dot(ax, ay, cx, cy), dot(bx, by, cx, cy));
|
|
183
|
+
let nearestT = 0;
|
|
184
|
+
let minDistanceSq = Number.POSITIVE_INFINITY;
|
|
185
|
+
for (const candidate of [
|
|
186
|
+
0,
|
|
187
|
+
...roots,
|
|
188
|
+
1
|
|
189
|
+
]){
|
|
190
|
+
const t = clamp(candidate, 0, 1);
|
|
191
|
+
const point = evaluateQuadratic(edge, t);
|
|
192
|
+
const distX = x - point.x;
|
|
193
|
+
const distY = y - point.y;
|
|
194
|
+
const distanceSq = distX * distX + distY * distY;
|
|
195
|
+
if (distanceSq < minDistanceSq - 1e-6) {
|
|
196
|
+
minDistanceSq = distanceSq;
|
|
197
|
+
nearestT = t;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return nearestT;
|
|
201
|
+
}
|
|
202
|
+
function evaluateQuadratic(edge, t) {
|
|
203
|
+
const mt = 1 - t;
|
|
204
|
+
return {
|
|
205
|
+
x: mt * mt * edge.p0.x + 2 * mt * t * edge.p1.x + t * t * edge.p2.x,
|
|
206
|
+
y: mt * mt * edge.p0.y + 2 * mt * t * edge.p1.y + t * t * edge.p2.y
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function quadraticTangent(edge, t) {
|
|
210
|
+
const x = 2 * ((1 - t) * (edge.p1.x - edge.p0.x) + t * (edge.p2.x - edge.p1.x));
|
|
211
|
+
const y = 2 * ((1 - t) * (edge.p1.y - edge.p0.y) + t * (edge.p2.y - edge.p1.y));
|
|
212
|
+
if (Math.hypot(x, y) > EPSILON) {
|
|
213
|
+
return {
|
|
214
|
+
x,
|
|
215
|
+
y
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return quadraticEndpointTangent(edge, t < 0.5);
|
|
219
|
+
}
|
|
220
|
+
function quadraticEndpointTangent(edge, atStart) {
|
|
221
|
+
const tx = atStart ? edge.p1.x - edge.p0.x : edge.p2.x - edge.p1.x;
|
|
222
|
+
const ty = atStart ? edge.p1.y - edge.p0.y : edge.p2.y - edge.p1.y;
|
|
223
|
+
if (Math.hypot(tx, ty) > EPSILON) {
|
|
224
|
+
return {
|
|
225
|
+
x: tx,
|
|
226
|
+
y: ty
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const fallbackX = edge.p2.x - edge.p0.x;
|
|
230
|
+
const fallbackY = edge.p2.y - edge.p0.y;
|
|
231
|
+
if (Math.hypot(fallbackX, fallbackY) > EPSILON) {
|
|
232
|
+
return {
|
|
233
|
+
x: fallbackX,
|
|
234
|
+
y: fallbackY
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
x: 1,
|
|
239
|
+
y: 0
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function solveCubic(a, b, c, d) {
|
|
243
|
+
if (Math.abs(a) <= EPSILON) {
|
|
244
|
+
return solveQuadratic(b, c, d);
|
|
245
|
+
}
|
|
246
|
+
const invA = 1 / a;
|
|
247
|
+
const B = b * invA;
|
|
248
|
+
const C = c * invA;
|
|
249
|
+
const D = d * invA;
|
|
250
|
+
const p = C - B * B / 3;
|
|
251
|
+
const q = 2 * B * B * B / 27 - B * C / 3 + D;
|
|
252
|
+
const disc = q * q / 4 + p * p * p / 27;
|
|
253
|
+
const shift = -B / 3;
|
|
254
|
+
if (disc > EPSILON) {
|
|
255
|
+
const sqrtDisc = Math.sqrt(disc);
|
|
256
|
+
return [
|
|
257
|
+
Math.cbrt(-q / 2 + sqrtDisc) + Math.cbrt(-q / 2 - sqrtDisc) + shift
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
if (disc < -1e-8) {
|
|
261
|
+
const acosArg = clamp(-q / 2 / Math.sqrt(-p * p * p / 27), -1, 1);
|
|
262
|
+
const theta = Math.acos(acosArg);
|
|
263
|
+
const rho = 2 * Math.sqrt(-p / 3);
|
|
264
|
+
return dedupeRoots([
|
|
265
|
+
rho * Math.cos(theta / 3) + shift,
|
|
266
|
+
rho * Math.cos((theta + 2 * Math.PI) / 3) + shift,
|
|
267
|
+
rho * Math.cos((theta + 4 * Math.PI) / 3) + shift
|
|
268
|
+
]);
|
|
269
|
+
}
|
|
270
|
+
const u = Math.cbrt(-q / 2);
|
|
271
|
+
return dedupeRoots([
|
|
272
|
+
2 * u + shift,
|
|
273
|
+
-u + shift
|
|
274
|
+
]);
|
|
275
|
+
}
|
|
276
|
+
function solveQuadratic(a, b, c) {
|
|
277
|
+
if (Math.abs(a) <= EPSILON) {
|
|
278
|
+
return Math.abs(b) <= EPSILON ? [] : [
|
|
279
|
+
-c / b
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
const disc = b * b - 4 * a * c;
|
|
283
|
+
if (disc < -1e-8) {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
if (Math.abs(disc) <= EPSILON) {
|
|
287
|
+
return [
|
|
288
|
+
-b / (2 * a)
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
const sqrtDisc = Math.sqrt(Math.max(disc, 0));
|
|
292
|
+
return dedupeRoots([
|
|
293
|
+
(-b - sqrtDisc) / (2 * a),
|
|
294
|
+
(-b + sqrtDisc) / (2 * a)
|
|
295
|
+
]);
|
|
296
|
+
}
|
|
297
|
+
function dedupeRoots(values) {
|
|
298
|
+
const roots = [];
|
|
299
|
+
for (const value of values){
|
|
300
|
+
if (!roots.some((root)=>Math.abs(root - value) <= 1e-7)) {
|
|
301
|
+
roots.push(value);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return roots;
|
|
305
|
+
}
|
|
306
|
+
function determineContourInsideSign(contour, allContours) {
|
|
307
|
+
for (const edge of contour){
|
|
308
|
+
const probe = edgeProbe(edge);
|
|
309
|
+
const tangentLength = Math.hypot(probe.tangent.x, probe.tangent.y);
|
|
310
|
+
if (tangentLength <= EPSILON) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const normalX = -probe.tangent.y / tangentLength;
|
|
314
|
+
const normalY = probe.tangent.x / tangentLength;
|
|
315
|
+
for (const distance of CONTOUR_PROBE_DISTANCES){
|
|
316
|
+
const leftInside = pointInShape(probe.point.x + normalX * distance, probe.point.y + normalY * distance, allContours);
|
|
317
|
+
const rightInside = pointInShape(probe.point.x - normalX * distance, probe.point.y - normalY * distance, allContours);
|
|
318
|
+
if (leftInside !== rightInside) {
|
|
319
|
+
return leftInside ? 1 : -1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return approximateContourSign(contour);
|
|
324
|
+
}
|
|
325
|
+
function edgeProbe(edge) {
|
|
326
|
+
if (edge.kind === 'line') {
|
|
327
|
+
return {
|
|
328
|
+
point: {
|
|
329
|
+
x: (edge.p0.x + edge.p1.x) * 0.5,
|
|
330
|
+
y: (edge.p0.y + edge.p1.y) * 0.5
|
|
331
|
+
},
|
|
332
|
+
tangent: {
|
|
333
|
+
x: edge.p1.x - edge.p0.x,
|
|
334
|
+
y: edge.p1.y - edge.p0.y
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
point: evaluateQuadratic(edge, 0.5),
|
|
340
|
+
tangent: quadraticTangent(edge, 0.5)
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function approximateContourSign(contour) {
|
|
344
|
+
let area = 0;
|
|
345
|
+
for (const edge of contour){
|
|
346
|
+
if (edge.kind === 'line') {
|
|
347
|
+
area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
348
|
+
} else {
|
|
349
|
+
area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
350
|
+
area += cross(edge.p1.x, edge.p1.y, edge.p2.x, edge.p2.y);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return area >= 0 ? 1 : -1;
|
|
354
|
+
}
|
|
355
|
+
function applyMedianCorrection(fields, width, height, range) {
|
|
356
|
+
const correctionThreshold = 1;
|
|
357
|
+
const edgeThreshold = Math.max(range + 1, 1);
|
|
358
|
+
for(let i = 0; i < width * height; i++){
|
|
359
|
+
const base = i * 4;
|
|
360
|
+
const median = median3(fields[base + 0], fields[base + 1], fields[base + 2]);
|
|
361
|
+
const sdf = fields[base + 3];
|
|
362
|
+
if (Math.abs(sdf) <= edgeThreshold && Math.abs(median - sdf) > correctionThreshold) {
|
|
363
|
+
fields[base + 0] = sdf;
|
|
364
|
+
fields[base + 1] = sdf;
|
|
365
|
+
fields[base + 2] = sdf;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function pointInShape(x, y, contours) {
|
|
370
|
+
let winding = 0;
|
|
371
|
+
for (const contour of contours){
|
|
372
|
+
winding += contourWinding(x, y, contour);
|
|
373
|
+
}
|
|
374
|
+
return winding !== 0;
|
|
375
|
+
}
|
|
376
|
+
function contourWinding(x, y, contour) {
|
|
377
|
+
let winding = 0;
|
|
378
|
+
for (const edge of contour){
|
|
379
|
+
if (edge.kind === 'line') {
|
|
380
|
+
winding += windingContribution(x, y, edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
381
|
+
} else {
|
|
382
|
+
let prevX = edge.p0.x;
|
|
383
|
+
let prevY = edge.p0.y;
|
|
384
|
+
const steps = 16;
|
|
385
|
+
for(let i = 1; i <= steps; i++){
|
|
386
|
+
const t = i / steps;
|
|
387
|
+
const point = evaluateQuadratic(edge, t);
|
|
388
|
+
winding += windingContribution(x, y, prevX, prevY, point.x, point.y);
|
|
389
|
+
prevX = point.x;
|
|
390
|
+
prevY = point.y;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return winding;
|
|
395
|
+
}
|
|
396
|
+
function windingContribution(px, py, x0, y0, x1, y1) {
|
|
397
|
+
if (y0 <= py) {
|
|
398
|
+
if (y1 > py && cross(x1 - x0, y1 - y0, px - x0, py - y0) > 0) {
|
|
399
|
+
return 1;
|
|
400
|
+
}
|
|
401
|
+
} else if (y1 <= py && cross(x1 - x0, y1 - y0, px - x0, py - y0) < 0) {
|
|
402
|
+
return -1;
|
|
403
|
+
}
|
|
404
|
+
return 0;
|
|
405
|
+
}
|
|
406
|
+
function median3(a, b, c) {
|
|
407
|
+
return a + b + c - Math.min(a, b, c) - Math.max(a, b, c);
|
|
408
|
+
}
|
|
409
|
+
function cross(ax, ay, bx, by) {
|
|
410
|
+
return ax * by - ay * bx;
|
|
411
|
+
}
|
|
412
|
+
function dot(ax, ay, bx, by) {
|
|
413
|
+
return ax * bx + ay * by;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export { generateMSDF };
|
|
417
|
+
//# sourceMappingURL=generator.js.map
|