{"version":3,"file":"bliss-svg-builder.cjs","names":["endX","endY","sc.createZeroSizedAnchor","sc.createSpace","sc.createDot","sc.createComma","sc.createHeart","sc.createEar","sc.createFiber","sc.createCircle","sc.createHalfCircle","sc.createQuarterCircle","sc.createOpenCircle","sc.createWave","sc.createHalfWave","sc.createHorizontalQuarterWave","sc.createVerticalQuarterWave","sc.createVerticalLine","sc.createHorizontalLine","sc.createAscendingDiagonalLine","sc.createDescendingDiagonalLine","sc.createDiagonalLineOutsideCircle","sc.createAscendingDiagonalLineInsideCircle","sc.createDescendingDiagonalLineInsideCircle","sc.createExternalGlyph","#wrapWithAnchorAndGroup","#separateAnchorAndGroupOptions","#classifyParts","#children","#blissObj","#parentElement","#relativeToParentX","#relativeToParentY","#previousElement","#level","#sharedOptions","#key","#codeName","#externalGlyphSpacing","#childStartOffset","#getFirstCharacterElement","#classifiedParts","#isSpaceGroup","#advanceX","#char","#isBlissGlyph","#isExternalGlyph","#positionIndicatorGroup","#leafWidth","#leafHeight","#handlePredefinedElement","#handleCompositeElement","#anchorOffsetX","#anchorOffsetY","#height","#leafX","#leafY","#isCharacter","#isShape","#calculateBounds","#extraPathOptions","#getInheritedOption","#extractPositionFromOptions","#parseOptions","#applyDefinitionMetadata","#expandPartRecursive","#parseCodeStringToParts","#ctx","#level","#nodeRef","#parentRef","#generation","#resolveIndex","#relocate","#assertReachable","#findSnapshot","#parseGlyphs","#parseParts","#applyDefaultsOverrides","#syncGeneration","#removeGlyphFromGroup","#parseGlyph","#parsePart","#applyOrClearIndicators","#updateGlyphIdentityAfterIndicatorChange","#processOptions","#processAllOptions","#resolveOpts","#normalizeGlyphCodes","#toRaw","#flagWordParts","#rawBlissObj","#rebuild","#mutationCtx","#isRawSpaceGroup","#makeSpaceGroup","#removeGlyphGroup","#generation","#sharedOptions","#assignKeys","#elementsCache","#groupsCache","#warnings","#processedOptions","#getNonSpaceGroupIndices","#parseGroupWithOpts","#textFallbackInternalForm","#normalizePartCodes","#flagWordPartsInArray","#SPACE_CODES","#decomposeCodeString","#resolveToBuiltInCode","#svgCode","#validateCode","#extractReferencedCodes","#detectType","#validateReferences","#hasCircularReference","#defineShape","#defineGlyph","#defineExternalGlyph","#resolveBareAliases","#defineBare"],"sources":["../src/external-font-data/liberation-sans-svg-path-data.js","../src/lib/bliss-constants.js","../src/lib/bliss-shape-creators.js","../src/lib/bliss-glyph-data.js","../src/lib/bliss-element-definitions.js","../src/lib/bliss-element.js","../src/lib/bliss-head-glyph-exclusions.js","../src/lib/indicator-utils.js","../src/lib/bliss-parser.js","../src/lib/element-handle.js","../src/lib/bliss-svg-builder.js","../src/index.js"],"sourcesContent":["/**\r\n * liberation-sans-svg-path-data.js\r\n *\r\n * Derived from Liberation Sans Regular (Liberation Fonts Project)\r\n * Copyright © 2012–2018 Red Hat, Inc.\r\n *\r\n * This file contains extracted and modified glyph path data.\r\n * Licensed under the Apache License, Version 2.0.\r\n * See the FONT_LICENSE file in this directory for the full license text.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n */\r\n\r\n// Somewhat arbitrary numbers. Need to be somewhat adjusted to align with normal font letter spacing...\r\nconst defaultLeftSideBearing = 107;\r\nconst defaultRightSideBearing = 165;\r\nconst fontUnitToGridUnitDivisor = 356;\r\n\r\nfunction getGridUnitWidth(width) {\r\n  return (width - defaultLeftSideBearing - defaultRightSideBearing) / fontUnitToGridUnitDivisor;\r\n}\r\n\r\nfunction getGridUnitKerningRule(kerning) {\r\n  return kerning / fontUnitToGridUnitDivisor;\r\n}\r\n\r\nfunction precision(pathString, decimals = 7) {\r\n  return pathString.replace(/-?\\d+\\.?\\d*/g, match => \r\n    parseFloat(parseFloat(match).toFixed(decimals)).toString()\r\n  );\r\n}\r\n\r\nconst alphabetData = {\r\n  // e[X]ternal glyphs (i.e. letters and other non-Bliss characters).\r\n  // Supports: Base Latin (a-z, A-Z), Latin Extended (European languages), Cyrillic (Russian).\r\n  'Xa': {\r\n    getPath: () => precision(`M1.1633399724960327,16.04509925842285q-0.45802998542785645,0,-0.6884499788284302,-0.24165916442871094t-0.23041999340057373,-0.6631603240966797q0,-0.4720802307128906,0.3105049729347229,-0.7249794006347656t1.0017650723457336,-0.2697601318359375l0.6828298568725586,-0.011240005493164062l0,-0.16579055786132812q0,-0.37091922760009766,-0.15735983848571777,-0.5310897827148438t-0.4945601224899292,-0.1601696014404297q-0.3400099277496338,0,-0.4945598840713501,0.11520957946777344t-0.18546003103256226,0.36810970306396484l-0.5282800197601318,-0.04776954650878906q0.12926000356674194,-0.8205204010009766,1.2195399403572083,-0.8205204010009766q0.5732401609420776,0,0.8626700639724731,0.26273536682128906t0.2894299030303955,0.7601051330566406l0,1.3094596862792969q0,0.22480010986328125,0.05901002883911133,0.3386049270629883t0.22480010986328125,0.11380481719970703q0.0730600357055664,0,0.16578984260559082,-0.019669532775878906l0,0.31472015380859375q-0.19107985496520996,0.04496002197265625,-0.39058995246887207,0.04496002197265625q-0.28099989891052246,0,-0.40885496139526367,-0.14752483367919922t-0.1447150707244873,-0.46224498748779297l-0.016860008239746094,0q-0.19388985633850098,0.34843921661376953,-0.45100486278533936,0.49315452575683594t-0.6252250671386719,0.14471435546875ZM1.2785500288009644,15.665749549865723q0.278190016746521,0,0.49456000328063965,-0.1264495849609375t0.34141504764556885,-0.34703540802001953t0.1250448226928711,-0.4538145065307617l0,-0.2500896453857422l-0.5535699129104614,0.011240005493164062q-0.3568699359893799,0.005620002746582031,-0.5409250259399414,0.0730600357055664t-0.28240495920181274,0.20793914794921875t-0.09834998846054077,0.36811065673828125q0,0.24728012084960938,0.13347500562667847,0.3821601867675781t0.3807550072669983,0.13487911224365234Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"a\"\r\n  },\r\n  'Xb': {\r\n    getPath: () => precision(`M2.958930015563965,14.45464038848877q0,1.590458869934082,-1.118380069732666,1.590458869934082q-0.3456299304962158,0,-0.574644923210144,-0.1250438690185547t-0.37232500314712524,-0.40323543548583984l-0.005620002746582031,0q0,0.08711051940917969,-0.011240005493164062,0.2655448913574219t-0.016860008239746094,0.20653533935546875l-0.4889400005340576,0q0.016860008239746094,-0.15174007415771484,0.016860008239746094,-0.6266298294067383l0,-3.543410301208496l0.5058000087738037,0l0,1.1886301040649414q0,0.1826496124267578,-0.011240005493164062,0.4299297332763672l0.011240005493164062,0q0.140500009059906,-0.2922401428222656,0.37232500314712524,-0.4186897277832031t0.574644923210144,-0.1264505386352539q0.5760500431060791,0,0.847214937210083,0.38778018951416016t0.271165132522583,1.1745805740356445ZM2.427839994430542,14.471500396728516q0,-0.6378707885742188,-0.16860008239746094,-0.9132499694824219t-0.5479499101638794,-0.27538013458251953q-0.4271199703216553,0,-0.6224149465560913,0.2922401428222656t-0.1952950358390808,0.9272994995117188q0,0.5985298156738281,0.1910800337791443,0.8837451934814453t0.6210099458694458,0.2852144241333008q0.3821600675582886,0,0.5521649122238159,-0.28240489959716797t0.17000508308410645,-0.9174642562866211Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"b\"\r\n  },\r\n  'Xc': {\r\n    getPath: () => precision(`M0.7727500200271606,14.45464038848877q0,0.606959342956543,0.1910799741744995,0.8991994857788086t0.5760500431060791,0.2922401428222656q0.26976001262664795,0,0.4510049819946289,-0.1461200714111328t0.22339487075805664,-0.4496002197265625l0.5114200115203857,0.03372001647949219q-0.05900979042053223,0.43836021423339844,-0.373729944229126,0.6996898651123047t-0.7980399131774902,0.26132965087890625q-0.6378700733184814,0,-0.9736650586128235,-0.40323448181152344t-0.33579498529434204,-1.1759843826293945q0,-0.7671308517456055,0.33719998598098755,-1.170365333557129t0.966640055179596,-0.40323543548583984q0.4664599895477295,0,0.7741549015045166,0.24166011810302734t0.38637495040893555,0.6659698486328125l-0.5198497772216797,0.03934001922607422q-0.03934001922607422,-0.252899169921875,-0.1995100975036621,-0.40182971954345703t-0.45521998405456543,-0.14892959594726562q-0.4018300771713257,0,-0.5816700458526611,0.2669496536254883t-0.17983996868133545,0.899200439453125Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16.05,\r\n    char: \"c\"\r\n  },\r\n  'Xd': {\r\n    getPath: () => precision(`M2.3070099353790283,15.499959945678711q-0.14049983024597168,0.2922401428222656,-0.37232494354248047,0.4186897277832031t-0.5746450424194336,0.1264495849609375q-0.5760499238967896,0,-0.847214937210083,-0.38777923583984375t-0.27116501331329346,-1.1745796203613281q0,-1.5904607772827148,1.1183799505233765,-1.5904607772827148q0.34563004970550537,0,0.5760500431060791,0.1264505386352539t0.37091994285583496,0.40182971954345703l0.005620002746582031,0l-0.005620002746582031,-0.3400096893310547l0,-1.2616901397705078l0.5058000087738037,0l0,3.543410301208496q0,0.47488975524902344,0.016860008239746094,0.6266298294067383l-0.4833199977874756,0q-0.008430004119873047,-0.04496002197265625,-0.0182650089263916,-0.20794010162353516t-0.009835004806518555,-0.28100013732910156l-0.011240005493164062,0ZM0.7727500200271606,14.465880393981934q0,0.6378698348999023,0.1685999631881714,0.9132499694824219t0.547950029373169,0.2753791809082031q0.4299299716949463,0,0.6238200664520264,-0.29785919189453125t0.19388985633850098,-0.9244899749755859q0,-0.6041507720947266,-0.19388985633850098,-0.8851499557495117t-0.6182000637054443,-0.28100013732910156q-0.3821600675582886,0,-0.5521650314331055,0.28240489959716797t-0.1700049638748169,0.9174652099609375Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"d\"\r\n  },\r\n  'Xe': {\r\n    getPath: () => precision(`M0.7755600214004517,14.575469970703125q0,0.5226602554321289,0.21636998653411865,0.8064699172973633t0.6322499513626099,0.2838096618652344q0.3287700414657593,0,0.5268751382827759,-0.13206958770751953t0.2683548927307129,-0.33438968658447266l0.44397997856140137,0.1264495849609375q-0.2725698947906494,0.7193593978881836,-1.2392100095748901,0.7193593978881836q-0.6743999719619751,0,-1.0270549654960632,-0.40182971954345703t-0.35265499353408813,-1.194249153137207q0,-0.7530803680419922,0.35265499353408813,-1.1549100875854492t1.0073849558830261,-0.40183067321777344q1.3403700590133667,0,1.3403700590133667,1.6157503128051758l0,0.06744003295898438l-2.169319987297058,0ZM2.42221999168396,14.187689781188965q-0.042150020599365234,-0.48050975799560547,-0.24446988105773926,-0.7010946273803711t-0.5816701650619507,-0.22058486938476562q-0.36810994148254395,0,-0.5830749273300171,0.24587440490722656t-0.23182499408721924,0.6758050918579102l1.6410399675369263,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"e\"\r\n  },\r\n  'Xf': {\r\n    getPath: () => precision(`M1.0144100189208984,13.316590309143066l0,2.6723098754882812l-0.5058000087738037,0l0,-2.6723098754882812l-0.42712000757455826,0l0,-0.36811065673828125l0.42712000757455826,0l0,-0.3428192138671875q0,-0.4158802032470703,0.18264997005462646,-0.5985307693481445t0.559190034866333,-0.1826496124267578q0.21074998378753662,0,0.3568699359893799,0.03372001647949219l0,0.38496971130371094q-0.12644994258880615,-0.022480010986328125,-0.2247999906539917,-0.022480010986328125q-0.19388997554779053,0,-0.281000018119812,0.09835052490234375t-0.08710992336273193,0.3568696975708008l0,0.2725696563720703l0.5929099321365356,0l0,0.36811065673828125l-0.5929099321365356,0Z`),\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 15.99,\r\n    char: \"f\",\r\n    kerningRules: {\r\n      \"f\": getGridUnitKerningRule(37),\r\n    }\r\n  },\r\n  'Xg': {\r\n    getPath: () => precision(`M1.5398800373077393,17.183149337768555q-0.49737000465393066,0,-0.7924200296401978,-0.19529342651367188t-0.3793500065803528,-0.5549755096435547l0.5086100101470947,-0.07306098937988281q0.050579965114593506,0.21075057983398438,0.22339493036270142,0.3245563507080078t0.4538151025772095,0.11380386352539062q0.755889892578125,0,0.755889892578125,-0.8851499557495117l0,-0.4889392852783203l-0.005620002746582031,0q-0.1433098316192627,0.2922391891479492,-0.3933999538421631,0.43976497650146484t-0.5844799280166626,0.1475238800048828q-0.559190034866333,0,-0.8219250440597534,-0.37091922760009766t-0.2627350091934204,-1.1661500930786133q0,-0.8064699172973633,0.2824050188064575,-1.1900348663330078t0.8584549427032471,-0.38356494903564453q0.32315003871917725,0,0.5605950355529785,0.14752483367919922t0.36670494079589844,0.42009544372558594l0.005620002746582031,0q0,-0.08430004119873047,0.011240005493164062,-0.2922401428222656t0.022480010986328125,-0.22761058807373047l0.48050999641418457,0q-0.016860008239746094,0.15174007415771484,-0.016860008239746094,0.6294403076171875l0,2.3238697052001953q0,1.2813596725463867,-1.2729299068450928,1.2813596725463867ZM2.3098199367523193,14.468689918518066q0,-0.37092018127441406,-0.10116004943847656,-0.6392745971679688t-0.285214900970459,-0.4102602005004883t-0.4172849655151367,-0.1419048309326172q-0.3877800703048706,0,-0.564810037612915,0.28100013732910156t-0.17702996730804443,0.9104394912719727q0,0.6238203048706055,0.16578996181488037,0.8963899612426758t0.567620038986206,0.2725696563720703q0.23884999752044678,0,0.42430996894836426,-0.14049911499023438t0.2866199016571045,-0.40323543548583984t0.10116004943847656,-0.6252250671386719Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 17.18,\r\n    char: \"g\"\r\n  },\r\n  'Xh': {\r\n    getPath: () => precision(`M0.8907700181007385,13.468330383300781q0.16298002004623413,-0.29786014556884766,0.39199501276016235,-0.43695545196533203t0.5802649259567261,-0.13909530639648438q0.49456000328063965,0,0.7291951179504395,0.24587535858154297t0.2346348762512207,0.8247346878051758l0,2.026010513305664l-0.5086100101470947,0l0,-1.9276599884033203q0,-0.3203401565551758,-0.05901002883911133,-0.47629547119140625t-0.19388985633850098,-0.22901439666748047t-0.3737300634384155,-0.0730600357055664q-0.3568699359893799,0,-0.5718350410461426,0.24728012084960938t-0.21496492624282837,0.6659698486328125l0,1.7927799224853516l-0.5058000385761261,0l0,-4.170040130615234l0.5058000385761261,0l0,1.0846595764160156q0,0.17141056060791016,-0.009835004806518555,0.35406017303466797t-0.01264500617980957,0.21075057983398438l0.008430004119873047,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 15.99,\r\n    char: \"h\"\r\n  },\r\n  'Xi': {\r\n    getPath: () => precision(`M0.3849700093269348,12.302180290222168l0,-0.4833202362060547l0.5058000087738037,0l0,0.4833202362060547l-0.5058000087738037,0ZM0.3849700093269348,15.988900184631348l0,-3.0404205322265625l0.5058000087738037,0l0,3.0404205322265625l-0.5058000087738037,0Z`),\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 15.99,\r\n    char: \"i\"\r\n  },\r\n  'Xj': {\r\n    getPath: () => precision(`M0.3849700093269348,12.302180290222168l0,-0.4833202362060547l0.5058000087738037,0l0,0.4833202362060547l-0.5058000087738037,0ZM0.8907700181007385,16.365440368652344q0,0.4299297332763672,-0.16860002279281616,0.6238193511962891t-0.5057999938726425,0.19388961791992188q-0.21637000143527985,0,-0.35686999559402466,-0.025289535522460938l0,-0.3905906677246094l0.1742199957370758,0.0168609619140625q0.19389000535011292,0,0.27256999909877777,-0.10116004943847656t0.07868000864982605,-0.3934001922607422l0,-3.341090202331543l0.5058000087738037,0l0,3.4169607162475586Z`),\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 17.18,\r\n    char: \"j\"\r\n  },\r\n  'Xk': {\r\n    getPath: () => precision(`M2.2929599285125732,15.988900184631348l-1.028459906578064,-1.3881397247314453l-0.37092000246047974,0.3062896728515625l0,1.0818500518798828l-0.5058000087738037,0l0,-4.170040130615234l0.5058000087738037,0l0,2.604869842529297l1.3347498774528503,-1.475250244140625l0.5929100513458252,0l-1.233590006828308,1.306650161743164l1.2982200384140015,1.7337703704833984l-0.5929100513458252,0Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 15.99,\r\n    char: \"k\"\r\n  },\r\n  'Xl': {\r\n    getPath: () => precision(`M0.38778001070022583,15.988900184631348l0,-4.170040130615234l0.5058000087738037,0l0,4.170040130615234l-0.5058000087738037,0Z`),\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 15.99,\r\n    char: \"l\"\r\n  },\r\n  'Xm': {\r\n    getPath: () => precision(`M2.1580801010131836,15.988900184631348l0,-1.9276599884033203q0,-0.44116973876953125,-0.12083005905151367,-0.6097698211669922t-0.43555009365081787,-0.16860008239746094q-0.3231499195098877,0,-0.5114198923110962,0.24728012084960938t-0.18827003240585327,0.6968793869018555l0,1.7618703842163086l-0.5029900372028351,0l0,-2.3913097381591797q0,-0.5310907363891602,-0.016859978437423706,-0.6491107940673828l0.47769999504089355,0q0.0028100013732910156,0.014050483703613281,0.005620002746582031,0.07587051391601562t0.007025003433227539,0.1419048309326172t0.009835004806518555,0.3020753860473633l0.008430004119873047,0q0.16298002004623413,-0.323150634765625,0.37373000383377075,-0.4496002197265625t0.5142300128936768,-0.1264505386352539q0.34563004970550537,0,0.5465449094772339,0.13769054412841797t0.27959513664245605,0.43836021423339844l0.008430004119873047,0q0.15735983848571777,-0.3062906265258789,0.3807549476623535,-0.44117069244384766t0.5409250259399414,-0.13488006591796875q0.46083998680114746,0,0.670184850692749,0.2500905990600586t0.20934486389160156,0.8205194473266602l0,2.026010513305664l-0.5001797676086426,0l0,-1.9276599884033203q0,-0.44116973876953125,-0.12083005905151367,-0.6097698211669922t-0.4355499744415283,-0.16860008239746094q-0.33157992362976074,0,-0.5156350135803223,0.24587440490722656t-0.18405485153198242,0.6982851028442383l0,1.7618703842163086l-0.5001800060272217,0Z`),\r\n    get width() { return getGridUnitWidth(1706); },\r\n    height: 15.99,\r\n    char: \"m\"\r\n  },\r\n  'Xn': {\r\n    getPath: () => precision(`M2.3182499408721924,15.988900184631348l0,-1.9276599884033203q0,-0.3006706237792969,-0.05901002883911133,-0.4664602279663086t-0.18826985359191895,-0.23884963989257812t-0.37935006618499756,-0.0730600357055664q-0.36529994010925293,0,-0.5760500431060791,0.2500896453857422t-0.21074992418289185,0.6940698623657227l0,1.7618703842163086l-0.5058000385761261,0l0,-2.3913097381591797q0,-0.5310907363891602,-0.016859978437423706,-0.6491107940673828l0.47769999504089355,0q0.0028100013732910156,0.014050483703613281,0.005620002746582031,0.07587051391601562t0.007025003433227539,0.1419048309326172t0.009835004806518555,0.3020753860473633l0.008430004119873047,0q0.1742200255393982,-0.31472015380859375,0.4032350182533264,-0.4453849792480469t0.569024920463562,-0.13066577911376953q0.5001800060272217,0,0.7320051193237305,0.2486858367919922t0.2318248748779297,0.8219242095947266l0,2.026010513305664l-0.5086100101470947,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 15.99,\r\n    char: \"n\"\r\n  },\r\n  'Xo': {\r\n    getPath: () => precision(`M2.958930015563965,14.465880393981934q0,0.798039436340332,-0.35124993324279785,1.188629150390625t-1.02003014087677,0.39058971405029297q-0.665969967842102,0,-1.0059799551963806,-0.40604400634765625t-0.34000998735427856,-1.1731748580932617q0,-1.5736007690429688,1.3628499507904053,-1.5736007690429688q0.6968799829483032,0,1.025650143623352,0.38356494903564453t0.3287699222564697,1.1900358200073242ZM2.427839994430542,14.465880393981934q0,-0.6294403076171875,-0.18686509132385254,-0.9146556854248047t-0.6280349493026733,-0.2852144241333008q-0.44397997856140137,0,-0.6420849561691284,0.2908344268798828t-0.19810497760772705,0.9090356826782227q0,0.6013393402099609,0.19529497623443604,0.9034147262573242t0.6139850616455078,0.3020744323730469q0.45521998405456543,0,0.6505148410797119,-0.2922391891479492t0.19529509544372559,-0.9132499694824219Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"o\"\r\n  },\r\n  'Xp': {\r\n    getPath: () => precision(`M2.958930015563965,14.45464038848877q0,1.590458869934082,-1.118380069732666,1.590458869934082q-0.7024999856948853,0,-0.9441599249839783,-0.5282793045043945l-0.014050006866455078,0q0.011240005493164062,0.022480010986328125,0.011240005493164062,0.47770023345947266l0,1.188629150390625l-0.5058000087738037,0l0,-3.613658905029297q0,-0.4692707061767578,-0.016860008239746094,-0.6210107803344727l0.4889400005340576,0q0.0028100013732910156,0.011240005493164062,0.008430004119873047,0.08008575439453125t0.01264500617980957,0.21215438842773438t0.007025003433227539,0.1967000961303711l0.011240005493164062,0q0.13488000631332397,-0.28100013732910156,0.35686999559402466,-0.4116649627685547t0.5844799280166626,-0.13066482543945312q0.562000036239624,0,0.8401901721954346,0.3765401840209961t0.27818989753723145,1.1830101013183594ZM2.427839994430542,14.465880393981934q0,-0.6350603103637695,-0.17141008377075195,-0.9076299667358398t-0.5451399087905884,-0.2725706100463867q-0.3006700277328491,0,-0.470674991607666,0.1264505386352539t-0.2585200071334839,0.3948049545288086t-0.08851498365402222,0.6982851028442383q0,0.5985298156738281,0.1910800337791443,0.8823394775390625t0.6210099458694458,0.2838096618652344q0.37654006481170654,0,0.5493549108505249,-0.27678489685058594t0.17281508445739746,-0.9287042617797852Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 17.18,\r\n    char: \"p\"\r\n  },\r\n  'Xq': {\r\n    getPath: () => precision(`M1.3600399494171143,16.04509925842285q-0.5788599252700806,0,-0.8486199378967285,-0.39058971405029297t-0.26976001262664795,-1.171769142150879q0,-1.5904607772827148,1.1183799505233765,-1.5904607772827148q0.34563004970550537,0,0.5704300403594971,0.12223529815673828t0.376539945602417,0.40604496002197266l0.005620002746582031,0q0,-0.08430004119873047,0.011240005493164062,-0.2908344268798828t0.022480010986328125,-0.22058582305908203l0.4861299991607666,0q-0.01967000961303711,0.16579055786132812,-0.01967000961303711,0.8289499282836914l0,3.4450597763061523l-0.5058000087738037,0l0,-1.2335891723632812l0.011240005493164062,-0.46084022521972656l-0.005620002746582031,0q-0.15173983573913574,0.30066967010498047,-0.373729944229126,0.4285249710083008t-0.5788600444793701,0.1278543472290039ZM2.3070099353790283,14.432160377502441q0,-0.5929107666015625,-0.19388985633850098,-0.8795299530029297t-0.6182000637054443,-0.2866201400756836q-0.3849700689315796,0,-0.553570032119751,0.2866201400756836t-0.1685999631881714,0.9132499694824219q0,0.6378698348999023,0.1700049638748169,0.9132499694824219t0.5465450286865234,0.2753791809082031q0.4299299716949463,0,0.6238200664520264,-0.3062896728515625t0.19388985633850098,-0.9160594940185547Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 17.18,\r\n    char: \"q\"\r\n  },\r\n  'Xr': {\r\n    getPath: () => precision(`M0.3990199863910675,15.988900184631348l0,-2.3323001861572266q0,-0.3203401565551758,-0.016859978437423706,-0.7081203460693359l0.47769999504089355,0q0.022480010986328125,0.5170402526855469,0.022480010986328125,0.6210107803344727l0.011240005493164062,0q0.1208299994468689,-0.3905906677246094,0.2781899571418762,-0.533900260925293t0.44397997856140137,-0.143310546875q0.10116004943847656,0,0.20513010025024414,0.028100013732910156l0,0.4636507034301758q-0.10116004943847656,-0.028100013732910156,-0.26976001262664795,-0.028100013732910156q-0.3147200345993042,0,-0.48050999641418457,0.2711648941040039t-0.16579002141952515,0.7769651412963867l0,1.5848398208618164l-0.5058000385761261,0Z`),\r\n    get width() { return getGridUnitWidth(682); },\r\n    height: 15.99,\r\n    char: \"r\"\r\n  },\r\n  'Xs': {\r\n    getPath: () => precision(`M2.6695001125335693,15.148710250854492q0,0.4299297332763672,-0.3245551586151123,0.6631593704223633t-0.9090349674224854,0.2332296371459961q-0.5676199793815613,0,-0.8753150105476379,-0.18686389923095703t-0.4004249721765518,-0.5830755233764648l0.4467899948358536,-0.08710956573486328q0.06462997198104858,0.24446964263916016,0.26695001125335693,0.3582744598388672t0.5619999766349792,0.11380481719970703q0.3849700689315796,0,0.5634050369262695,-0.11801910400390625t0.1784350872039795,-0.35406017303466797q0,-0.179840087890625,-0.12364006042480469,-0.2922401428222656t-0.39902007579803467,-0.18546009063720703l-0.3624899387359619,-0.09554004669189453q-0.4355500340461731,-0.11240005493164062,-0.6196050643920898,-0.22058486938476562t-0.2880249619483948,-0.26273536682128906t-0.10397002100944519,-0.3793497085571289q0,-0.4158802032470703,0.2964549958705902,-0.6336545944213867t0.8640750050544739,-0.2177753448486328q0.5029900074005127,0,0.7994449138641357,0.17702960968017578t0.3751351833343506,0.5676202774047852l-0.45521998405456543,0.05620002746582031q-0.042150020599365234,-0.20232009887695312,-0.22620511054992676,-0.3105049133300781t-0.49315500259399414,-0.108184814453125q-0.34282004833221436,0,-0.5058000087738037,0.10396957397460938t-0.16297996044158936,0.31472015380859375q0,0.12926006317138672,0.0674399733543396,0.2135601043701172t0.19951003789901733,0.1433095932006836t0.5563799142837524,0.1629800796508789q0.4018300771713257,0.10116004943847656,0.5788601636886597,0.18686485290527344t0.27959489822387695,0.18967533111572266t0.15876507759094238,0.24025535583496094t0.05620002746582031,0.3105049133300781Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16.05,\r\n    char: \"s\"\r\n  },\r\n  'Xt': {\r\n    getPath: () => precision(`M1.5567400455474854,15.96642017364502q-0.25009000301361084,0.06743907928466797,-0.5114200115203857,0.06743907928466797q-0.6069600284099579,0,-0.6069600284099579,-0.6884489059448242l0,-2.028820037841797l-0.3512500077486038,0l0,-0.36811065673828125l0.37091998755931854,0l0.14893001317977905,-0.6800193786621094l0.33719998598098755,0l0,0.6800193786621094l0.562000036239624,0l0,0.36811065673828125l-0.562000036239624,0l0,1.919229507446289q0,0.21918010711669922,0.0716550350189209,0.3076953887939453t0.24868500232696533,0.08851432800292969q0.10115993022918701,0,0.2922400236129761,-0.03933906555175781l0,0.3737297058105469Z`),\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16.03,\r\n    char: \"t\"\r\n  },\r\n  'Xu': {\r\n    getPath: () => precision(`M0.8823400139808655,12.948479652404785l0,1.9276599884033203q0,0.3006706237792969,0.05900996923446655,0.4664602279663086t0.1882699728012085,0.23885059356689453t0.37935006618499756,0.07305908203125q0.36529994010925293,0,0.5760500431060791,-0.2500896453857422t0.21074986457824707,-0.6940698623657227l0,-1.7618703842163086l0.5058000087738037,0l0,2.391310691833496q0,0.5310897827148438,0.016860008239746094,0.6491098403930664l-0.47769999504089355,0q-0.0028100013732910156,-0.014050483703613281,-0.005620002746582031,-0.07587051391601562t-0.007025003433227539,-0.1419048309326172t-0.009835004806518555,-0.3020744323730469l-0.008430004119873047,0q-0.17421984672546387,0.31471920013427734,-0.40323495864868164,0.4453849792480469t-0.569024920463562,0.13066387176513672q-0.5001800656318665,0,-0.7320050597190857,-0.24868392944335938t-0.23182499408721924,-0.821925163269043l0,-2.026010513305664l0.5086100101470947,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"u\"\r\n  },\r\n  'Xv': {\r\n    getPath: () => precision(`M1.7225300073623657,15.988900184631348l-0.5985300540924072,0l-1.1043299529701471,-3.0404205322265625l0.5395199749618769,0l0.6687800288200378,1.9782400131225586q0.0365300178527832,0.11240005493164062,0.19388997554779053,0.6659708023071289l0.09835004806518555,-0.32877063751220703l0.10958993434906006,-0.33158016204833984l0.6912599802017212,-1.9838600158691406l0.5367100238800049,0Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 15.99,\r\n    char: \"v\"\r\n  },\r\n  'Xw': {\r\n    getPath: () => precision(`M3.2989399433135986,15.988900184631348l-0.5872900485992432,0l-0.5310897827148438,-2.1496505737304688l-0.10116004943847656,-0.47488975524902344q-0.02529001235961914,0.1264505386352539,-0.07868003845214844,0.3638954162597656t-0.5732400417327881,2.2606449127197266l-0.5844799876213074,0l-0.851429995149374,-3.0404205322265625l0.5001800023019314,0l0.5142300128936768,2.0653505325317383q0.01967000961303711,0.06744003295898438,0.12082993984222412,0.5563802719116211l0.047770023345947266,-0.20794010162353516l0.6350600719451904,-2.413790702819824l0.5423299074172974,0l0.5310900211334229,2.0878305435180664l0.12926006317138672,0.533900260925293l0.08711004257202148,-0.3905906677246094l0.5760498046875,-2.23114013671875l0.49456024169921875,0Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 15.99,\r\n    char: \"w\"\r\n  },\r\n  'Xx': {\r\n    getPath: () => precision(`M2.250809907913208,15.988900184631348l-0.8177099227905273,-1.247640609741211l-0.8233299851417542,1.247640609741211l-0.5451399981975555,0l1.0818499624729156,-1.5623598098754883l-1.0312699675559998,-1.4780607223510742l0.5591899752616882,0l0.7587000131607056,1.1830101013183594l0.7530801296234131,-1.1830101013183594l0.5648097991943359,0l-1.031269907951355,1.4724407196044922l1.0958999395370483,1.5679798126220703l-0.564810037612915,0Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 15.99,\r\n    char: \"x\"\r\n  },\r\n  'Xy': {\r\n    getPath: () => precision(`M0.5367100238800049,17.183149337768555q-0.207940012216568,0,-0.348440021276474,-0.030908584594726562l0,-0.3793506622314453q0.10677999258041382,0.016859054565429688,0.23603999614715576,0.016859054565429688q0.4720800220966339,0,0.7474599778652191,-0.6940689086914062l0.047770023345947266,-0.12083053588867188l-1.205489999614656,-3.026370048522949l0.5395199721679091,0l0.6406800150871277,1.6803808212280273q0.014050006866455078,0.03933906555175781,0.03372001647949219,0.09413433074951172t0.12644994258880615,0.36670494079589844t0.11521005630493164,0.34844017028808594l0.19669997692108154,-0.5535697937011719l0.665969967842102,-1.9360904693603516l0.5339000225067139,0l-1.1689599752426147,3.0404205322265625q-0.1882699728012085,0.4861307144165039,-0.3512500524520874,0.7235746383666992t-0.3610849380493164,0.3540611267089844t-0.4481949806213379,0.11661338806152344Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 17.18,\r\n    char: \"y\"\r\n  },\r\n  'Xz': {\r\n    getPath: () => precision(`M0.23322999477386475,15.988900184631348l0,-0.38496971130371094l1.7000499963760376,-2.264860153198242l-1.6045099794864655,0l0,-0.3905906677246094l2.2030400335788727,0l0,0.38497066497802734l-1.7028600573539734,2.264860153198242l1.7618700861930847,0l0,0.39058971405029297l-2.357590079307556,0Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 15.99,\r\n    char: \"z\"\r\n  },\r\n  'Xå': {\r\n    getPath: () => precision(`M1.1633399724960327,16.04509925842285q-0.45802998542785645,0,-0.6884499788284302,-0.24165916442871094t-0.23041999340057373,-0.6631603240966797q0,-0.4720802307128906,0.3105049729347229,-0.7249794006347656t1.0017650723457336,-0.2697601318359375l0.6828298568725586,-0.011240005493164062l0,-0.16579055786132812q0,-0.37091922760009766,-0.15735983848571777,-0.5310897827148438t-0.4945601224899292,-0.1601696014404297q-0.3400099277496338,0,-0.4945598840713501,0.11520957946777344t-0.18546003103256226,0.36810970306396484l-0.5282800197601318,-0.04776954650878906q0.12926000356674194,-0.8205204010009766,1.2195399403572083,-0.8205204010009766q0.5732401609420776,0,0.8626700639724731,0.26273536682128906t0.2894299030303955,0.7601051330566406l0,1.3094596862792969q0,0.22480010986328125,0.05901002883911133,0.3386049270629883t0.22480010986328125,0.11380481719970703q0.0730600357055664,0,0.16578984260559082,-0.019669532775878906l0,0.31472015380859375q-0.19107985496520996,0.04496002197265625,-0.39058995246887207,0.04496002197265625q-0.28099989891052246,0,-0.40885496139526367,-0.14752483367919922t-0.1447150707244873,-0.46224498748779297l-0.016860008239746094,0q-0.19388985633850098,0.34843921661376953,-0.45100486278533936,0.49315452575683594t-0.6252250671386719,0.14471435546875ZM1.2785500288009644,15.665749549865723q0.278190016746521,0,0.49456000328063965,-0.1264495849609375t0.34141504764556885,-0.34703540802001953t0.1250448226928711,-0.4538145065307617l0,-0.2500896453857422l-0.5535699129104614,0.011240005493164062q-0.3568699359893799,0.005620002746582031,-0.5409250259399414,0.0730600357055664t-0.28240495920181274,0.20793914794921875t-0.09834998846054077,0.36811065673828125q0,0.24728012084960938,0.13347500562667847,0.3821601867675781t0.3807550072669983,0.13487911224365234ZM2.245189905166626,12.026800155639648q0,0.28100013732910156,-0.199509859085083,0.48050975799560547t-0.48050999641418457,0.1995096206665039t-0.48050999641418457,-0.1995096206665039t-0.19951003789901733,-0.48050975799560547q0,-0.2838106155395508,0.19951003789901733,-0.48050975799560547t0.48050999641418457,-0.1967000961303711q0.27818989753723145,0,0.47910499572753906,0.1981048583984375t0.20091485977172852,0.47910499572753906ZM1.9417099952697754,12.026800155639648q0,-0.15736007690429688,-0.10959005355834961,-0.2669506072998047t-0.2669498920440674,-0.1095895767211914q-0.1601700782775879,0,-0.26976001262664795,0.1095895767211914t-0.10959005355834961,0.2669506072998047q0,0.15454959869384766,0.1067800521850586,0.2697601318359375t0.27257001399993896,0.11520957946777344q0.16297996044158936,0,0.2697598934173584,-0.11380481719970703t0.1067800521850586,-0.2711648941040039Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"å\"\r\n  },\r\n  'Xä': {\r\n    getPath: () => precision(`M1.1633399724960327,16.04509925842285q-0.45802998542785645,0,-0.6884499788284302,-0.24165916442871094t-0.23041999340057373,-0.6631603240966797q0,-0.4720802307128906,0.3105049729347229,-0.7249794006347656t1.0017650723457336,-0.2697601318359375l0.6828298568725586,-0.011240005493164062l0,-0.16579055786132812q0,-0.37091922760009766,-0.15735983848571777,-0.5310897827148438t-0.4945601224899292,-0.1601696014404297q-0.3400099277496338,0,-0.4945598840713501,0.11520957946777344t-0.18546003103256226,0.36810970306396484l-0.5282800197601318,-0.04776954650878906q0.12926000356674194,-0.8205204010009766,1.2195399403572083,-0.8205204010009766q0.5732401609420776,0,0.8626700639724731,0.26273536682128906t0.2894299030303955,0.7601051330566406l0,1.3094596862792969q0,0.22480010986328125,0.05901002883911133,0.3386049270629883t0.22480010986328125,0.11380481719970703q0.0730600357055664,0,0.16578984260559082,-0.019669532775878906l0,0.31472015380859375q-0.19107985496520996,0.04496002197265625,-0.39058995246887207,0.04496002197265625q-0.28099989891052246,0,-0.40885496139526367,-0.14752483367919922t-0.1447150707244873,-0.46224498748779297l-0.016860008239746094,0q-0.19388985633850098,0.34843921661376953,-0.45100486278533936,0.49315452575683594t-0.6252250671386719,0.14471435546875ZM1.2785500288009644,15.665749549865723q0.278190016746521,0,0.49456000328063965,-0.1264495849609375t0.34141504764556885,-0.34703540802001953t0.1250448226928711,-0.4538145065307617l0,-0.2500896453857422l-0.5535699129104614,0.011240005493164062q-0.3568699359893799,0.005620002746582031,-0.5409250259399414,0.0730600357055664t-0.28240495920181274,0.20793914794921875t-0.09834998846054077,0.36811065673828125q0,0.24728012084960938,0.13347500562667847,0.3821601867675781t0.3807550072669983,0.13487911224365234ZM1.8939399719238281,12.563509941101074l0,-0.5170402526855469l0.45802998542785645,0l0,0.5170402526855469l-0.45802998542785645,0ZM0.7868000268936157,12.563509941101074l0,-0.5170402526855469l0.4636499881744385,0l0,0.5170402526855469l-0.4636499881744385,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"ä\"\r\n  },\r\n  'Xö': {\r\n    getPath: () => precision(`M2.958930015563965,14.465880393981934q0,0.798039436340332,-0.35124993324279785,1.188629150390625t-1.02003014087677,0.39058971405029297q-0.665969967842102,0,-1.0059799551963806,-0.40604400634765625t-0.34000998735427856,-1.1731748580932617q0,-1.5736007690429688,1.3628499507904053,-1.5736007690429688q0.6968799829483032,0,1.025650143623352,0.38356494903564453t0.3287699222564697,1.1900358200073242ZM2.427839994430542,14.465880393981934q0,-0.6294403076171875,-0.18686509132385254,-0.9146556854248047t-0.6280349493026733,-0.2852144241333008q-0.44397997856140137,0,-0.6420849561691284,0.2908344268798828t-0.19810497760772705,0.9090356826782227q0,0.6013393402099609,0.19529497623443604,0.9034147262573242t0.6139850616455078,0.3020744323730469q0.45521998405456543,0,0.6505148410797119,-0.2922391891479492t0.19529509544372559,-0.9132499694824219ZM1.9360899925231934,12.563509941101074l0,-0.5170402526855469l0.45802998542785645,0l0,0.5170402526855469l-0.45802998542785645,0ZM0.8289499878883362,12.563509941101074l0,-0.5170402526855469l0.46365004777908325,0l0,0.5170402526855469l-0.46365004777908325,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16.05,\r\n    char: \"ö\"\r\n  },\r\n  'XA': {\r\n    getPath: () => precision(`M3.2792699337005615,15.988900184631348l-0.4524099826812744,-1.1577205657958984l-1.8040199279785156,0l-0.4552200436592102,1.1577205657958984l-0.5563799794763327,0l1.6157499607652426,-3.9592905044555664l0.6097699403762817,0l1.5904600620269775,3.9592905044555664l-0.547950029373169,0ZM1.9248499870300293,12.434249877929688l-0.02529001235961914,0.07868003845214844q-0.07024991512298584,0.2332296371459961,-0.2079399824142456,0.5985298156738281l-0.5058000087738037,1.301030158996582l1.4808701276779175,0l-0.5086100101470947,-1.306650161743164q-0.07868003845214844,-0.19388961791992188,-0.15736007690429688,-0.43835926055908203Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"A\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"T\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XB': {\r\n    getPath: () => precision(`M3.534980058670044,14.873330116271973q0,0.5282802581787109,-0.38496994972229004,0.821925163269043t-1.0706100463867188,0.29364490509033203l-1.6073200702667236,0l0,-3.9592905044555664l1.4387199878692627,0q1.3937599658966064,0,1.3937599658966064,0.9610204696655273q0,0.35124969482421875,-0.196699857711792,0.5901002883911133t-0.556380033493042,0.3203392028808594q0.4720799922943115,0.05620002746582031,0.7277898788452148,0.31612491607666016t0.2557101249694824,0.6561355590820312ZM2.7650399208068848,13.055259704589844q0,-0.3203401565551758,-0.21917986869812012,-0.45802974700927734t-0.6350600719451904,-0.13768959045410156l-0.9020099639892578,0l0,1.2532596588134766l0.9020099639892578,0q0.4299299716949463,0,0.642085075378418,-0.1615753173828125t0.21215486526489258,-0.49596500396728516ZM2.992650032043457,14.83117961883545q0,-0.6996898651123047,-0.9835000038146973,-0.6996898651123047l-1.0003600120544434,0l0,1.427480697631836l1.0425100326538086,0q0.49175000190734863,0,0.7165498733520508,-0.18265056610107422t0.22480010986328125,-0.545140266418457Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"B\"\r\n  },\r\n  'XC': {\r\n    getPath: () => precision(`M2.225519895553589,12.408960342407227q-0.6575398445129395,0,-1.022839903831482,0.42290496826171875t-0.3652999997138977,1.1591243743896484q0,0.7277898788452148,0.3807550072669983,1.170365333557129t1.0298649072647095,0.44257545471191406q0.8317601680755615,0,1.2504501342773438,-0.8233308792114258l0.43835997581481934,0.21918010711669922q-0.24447011947631836,0.5114202499389648,-0.6870450973510742,0.7783699035644531t-1.027055025100708,0.2669496536254883q-0.5985299348831177,0,-1.0354849100112915,-0.24868392944335938t-0.665969967842102,-0.7109298706054688t-0.2290150225162506,-1.0944957733154297q0,-0.9469699859619141,0.5114199817180634,-1.4836797714233398t1.4162399172782898,-0.5367097854614258q0.6322500705718994,0,1.0565600395202637,0.24728012084960938t0.6238200664520264,0.7334098815917969l-0.5086100101470947,0.16860008239746094q-0.13769006729125977,-0.3456306457519531,-0.44257497787475586,-0.5282802581787109t-0.7235751152038574,-0.1826496124267578Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16.05,\r\n    char: \"C\"\r\n  },\r\n  'XD': {\r\n    getPath: () => precision(`M3.8806099891662598,13.968509674072266q0,0.6125802993774414,-0.23884987831115723,1.0720157623291016t-0.6772100925445557,0.7039041519165039t-1.0116000175476074,0.24447059631347656l-1.480870008468628,0l0,-3.9592905044555664l1.3094600439071655,0q1.0059798955917358,0,1.5525249242782593,0.5043954849243164t0.5465450286865234,1.434504508972168ZM3.341089963912964,13.968509674072266q0,-0.7362194061279297,-0.40323495864868164,-1.1225948333740234t-1.1675549745559692,-0.38637447357177734l-0.7615100145339966,0l0,3.0994300842285156l0.8823399543762207,0q0.4355499744415283,0,0.7657251358032227,-0.19108009338378906t0.5072050094604492,-0.5507602691650391t0.17702984809875488,-0.8486204147338867Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 15.99,\r\n    char: \"D\"\r\n  },\r\n  'XE': {\r\n    getPath: () => precision(`M0.4720799922943115,15.988900184631348l0,-3.9592905044555664l3.003890037536621,0l0,0.43836021423339844l-2.467180013656616,0l0,1.2701196670532227l2.2985799312591553,0l0,0.4327402114868164l-2.2985799312591553,0l0,1.3797101974487305l2.582390069961548,0l0,0.43836021423339844l-3.1191000938415527,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"E\"\r\n  },\r\n  'XF': {\r\n    getPath: () => precision(`M1.0087900161743164,12.46796989440918l0,1.4724397659301758l2.2086598873138428,0l0,0.44398021697998047l-2.2086598873138428,0l0,1.6045103073120117l-0.5367100238800049,0l0,-3.9592905044555664l2.812809944152832,0l0,0.43836021423339844l-2.276099920272827,0Z`),\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 15.99,\r\n    char: \"F\",\r\n    kerningRules: {\r\n      \"A\": getGridUnitKerningRule(113)\r\n    }\r\n  },\r\n  'XG': {\r\n    getPath: () => precision(`M0.28942999243736267,13.990989685058594q0,-0.9638299942016602,0.5170399844646454,-1.4921092987060547t1.452769935131073,-0.5282802581787109q0.6575400829315186,0,1.0678000450134277,0.22198963165283203t0.6322500705718994,0.7109298706054688l-0.5114200115203857,0.15174007415771484q-0.16860008239746094,-0.3372001647949219,-0.465054988861084,-0.49174976348876953t-0.7376251220703125,-0.15454959869384766q-0.6856398582458496,0,-1.048129916191101,0.4144744873046875t-0.3624899983406067,1.1675548553466797q0,0.750269889831543,0.3849700093269348,1.1844148635864258t1.0649899244308472,0.4341459274291992q0.38778018951416016,0,0.7235751152038574,-0.11802005767822266t0.5437350273132324,-0.3203401565551758l0,-0.713740348815918l-1.1830101013183594,0l0,-0.4496002197265625l1.677570104598999,0l0,1.3656606674194336q-0.31472015380859375,0.3203392028808594,-0.7713451385498047,0.49596500396728516t-0.9905250072479248,0.17562389373779297q-0.6210099458694458,0,-1.0706099271774292,-0.24727916717529297t-0.6870449781417847,-0.7123346328735352t-0.23744502663612366,-1.0944957733154297Z`),\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16.05,\r\n    char: \"G\"\r\n  },\r\n  'XH': {\r\n    getPath: () => precision(`M3.150010108947754,15.988900184631348l0,-1.834930419921875l-2.1412200927734375,0l0,1.834930419921875l-0.5367100238800049,0l0,-3.9592905044555664l0.5367100238800049,0l0,1.674759864807129l2.1412200927734375,0l0,-1.674759864807129l0.5367097854614258,0l0,3.9592905044555664l-0.5367097854614258,0Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 15.99,\r\n    char: \"H\"\r\n  },\r\n  'XI': {\r\n    getPath: () => precision(`M0.5310900211334229,15.988900184631348l0,-3.9592905044555664l0.5367100238800049,0l0,3.9592905044555664l-0.5367100238800049,0Z`),\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 15.99,\r\n    char: \"I\"\r\n  },\r\n  'XJ': {\r\n    getPath: () => precision(`M1.2841700315475464,16.04509925842285q-1.0059800446033478,0,-1.1942500323057175,-1.0396995544433594l0.5254700034856796,-0.08710956573486328q0.05058002471923828,0.3259601593017578,0.22760999202728271,0.5086097717285156t0.44398003816604614,0.18265056610107422q0.2922400236129761,0,0.46083998680114746,-0.20091533660888672t0.1685999631881714,-0.5886955261230469l0,-2.3519697189331055l-0.7615100145339966,0l0,-0.43836021423339844l1.2954100370407104,0l0,2.77908992767334q0,0.5760507583618164,-0.31190991401672363,0.9062252044677734t-0.8542400598526001,0.33017444610595703Z`),\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16.05,\r\n    char: \"J\"\r\n  },\r\n  'XK': {\r\n    getPath: () => precision(`M3.1078600883483887,15.988900184631348l-1.5820300579071045,-1.9107999801635742l-0.5170400142669678,0.3934001922607422l0,1.517399787902832l-0.5367100238800049,0l0,-3.9592905044555664l0.5367100238800049,0l0,1.9838600158691406l1.9079899787902832,-1.9838600158691406l0.6322500705718994,0l-1.686000108718872,1.7197198867797852l1.9107999801635742,2.2395706176757812l-0.6659698486328125,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"K\"\r\n  },\r\n  'XL': {\r\n    getPath: () => precision(`M0.4720799922943115,15.988900184631348l0,-3.9592905044555664l0.5367100238800049,0l0,3.520930290222168l2.0007200241088867,0l0,0.43836021423339844l-2.5374300479888916,0Z`),\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 15.99,\r\n    char: \"L\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(76),\r\n      \"Y\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(152),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"T\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XM': {\r\n    getPath: () => precision(`M3.8384599685668945,15.988900184631348l0,-2.6414003372192383q0,-0.43836021423339844,0.02529001235961914,-0.8429994583129883q-0.13769006729125977,0.5029897689819336,-0.24727988243103027,0.786799430847168l-1.0228400230407715,2.6976003646850586l-0.3765401840209961,0l-1.036889910697937,-2.6976003646850586l-0.15735995769500732,-0.47770023345947266l-0.09273004531860352,-0.3090991973876953l0.008430004119873047,0.31190967559814453l0.011240005493164062,0.5310897827148438l0,2.6414003372192383l-0.47769999504089355,0l0,-3.9592905044555664l0.7053099870681763,0l1.053749918937683,2.7453699111938477q0.05620002746582031,0.16579055786132812,0.1081850528717041,0.3554649353027344t0.06884503364562988,0.2739753723144531q0.022480010986328125,-0.11240005493164062,0.09413504600524902,-0.3414144515991211t0.09694504737854004,-0.2880258560180664l1.0340800285339355,-2.7453699111938477l0.6884500980377197,0l0,3.9592905044555664l-0.4833202362060547,0Z`),\r\n    get width() { return getGridUnitWidth(1706); },\r\n    height: 15.99,\r\n    char: \"M\"\r\n  },\r\n  'XN': {\r\n    getPath: () => precision(`M3.0404200553894043,15.988900184631348l-2.1187400817871094,-3.371999740600586l0.014050006866455078,0.2725696563720703l0.014050006866455078,0.4692697525024414l0,2.630160331726074l-0.47769999504089355,0l0,-3.9592905044555664l0.6238200664520264,0l2.1412198543548584,3.3944807052612305q-0.03372001647949219,-0.5507602691650391,-0.03372001647949219,-0.7980403900146484l0,-2.596440315246582l0.4833199977874756,0l0,3.9592905044555664l-0.6462998390197754,0Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 15.99,\r\n    char: \"N\"\r\n  },\r\n  'XO': {\r\n    getPath: () => precision(`M4.2009501457214355,13.990989685058594q0,0.6210107803344727,-0.23744511604309082,1.0874700546264648t-0.6814250946044922,0.7165498733520508t-1.0481300354003906,0.2500896453857422q-0.6097699403762817,0,-1.0523449182510376,-0.24727916717529297t-0.6758049726486206,-0.7151451110839844t-0.23322999477386475,-1.0916852951049805q0,-0.9497795104980469,0.5198500156402588,-1.4850845336914062t1.4471498727798462,-0.5353050231933594q0.6041500568389893,0,1.0481300354003906,0.24025440216064453t0.6786150932312012,0.6982851028442383t0.2346351146697998,1.0818500518798828ZM3.6530001163482666,13.990989685058594q0,-0.7390298843383789,-0.36951518058776855,-1.1605300903320312t-1.043915033340454,-0.42149925231933594q-0.6800198554992676,0,-1.050939917564392,0.4158792495727539t-0.37092000246047974,1.1661500930786133q0,0.7446498870849609,0.37513500452041626,1.181605339050293t1.0411049127578735,0.43695545196533203q0.6856400966644287,0,1.0523450374603271,-0.42290592193603516t0.36670517921447754,-1.1956548690795898Z`),\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16.05,\r\n    char: \"O\"\r\n  },\r\n  'XP': {\r\n    getPath: () => precision(`M3.534980058670044,13.221050262451172q0,0.5619993209838867,-0.36670494079589844,0.8935794830322266t-0.9961450099945068,0.33158016204833984l-1.1633400917053223,0l0,1.5426902770996094l-0.5367100238800049,0l0,-3.9592905044555664l1.666330099105835,0q0.6659698486328125,0,1.0312700271606445,0.31191062927246094t0.36529994010925293,0.8795299530029297ZM2.995460033416748,13.226670265197754q0,-0.7671298980712891,-0.9216799736022949,-0.7671298980712891l-1.0649900436401367,0l0,1.5623598098754883l1.0874700546264648,0q0.8991999626159668,0,0.8991999626159668,-0.7952299118041992Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"P\",\r\n    kerningRules: {\r\n      \"A\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XQ': {\r\n    getPath: () => precision(`M4.2009501457214355,13.990989685058594q0,0.8373804092407227,-0.42150020599365234,1.3769006729125977t-1.1717698574066162,0.6378698348999023q0.11520981788635254,0.35405921936035156,0.3020749092102051,0.5114192962646484t0.47348499298095703,0.15736007690429688q0.15455007553100586,0,0.3231499195098877,-0.036529541015625l0,0.3765392303466797q-0.26132988929748535,0.06182098388671875,-0.5001800060272217,0.06182098388671875q-0.42430996894836426,0,-0.6982848644256592,-0.24025535583496094t-0.4481949806213379,-0.8022556304931641q-0.556380033493042,-0.02809906005859375,-0.9596151113510132,-0.28240394592285156t-0.6153899431228638,-0.7081203460693359t-0.21215498447418213,-1.0523452758789062q0,-0.9497795104980469,0.5198500156402588,-1.4850845336914062t1.4471498727798462,-0.5353050231933594q0.6041500568389893,0,1.0481300354003906,0.24025440216064453t0.6786150932312012,0.6982851028442383t0.2346351146697998,1.0818500518798828ZM3.6530001163482666,13.990989685058594q0,-0.7390298843383789,-0.36951518058776855,-1.1605300903320312t-1.043915033340454,-0.42149925231933594q-0.6800198554992676,0,-1.050939917564392,0.4158792495727539t-0.37092000246047974,1.1661500930786133q0,0.7446498870849609,0.37513500452041626,1.181605339050293t1.0411049127578735,0.43695545196533203q0.6856400966644287,0,1.0523450374603271,-0.42290592193603516t0.36670517921447754,-1.1956548690795898Z`),\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 17.08,\r\n    char: \"Q\"\r\n  },\r\n  'XR': {\r\n    getPath: () => precision(`M3.2708399295806885,15.988900184631348l-1.0284600257873535,-1.643850326538086l-1.2335898876190186,0l0,1.643850326538086l-0.5367100238800049,0l0,-3.9592905044555664l1.863029956817627,0q0.6687800884246826,0,1.03267502784729,0.29926490783691406t0.3638949394226074,0.833165168762207q0,0.44117069244384766,-0.25711488723754883,0.7418403625488281t-0.7095251083374023,0.3793497085571289l1.124000072479248,1.7056703567504883l-0.6182000637054443,0ZM3.19215989112854,13.167659759521484q0,-0.3456296920776367,-0.2346348762512207,-0.5268745422363281t-0.6758050918579102,-0.1812448501586914l-1.2729299068450928,0l0,1.4611997604370117l1.295409917831421,0q0.42430996894836426,0,0.656135082244873,-0.1981048583984375t0.2318248748779297,-0.5549755096435547Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 15.99,\r\n    char: \"R\",\r\n    kerningRules: {\r\n      \"Y\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(37),\r\n      \"T\": getGridUnitKerningRule(37)\r\n    }\r\n  },\r\n  'XS': {\r\n    getPath: () => precision(`M3.574320077896118,14.8958101272583q0,0.5479497909545898,-0.4285249710083008,0.8486194610595703t-1.206895112991333,0.30066967010498047q-1.4471499919891357,0,-1.6775699853897095,-1.0059795379638672l0.5198500156402588,-0.10396957397460938q0.08991998434066772,0.3568696975708008,0.382159948348999,0.5240650177001953t0.7952300310134888,0.16719436645507812q0.5198500156402588,0,0.8022549152374268,-0.1784343719482422t0.28240513801574707,-0.5240650177001953q0,-0.19389057159423828,-0.08851504325866699,-0.31472015380859375t-0.24868512153625488,-0.1995096206665039t-0.382159948348999,-0.13207054138183594t-0.49175000190734863,-0.11520957946777344q-0.4692699909210205,-0.10397052764892578,-0.7123349905014038,-0.20794010162353516t-0.38356494903564453,-0.2318248748779297t-0.21496498584747314,-0.29926490783691406t-0.07446500658988953,-0.3934001922607422q0,-0.5086097717285156,0.38918498158454895,-0.7839899063110352t1.1141650080680847,-0.27538013458251953q0.6744000911712646,0,1.0312700271606445,0.20653533935546875t0.5001800060272217,0.7039041519165039l-0.5282800197601318,0.09273052215576172q-0.08711004257202148,-0.31472015380859375,-0.33157992362976074,-0.45662498474121094t-0.6772100925445557,-0.1419048309326172q-0.47488999366760254,0,-0.7249799966812134,0.15736007690429688t-0.25009000301361084,0.4692697525024414q0,0.1826496124267578,0.09694504737854004,0.3020744323730469t0.27959489822387695,0.20232009887695312t0.727790117263794,0.20372486114501953q0.18264985084533691,0.04215049743652344,0.3638949394226074,0.08570575714111328t0.34703493118286133,0.10396957397460938t0.3105051517486572,0.1419048309326172t0.2514948844909668,0.1995105743408203t0.16719508171081543,0.27818965911865234t0.060415029525756836,0.3765401840209961Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16.05,\r\n    char: \"S\"\r\n  },\r\n  'XT': {\r\n    getPath: () => precision(`M2.023200035095215,12.46796989440918l0,3.520930290222168l-0.5339000225067139,0l0,-3.520930290222168l-1.360040009021759,0l0,-0.43836021423339844l3.253979980945587,0l0,0.43836021423339844l-1.3600399494171143,0Z`),\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 15.99,\r\n    char: \"T\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(113),\r\n      \"w\": getGridUnitKerningRule(113),\r\n      \"u\": getGridUnitKerningRule(76),\r\n      \"ù\": getGridUnitKerningRule(76),\r\n      \"ú\": getGridUnitKerningRule(76),\r\n      \"û\": getGridUnitKerningRule(76),\r\n      \"ü\": getGridUnitKerningRule(76),\r\n      \"ū\": getGridUnitKerningRule(76),\r\n      \"ű\": getGridUnitKerningRule(76),\r\n      \"ų\": getGridUnitKerningRule(76),\r\n      \"s\": getGridUnitKerningRule(227),\r\n      \"š\": getGridUnitKerningRule(227),\r\n      \"ś\": getGridUnitKerningRule(227),\r\n      \"r\": getGridUnitKerningRule(76),\r\n      \"o\": getGridUnitKerningRule(227),\r\n      \"ò\": getGridUnitKerningRule(227),\r\n      \"ó\": getGridUnitKerningRule(227),\r\n      \"ô\": getGridUnitKerningRule(227),\r\n      \"õ\": getGridUnitKerningRule(227),\r\n      \"ö\": getGridUnitKerningRule(227),\r\n      \"ø\": getGridUnitKerningRule(227),\r\n      \"ō\": getGridUnitKerningRule(227),\r\n      \"ő\": getGridUnitKerningRule(227),\r\n      \"i\": getGridUnitKerningRule(76),\r\n      \"ì\": getGridUnitKerningRule(76),\r\n      \"í\": getGridUnitKerningRule(76),\r\n      \"î\": getGridUnitKerningRule(76),\r\n      \"ï\": getGridUnitKerningRule(76),\r\n      \"ī\": getGridUnitKerningRule(76),\r\n      \"į\": getGridUnitKerningRule(76),\r\n      \"e\": getGridUnitKerningRule(227),\r\n      \"è\": getGridUnitKerningRule(227),\r\n      \"é\": getGridUnitKerningRule(227),\r\n      \"ê\": getGridUnitKerningRule(227),\r\n      \"ë\": getGridUnitKerningRule(227),\r\n      \"ē\": getGridUnitKerningRule(227),\r\n      \"ė\": getGridUnitKerningRule(227),\r\n      \"ę\": getGridUnitKerningRule(227),\r\n      \"c\": getGridUnitKerningRule(227),\r\n      \"ć\": getGridUnitKerningRule(227),\r\n      \"č\": getGridUnitKerningRule(227),\r\n      \"ç\": getGridUnitKerningRule(227),\r\n      \"a\": getGridUnitKerningRule(227),\r\n      \"à\": getGridUnitKerningRule(227),\r\n      \"á\": getGridUnitKerningRule(227),\r\n      \"â\": getGridUnitKerningRule(227),\r\n      \"ã\": getGridUnitKerningRule(227),\r\n      \"ä\": getGridUnitKerningRule(227),\r\n      \"å\": getGridUnitKerningRule(227),\r\n      \"ā\": getGridUnitKerningRule(227),\r\n      \"ą\": getGridUnitKerningRule(227),\r\n      \"æ\": getGridUnitKerningRule(227),\r\n      \"O\": getGridUnitKerningRule(37),\r\n      \"Ò\": getGridUnitKerningRule(37),\r\n      \"Ó\": getGridUnitKerningRule(37),\r\n      \"Ô\": getGridUnitKerningRule(37),\r\n      \"Õ\": getGridUnitKerningRule(37),\r\n      \"Ö\": getGridUnitKerningRule(37),\r\n      \"Ø\": getGridUnitKerningRule(37),\r\n      \"Ō\": getGridUnitKerningRule(37),\r\n      \"Ő\": getGridUnitKerningRule(37),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"À\": getGridUnitKerningRule(152),\r\n      \"Á\": getGridUnitKerningRule(152),\r\n      \"Â\": getGridUnitKerningRule(152),\r\n      \"Ã\": getGridUnitKerningRule(152),\r\n      \"Ä\": getGridUnitKerningRule(152),\r\n      \"Å\": getGridUnitKerningRule(152),\r\n      \"Ā\": getGridUnitKerningRule(152),\r\n      \"Ą\": getGridUnitKerningRule(152),\r\n      \"Æ\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XU': {\r\n    getPath: () => precision(`M2.054110050201416,16.04509925842285q-0.4861299991607666,0,-0.8486200571060181,-0.17702960968017578t-0.5619999766349792,-0.5142297744750977t-0.19951000809669495,-0.8036594390869141l0,-2.520570755004883l0.5367099940776825,0l0,2.4756107330322266q0,0.5423297882080078,0.27538001537323,0.8233299255371094t0.7952300310134888,0.28100013732910156q0.5339000225067139,0,0.8303549289703369,-0.2908353805541992t0.29645490646362305,-0.8500251770019531l0,-2.439080238342285l0.5339000225067139,0l0,2.4699907302856445q0,0.48050975799560547,-0.20372486114501953,0.8289499282836914t-0.5760500431060791,0.5324945449829102t-0.8781249523162842,0.18405437469482422Z`),\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16.05,\r\n    char: \"U\"\r\n  },\r\n  'XV': {\r\n    getPath: () => precision(`M2.1974198818206787,15.988900184631348l-0.5563799142837524,0l-1.6157499682158232,-3.9592905044555664l0.5648099910467863,0l1.0958999991416931,2.787520408630371l0.23603999614715576,0.6996898651123047l0.2360401153564453,-0.6996898651123047l1.0902798175811768,-2.787520408630371l0.564810037612915,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"V\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(76),\r\n      \"ý\": getGridUnitKerningRule(76),\r\n      \"ÿ\": getGridUnitKerningRule(76),\r\n      \"u\": getGridUnitKerningRule(76),\r\n      \"ù\": getGridUnitKerningRule(76),\r\n      \"ú\": getGridUnitKerningRule(76),\r\n      \"û\": getGridUnitKerningRule(76),\r\n      \"ü\": getGridUnitKerningRule(76),\r\n      \"ū\": getGridUnitKerningRule(76),\r\n      \"ű\": getGridUnitKerningRule(76),\r\n      \"ų\": getGridUnitKerningRule(76),\r\n      \"r\": getGridUnitKerningRule(76),\r\n      \"o\": getGridUnitKerningRule(113),\r\n      \"ò\": getGridUnitKerningRule(113),\r\n      \"ó\": getGridUnitKerningRule(113),\r\n      \"ô\": getGridUnitKerningRule(113),\r\n      \"õ\": getGridUnitKerningRule(113),\r\n      \"ö\": getGridUnitKerningRule(113),\r\n      \"ø\": getGridUnitKerningRule(113),\r\n      \"ō\": getGridUnitKerningRule(113),\r\n      \"ő\": getGridUnitKerningRule(113),\r\n      \"i\": getGridUnitKerningRule(37),\r\n      \"ì\": getGridUnitKerningRule(37),\r\n      \"í\": getGridUnitKerningRule(37),\r\n      \"î\": getGridUnitKerningRule(37),\r\n      \"ï\": getGridUnitKerningRule(37),\r\n      \"ī\": getGridUnitKerningRule(37),\r\n      \"į\": getGridUnitKerningRule(37),\r\n      \"e\": getGridUnitKerningRule(113),\r\n      \"è\": getGridUnitKerningRule(113),\r\n      \"é\": getGridUnitKerningRule(113),\r\n      \"ê\": getGridUnitKerningRule(113),\r\n      \"ë\": getGridUnitKerningRule(113),\r\n      \"ē\": getGridUnitKerningRule(113),\r\n      \"ė\": getGridUnitKerningRule(113),\r\n      \"ę\": getGridUnitKerningRule(113),\r\n      \"a\": getGridUnitKerningRule(227),\r\n      \"à\": getGridUnitKerningRule(227),\r\n      \"á\": getGridUnitKerningRule(227),\r\n      \"â\": getGridUnitKerningRule(227),\r\n      \"ã\": getGridUnitKerningRule(227),\r\n      \"ä\": getGridUnitKerningRule(227),\r\n      \"å\": getGridUnitKerningRule(227),\r\n      \"ā\": getGridUnitKerningRule(227),\r\n      \"ą\": getGridUnitKerningRule(227),\r\n      \"æ\": getGridUnitKerningRule(227),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"À\": getGridUnitKerningRule(152),\r\n      \"Á\": getGridUnitKerningRule(152),\r\n      \"Â\": getGridUnitKerningRule(152),\r\n      \"Ã\": getGridUnitKerningRule(152),\r\n      \"Ä\": getGridUnitKerningRule(152),\r\n      \"Å\": getGridUnitKerningRule(152),\r\n      \"Ā\": getGridUnitKerningRule(152),\r\n      \"Ą\": getGridUnitKerningRule(152),\r\n      \"Æ\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XW': {\r\n    getPath: () => precision(`M4.245910167694092,15.988900184631348l-0.6406800746917725,0l-0.6856400966644287,-2.5149497985839844q-0.06744003295898438,-0.2360401153564453,-0.1967000961303711,-0.8458099365234375q-0.0730597972869873,0.3259592056274414,-0.12363982200622559,0.5451393127441406t-0.7671301364898682,2.8156204223632812l-0.6406799554824829,0l-1.1661499869078398,-3.9592905044555664l0.5591899883002043,0l0.7109300494194031,2.514950752258301q0.12644994258880615,0.4720792770385742,0.23322999477386475,0.972259521484375q0.06743991374969482,-0.3091001510620117,0.15595495700836182,-0.6744003295898438t0.7797750234603882,-2.812809944152832l0.5142300128936768,0l0.6884498596191406,2.4643707275390625q0.15736007690429688,0.6041498184204102,0.24728012084960938,1.0228395462036133l0.02529001235961914,-0.09834957122802734q0.07587003707885742,-0.323150634765625,0.12364006042480469,-0.5268754959106445t0.7896099090576172,-2.861985206604004l0.5591897964477539,0Z`),\r\n    get width() { return getGridUnitWidth(1933); },\r\n    height: 15.99,\r\n    char: \"W\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(18),\r\n      \"ý\": getGridUnitKerningRule(18),\r\n      \"ÿ\": getGridUnitKerningRule(18),\r\n      \"u\": getGridUnitKerningRule(37),\r\n      \"ù\": getGridUnitKerningRule(37),\r\n      \"ú\": getGridUnitKerningRule(37),\r\n      \"û\": getGridUnitKerningRule(37),\r\n      \"ü\": getGridUnitKerningRule(37),\r\n      \"ū\": getGridUnitKerningRule(37),\r\n      \"ű\": getGridUnitKerningRule(37),\r\n      \"ų\": getGridUnitKerningRule(37),\r\n      \"r\": getGridUnitKerningRule(37),\r\n      \"o\": getGridUnitKerningRule(37),\r\n      \"ò\": getGridUnitKerningRule(37),\r\n      \"ó\": getGridUnitKerningRule(37),\r\n      \"ô\": getGridUnitKerningRule(37),\r\n      \"õ\": getGridUnitKerningRule(37),\r\n      \"ö\": getGridUnitKerningRule(37),\r\n      \"ø\": getGridUnitKerningRule(37),\r\n      \"ō\": getGridUnitKerningRule(37),\r\n      \"ő\": getGridUnitKerningRule(37),\r\n      \"e\": getGridUnitKerningRule(37),\r\n      \"è\": getGridUnitKerningRule(37),\r\n      \"é\": getGridUnitKerningRule(37),\r\n      \"ê\": getGridUnitKerningRule(37),\r\n      \"ë\": getGridUnitKerningRule(37),\r\n      \"ē\": getGridUnitKerningRule(37),\r\n      \"ė\": getGridUnitKerningRule(37),\r\n      \"ę\": getGridUnitKerningRule(37),\r\n      \"a\": getGridUnitKerningRule(76),\r\n      \"à\": getGridUnitKerningRule(76),\r\n      \"á\": getGridUnitKerningRule(76),\r\n      \"â\": getGridUnitKerningRule(76),\r\n      \"ã\": getGridUnitKerningRule(76),\r\n      \"ä\": getGridUnitKerningRule(76),\r\n      \"å\": getGridUnitKerningRule(76),\r\n      \"ā\": getGridUnitKerningRule(76),\r\n      \"ą\": getGridUnitKerningRule(76),\r\n      \"æ\": getGridUnitKerningRule(76),\r\n      \"A\": getGridUnitKerningRule(76),\r\n      \"À\": getGridUnitKerningRule(76),\r\n      \"Á\": getGridUnitKerningRule(76),\r\n      \"Â\": getGridUnitKerningRule(76),\r\n      \"Ã\": getGridUnitKerningRule(76),\r\n      \"Ä\": getGridUnitKerningRule(76),\r\n      \"Å\": getGridUnitKerningRule(76),\r\n      \"Ā\": getGridUnitKerningRule(76),\r\n      \"Ą\": getGridUnitKerningRule(76),\r\n      \"Æ\": getGridUnitKerningRule(76)\r\n    }\r\n  },\r\n  'XX': {\r\n    getPath: () => precision(`M3.1247200965881348,15.988900184631348l-1.1886301040649414,-1.7309598922729492l-1.213919997215271,1.7309598922729492l-0.5929099917411804,0l1.5061599612236023,-2.056920051574707l-1.3909499645233154,-1.9023704528808594l0.5929099917411804,0l1.1015200018882751,1.5539302825927734l1.0706100463867188,-1.5539302825927734l0.5929100513458252,0l-1.3544201850891113,1.882699966430664l1.4696300029754639,2.0765905380249023l-0.5929098129272461,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"X\"\r\n  },\r\n  'XY': {\r\n    getPath: () => precision(`M2.1833701133728027,14.347860336303711l0,1.6410398483276367l-0.5339001417160034,0l0,-1.6410398483276367l-1.5230199694633484,-2.3182506561279297l0.5900999903678894,0l1.205489993095398,1.8855104446411133l1.1998701095581055,-1.8855104446411133l0.5900998115539551,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"Y\",\r\n    kerningRules: {\r\n      \"v\": getGridUnitKerningRule(113),\r\n      \"u\": getGridUnitKerningRule(113),\r\n      \"ù\": getGridUnitKerningRule(113),\r\n      \"ú\": getGridUnitKerningRule(113),\r\n      \"û\": getGridUnitKerningRule(113),\r\n      \"ü\": getGridUnitKerningRule(113),\r\n      \"ū\": getGridUnitKerningRule(113),\r\n      \"ű\": getGridUnitKerningRule(113),\r\n      \"ų\": getGridUnitKerningRule(113),\r\n      \"q\": getGridUnitKerningRule(188),\r\n      \"p\": getGridUnitKerningRule(152),\r\n      \"o\": getGridUnitKerningRule(188),\r\n      \"ò\": getGridUnitKerningRule(188),\r\n      \"ó\": getGridUnitKerningRule(188),\r\n      \"ô\": getGridUnitKerningRule(188),\r\n      \"õ\": getGridUnitKerningRule(188),\r\n      \"ö\": getGridUnitKerningRule(188),\r\n      \"ø\": getGridUnitKerningRule(188),\r\n      \"ō\": getGridUnitKerningRule(188),\r\n      \"ő\": getGridUnitKerningRule(188),\r\n      \"i\": getGridUnitKerningRule(76),\r\n      \"ì\": getGridUnitKerningRule(76),\r\n      \"í\": getGridUnitKerningRule(76),\r\n      \"î\": getGridUnitKerningRule(76),\r\n      \"ï\": getGridUnitKerningRule(76),\r\n      \"ī\": getGridUnitKerningRule(76),\r\n      \"į\": getGridUnitKerningRule(76),\r\n      \"e\": getGridUnitKerningRule(188),\r\n      \"è\": getGridUnitKerningRule(188),\r\n      \"é\": getGridUnitKerningRule(188),\r\n      \"ê\": getGridUnitKerningRule(188),\r\n      \"ë\": getGridUnitKerningRule(188),\r\n      \"ē\": getGridUnitKerningRule(188),\r\n      \"ė\": getGridUnitKerningRule(188),\r\n      \"ę\": getGridUnitKerningRule(188),\r\n      \"a\": getGridUnitKerningRule(152),\r\n      \"à\": getGridUnitKerningRule(152),\r\n      \"á\": getGridUnitKerningRule(152),\r\n      \"â\": getGridUnitKerningRule(152),\r\n      \"ã\": getGridUnitKerningRule(152),\r\n      \"ä\": getGridUnitKerningRule(152),\r\n      \"å\": getGridUnitKerningRule(152),\r\n      \"ā\": getGridUnitKerningRule(152),\r\n      \"ą\": getGridUnitKerningRule(152),\r\n      \"æ\": getGridUnitKerningRule(152),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"À\": getGridUnitKerningRule(152),\r\n      \"Á\": getGridUnitKerningRule(152),\r\n      \"Â\": getGridUnitKerningRule(152),\r\n      \"Ã\": getGridUnitKerningRule(152),\r\n      \"Ä\": getGridUnitKerningRule(152),\r\n      \"Å\": getGridUnitKerningRule(152),\r\n      \"Ā\": getGridUnitKerningRule(152),\r\n      \"Ą\": getGridUnitKerningRule(152),\r\n      \"Æ\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XZ': {\r\n    getPath: () => precision(`M3.335469961166382,15.988900184631348l-3.152819961309433,0l0,-0.40182971954345703l2.410980075597763,-3.119100570678711l-2.205850064754486,0l0,-0.43836021423339844l2.8156198859214783,0l0,0.3905906677246094l-2.4109798669815063,3.1303396224975586l2.543049931526184,0l0,0.43836021423339844Z`),\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 15.99,\r\n    char: \"Z\"\r\n  },\r\n  'XÅ': {\r\n    getPath: () => precision(`M3.2792699337005615,15.988900184631348l-0.4524099826812744,-1.1577205657958984l-1.8040199279785156,0l-0.4552200436592102,1.1577205657958984l-0.5563799794763327,0l1.6157499607652426,-3.9592905044555664l0.6097699403762817,0l1.5904600620269775,3.9592905044555664l-0.547950029373169,0ZM1.9248499870300293,12.434249877929688l-0.02529001235961914,0.07868003845214844q-0.07024991512298584,0.2332296371459961,-0.2079399824142456,0.5985298156738281l-0.5058000087738037,1.301030158996582l1.4808701276779175,0l-0.5086100101470947,-1.306650161743164q-0.07868003845214844,-0.19388961791992188,-0.15736007690429688,-0.43835926055908203ZM2.607680082321167,11.64463996887207q0,0.28100013732910156,-0.1995100975036621,0.48050975799560547t-0.48050999641418457,0.1995105743408203t-0.48050999641418457,-0.1995105743408203t-0.19950997829437256,-0.48050975799560547q0,-0.2838096618652344,0.19950997829437256,-0.48050975799560547t0.48050999641418457,-0.1967000961303711q0.27818989753723145,0,0.47910499572753906,0.1981048583984375t0.20091509819030762,0.47910499572753906ZM2.3041999340057373,11.64463996887207q0,-0.15736007690429688,-0.10958981513977051,-0.2669496536254883t-0.2669501304626465,-0.10959053039550781q-0.16016995906829834,0,-0.26976001262664795,0.10959053039550781t-0.10958993434906006,0.2669496536254883q0,0.15454959869384766,0.10677993297576904,0.2697601318359375t0.27257001399993896,0.11520957946777344q0.1629800796508789,0,0.2697598934173584,-0.11380481719970703t0.1067800521850586,-0.2711648941040039Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"Å\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"T\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XÄ': {\r\n    getPath: () => precision(`M3.2792699337005615,15.988900184631348l-0.4524099826812744,-1.1577205657958984l-1.8040199279785156,0l-0.4552200436592102,1.1577205657958984l-0.5563799794763327,0l1.6157499607652426,-3.9592905044555664l0.6097699403762817,0l1.5904600620269775,3.9592905044555664l-0.547950029373169,0ZM1.9248499870300293,12.434249877929688l-0.02529001235961914,0.07868003845214844q-0.07024991512298584,0.2332296371459961,-0.2079399824142456,0.5985298156738281l-0.5058000087738037,1.301030158996582l1.4808701276779175,0l-0.5086100101470947,-1.306650161743164q-0.07868003845214844,-0.19388961791992188,-0.15736007690429688,-0.43835926055908203ZM2.25642991065979,11.689599990844727l0,-0.5170402526855469l0.45802998542785645,0l0,0.5170402526855469l-0.45802998542785645,0ZM1.1492899656295776,11.689599990844727l0,-0.5170402526855469l0.4636499881744385,0l0,0.5170402526855469l-0.4636499881744385,0Z`),\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 15.99,\r\n    char: \"Ä\",\r\n    kerningRules: {\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"T\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XÖ': {\r\n    getPath: () => precision(`M4.2009501457214355,13.990989685058594q0,0.6210107803344727,-0.23744511604309082,1.0874700546264648t-0.6814250946044922,0.7165498733520508t-1.0481300354003906,0.2500896453857422q-0.6097699403762817,0,-1.0523449182510376,-0.24727916717529297t-0.6758049726486206,-0.7151451110839844t-0.23322999477386475,-1.0916852951049805q0,-0.9497795104980469,0.5198500156402588,-1.4850845336914062t1.4471498727798462,-0.5353050231933594q0.6041500568389893,0,1.0481300354003906,0.24025440216064453t0.6786150932312012,0.6982851028442383t0.2346351146697998,1.0818500518798828ZM3.6530001163482666,13.990989685058594q0,-0.7390298843383789,-0.36951518058776855,-1.1605300903320312t-1.043915033340454,-0.42149925231933594q-0.6800198554992676,0,-1.050939917564392,0.4158792495727539t-0.37092000246047974,1.1661500930786133q0,0.7446498870849609,0.37513500452041626,1.181605339050293t1.0411049127578735,0.43695545196533203q0.6856400966644287,0,1.0523450374603271,-0.42290592193603516t0.36670517921447754,-1.1956548690795898ZM2.5571000576019287,11.689599990844727l0,-0.5170402526855469l0.45802998542785645,0l0,0.5170402526855469l-0.45802998542785645,0ZM1.4499599933624268,11.689599990844727l0,-0.5170402526855469l0.4636499881744385,0l0,0.5170402526855469l-0.4636499881744385,0Z`),\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16.05,\r\n    char: \"Ö\"\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XÀ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM2.1067,11.7022l-0.8708,-0.6096v-0.0815h0.5815l0.6096,0.6348v0.0562h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"À\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XÁ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM1.5365,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Á\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XÂ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM2.8483,11.6461v0.0562h-0.2949l-0.6152,-0.3904h-0.0056l-0.6517,0.3904h-0.2921v-0.0562l0.6573,-0.6742h0.573z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Â\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XÃ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM2.3652,11.7022q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ã\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XÆ': {\r\n    getPath: () => `M2.7219,16v-1.1573h-1.5393l-0.5562,1.1573h-0.559l1.927,-3.9579h3.3961v0.4382h-2.132v1.2697h1.9635v0.4326h-1.9635v1.3792h2.2472v0.4382h-2.7837zM2.7219,12.4551h-0.4242l-0.0787,0.177l-0.8399,1.7921h1.3427v-1.9691z`,\r\n    get width() { return getGridUnitWidth(2048); },\r\n    height: 16,\r\n    char: \"Æ\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'XÇ': {\r\n    getPath: () => `M2.2247,12.4213q-0.6573,0,-1.0225,0.4228t-0.3652,1.1587q0,0.7275,0.3806,1.1699t1.0295,0.4424q0.8315,0,1.25,-0.823l0.4382,0.2191q-0.2444,0.5112,-0.6868,0.7781t-1.0267,0.2669q-0.5983,0,-1.0351,-0.2486t-0.6657,-0.7107t-0.2289,-1.0941q0,-0.9466,0.5112,-1.4831t1.4157,-0.5365q0.632,0,1.0562,0.2472t0.6236,0.7331l-0.5084,0.1685q-0.1376,-0.3455,-0.4424,-0.5281t-0.7233,-0.1826zM2.7893,16.7107q0,0.5084,-0.7697,0.5084q-0.1601,0,-0.2528,-0.0112v-0.2753q0.1376,0.0169,0.2416,0.0169q0.4129,0,0.4129,-0.2275q0,-0.2163,-0.3736,-0.2163q-0.1208,0,-0.1601,0.0056l0.1826,-0.5112h0.3006l-0.1096,0.2809q0.264,0.0084,0.3961,0.1222t0.132,0.3076z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ç\"\r\n  },\r\n  'XÈ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM2.0646,11.7022l-0.8708,-0.6096v-0.0815h0.5815l0.6096,0.6348v0.0562h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"È\"\r\n  },\r\n  'XÉ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM1.5478,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"É\"\r\n  },\r\n  'XÊ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM2.9129,11.6461v0.0562h-0.2949l-0.6152,-0.3904h-0.0056l-0.6517,0.3904h-0.2921v-0.0562l0.6573,-0.6742h0.573z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ê\"\r\n  },\r\n  'XË': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM2.2921,11.7022v-0.5169h0.4579v0.5169h-0.4579zM1.1854,11.7022v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ë\"\r\n  },\r\n  'XÌ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM0.8961,11.7022l-0.8708,-0.6096v-0.0815h0.5815l0.6096,0.6348v0.0562h-0.3202z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Ì\"\r\n  },\r\n  'XÍ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM0.3989,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Í\"\r\n  },\r\n  'XÎ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM1.7303,11.6461v0.0562h-0.2949l-0.6152,-0.3904h-0.0056l-0.6517,0.3904h-0.2921v-0.0562l0.6573,-0.6742h0.573z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Î\"\r\n  },\r\n  'XÏ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM1.1264,11.7022v-0.5169h0.4579v0.5169h-0.4579zM0.0197,11.7022v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Ï\"\r\n  },\r\n  'XÐ': {\r\n    getPath: () => `M0.0393,13.75h0.4326v-1.7079h1.309q1.0056,0,1.552,0.5042t0.5463,1.434q0,0.6124,-0.2388,1.0716t-0.677,0.7037t-1.0112,0.2444h-1.4803v-1.8174h-0.4326v-0.4326zM3.3399,13.9803q0,-0.736,-0.4031,-1.1222t-1.1671,-0.3862h-0.7612v1.2781h1.1404v0.4326h-1.1404v1.3876h0.882q0.4354,0,0.7654,-0.191t0.507,-0.5506t0.177,-0.8483z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ð\"\r\n  },\r\n  'XÑ': {\r\n    getPath: () => `M3.0393,16l-2.118,-3.3708l0.014,0.2725l0.014,0.4691v2.6292h-0.4775v-3.9579h0.6236l2.1404,3.3933q-0.0337,-0.5506,-0.0337,-0.7978v-2.5955h0.4831v3.9579h-0.6461zM2.5534,11.7022q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ñ\"\r\n  },\r\n  'XÒ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM2.3989,11.7022l-0.8708,-0.6096v-0.0815h0.5815l0.6096,0.6348v0.0562h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ò\"\r\n  },\r\n  'XÓ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM1.7444,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ó\"\r\n  },\r\n  'XÔ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM3.177,11.6461v0.0562h-0.2949l-0.6152,-0.3904h-0.0056l-0.6517,0.3904h-0.2921v-0.0562l0.6573,-0.6742h0.573z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ô\"\r\n  },\r\n  'XÕ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM2.6433,11.7022q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Õ\"\r\n  },\r\n  'XØ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.691,0,-1.1629,-0.3146l-0.3371,0.4073h-0.5337l0.5618,-0.677q-0.4888,-0.5393,-0.4888,-1.4691q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6938,0,1.1629,0.309l0.3399,-0.4101h0.5393l-0.5646,0.6798q0.4831,0.5337,0.4831,1.441zM3.6517,14.0028q0,-0.6292,-0.2753,-1.0337l-1.9916,2.3961q0.3427,0.2556,0.8483,0.2556q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM0.8174,14.0028q0,0.6433,0.2837,1.0618l1.986,-2.3961q-0.3483,-0.2472,-0.8483,-0.2472q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ø\"\r\n  },\r\n  'XÙ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM2.2837,11.7022l-0.8708,-0.6096v-0.0815h0.5815l0.6096,0.6348v0.0562h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ù\"\r\n  },\r\n  'XÚ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM1.5871,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ú\"\r\n  },\r\n  'XÛ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM3.0056,11.6461v0.0562h-0.2949l-0.6152,-0.3904h-0.0056l-0.6517,0.3904h-0.2921v-0.0562l0.6573,-0.6742h0.573z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Û\"\r\n  },\r\n  'XÜ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM2.3961,11.7022v-0.5169h0.4579v0.5169h-0.4579zM1.2893,11.7022v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ü\"\r\n  },\r\n  // Kerning inherited from 'Y'\r\n  'XÝ': {\r\n    getPath: () => `M2.1826,14.3596v1.6404h-0.5337v-1.6404l-1.5225,-2.3174h0.5899l1.2051,1.8848l1.1994,-1.8848h0.5899zM1.5056,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ý\",\r\n    kerningRules: {\r\n      \"a\": getGridUnitKerningRule(152),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"e\": getGridUnitKerningRule(188),\r\n      \"i\": getGridUnitKerningRule(76),\r\n      \"o\": getGridUnitKerningRule(188),\r\n      \"p\": getGridUnitKerningRule(152),\r\n      \"q\": getGridUnitKerningRule(188),\r\n      \"u\": getGridUnitKerningRule(113),\r\n      \"v\": getGridUnitKerningRule(113)\r\n    }\r\n  },\r\n  // Kerning inherited from 'T'\r\n  'XÞ': {\r\n    getPath: () => `M3.5337,13.9354q0,0.3596,-0.1629,0.639t-0.4705,0.4354t-0.7289,0.1559h-1.1629v0.8343h-0.5365v-3.9579h0.5365v0.7079h1.1292q0.6713,0,1.0337,0.3118t0.3624,0.8736zM2.9944,13.9466q0,-0.3764,-0.2303,-0.5857t-0.691,-0.2093h-1.0646v1.618h1.0871q0.4298,0,0.6643,-0.2177t0.2346,-0.6053z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Þ\",\r\n    kerningRules: {\r\n      \"a\": getGridUnitKerningRule(227),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"c\": getGridUnitKerningRule(227),\r\n      \"e\": getGridUnitKerningRule(227),\r\n      \"i\": getGridUnitKerningRule(76),\r\n      \"o\": getGridUnitKerningRule(227),\r\n      \"O\": getGridUnitKerningRule(37),\r\n      \"r\": getGridUnitKerningRule(76),\r\n      \"s\": getGridUnitKerningRule(227),\r\n      \"u\": getGridUnitKerningRule(76),\r\n      \"w\": getGridUnitKerningRule(113),\r\n      \"y\": getGridUnitKerningRule(113)\r\n    }\r\n  },\r\n  'Xß': {\r\n    getPath: () => `M3.2781,15.1713q0,0.4213,-0.264,0.6531t-0.7416,0.2317q-0.4803,0,-0.7949,-0.1376l-0.0056,-0.4607q0.1461,0.0815,0.3708,0.1376t0.4185,0.0562q0.2584,0,0.3961,-0.1208t0.1376,-0.3427q0,-0.1798,-0.1194,-0.323t-0.3919,-0.3062q-0.2584,-0.1517,-0.3862,-0.3371t-0.1278,-0.427q0,-0.1713,0.0801,-0.3118t0.2317,-0.2669q0.1629,-0.1348,0.2374,-0.2528t0.0744,-0.2584q0,-0.2163,-0.1882,-0.3469t-0.4944,-0.1306q-0.4157,0,-0.611,0.2247t-0.1952,0.6798v2.868h-0.5056v-2.8848q0,-0.6376,0.3301,-0.9607t0.9817,-0.323q0.5337,0,0.8497,0.2261t0.316,0.6081q0,0.4017,-0.3174,0.691q-0.2219,0.2022,-0.2697,0.2711t-0.0478,0.1503q0,0.1067,0.0772,0.1896t0.1924,0.1629t0.25,0.1699q0.5169,0.3483,0.5169,0.8708z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"ß\"\r\n  },\r\n  'Xà': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM1.7528,12.6264l-0.927,-0.7809v-0.0815h0.5815l0.6096,0.8062v0.0562h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"à\"\r\n  },\r\n  'Xá': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM1.1573,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"á\"\r\n  },\r\n  'Xâ': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM2.4719,12.5702v0.0562h-0.2949l-0.6152,-0.4747h-0.0056l-0.6517,0.4747h-0.2921v-0.0562l0.6573,-0.7584h0.573z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"â\"\r\n  },\r\n  'Xã': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM2.0702,12.6264q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ã\"\r\n  },\r\n  'Xæ': {\r\n    getPath: () => `M2.7191,14.5871v0.0478q0.0056,0.5084,0.2163,0.7753t0.6039,0.2669q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.9017,0,-1.1882,-0.7219q-0.2219,0.3933,-0.5169,0.5576t-0.7051,0.1643q-0.4691,0,-0.7065,-0.2416t-0.2374,-0.6629q0,-0.4888,0.3343,-0.736t1.014,-0.2584l0.6742,-0.0112v-0.1657q0,-0.3792,-0.1559,-0.5351t-0.4958,-0.1559q-0.3539,0,-0.5126,0.1124t-0.1952,0.3708l-0.5281,-0.0478q0.1292,-0.8202,1.2472,-0.8202q0.7022,0,0.9803,0.3904q0.3315,-0.3904,0.9719,-0.3904q1.3399,0,1.3399,1.6152v0.0674h-2.1404zM2.2079,14.5l-0.5478,0.0112q-0.3736,0.0084,-0.5716,0.0829t-0.2907,0.2163t-0.0927,0.3497q0,0.2444,0.1404,0.3806t0.4017,0.1362q0.2865,0,0.5014,-0.125t0.3371,-0.3427t0.1222,-0.4593v-0.25zM4.3371,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.3567,0,-0.5632,0.2402t-0.2233,0.6812h1.6124z`,\r\n    get width() { return getGridUnitWidth(1821); },\r\n    height: 16,\r\n    char: \"æ\"\r\n  },\r\n  'Xç': {\r\n    getPath: () => `M0.7725,14.4663q0,0.6067,0.191,0.8989t0.5758,0.2921q0.2697,0,0.4508,-0.1461t0.2233,-0.4494l0.5112,0.0337q-0.059,0.4382,-0.3736,0.6994t-0.7978,0.2612q-0.6376,0,-0.9733,-0.4031t-0.3357,-1.1756q0,-0.7669,0.3371,-1.1699t0.9663,-0.4031q0.4663,0,0.7739,0.2416t0.3862,0.6657l-0.5197,0.0393q-0.0393,-0.2528,-0.1994,-0.4017t-0.4551,-0.1489q-0.4017,0,-0.5815,0.2669t-0.1798,0.8989zM2.1096,16.7107q0,0.5084,-0.7697,0.5084q-0.1601,0,-0.2528,-0.0112v-0.2753q0.1376,0.0169,0.2416,0.0169q0.4129,0,0.4129,-0.2275q0,-0.2163,-0.3736,-0.2163q-0.1208,0,-0.1601,0.0056l0.1826,-0.5112h0.3006l-0.1096,0.2809q0.264,0.0084,0.3961,0.1222t0.132,0.3076z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ç\"\r\n  },\r\n  'Xè': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM1.8455,12.6264l-0.927,-0.7809v-0.0815h0.5815l0.6096,0.8062v0.0562h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"è\"\r\n  },\r\n  'Xé': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM1.236,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"é\"\r\n  },\r\n  'Xê': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM2.5478,12.5702v0.0562h-0.2949l-0.6152,-0.4747h-0.0056l-0.6517,0.4747h-0.2921v-0.0562l0.6573,-0.7584h0.573z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ê\"\r\n  },\r\n  'Xë': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM1.9298,12.5758v-0.5169h0.4579v0.5169h-0.4579zM0.823,12.5758v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ë\"\r\n  },\r\n  'Xì': {\r\n    getPath: () => `M0.5449,16v-3.0393h0.5056v3.0393h-0.5056zM0.9551,12.6264l-0.927,-0.7809v-0.0815h0.5815l0.6096,0.8062v0.0562h-0.264z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"ì\"\r\n  },\r\n  'Xí': {\r\n    getPath: () => `M0.5449,16v-3.0393h0.5056v3.0393h-0.5056zM0.3792,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"í\"\r\n  },\r\n  'Xî': {\r\n    getPath: () => `M0.5449,16v-3.0393h0.5056v3.0393h-0.5056zM1.7331,12.5702v0.0562h-0.2949l-0.6152,-0.4747h-0.0056l-0.6517,0.4747h-0.2921v-0.0562l0.6573,-0.7584h0.573z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"î\"\r\n  },\r\n  'Xï': {\r\n    getPath: () => `M0.5449,16v-3.0393h0.5056v3.0393h-0.5056zM1.1292,12.5758v-0.5169h0.4579v0.5169h-0.4579zM0.0225,12.5758v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"ï\"\r\n  },\r\n  'Xð': {\r\n    getPath: () => `M1.5899,16.0562q-0.6517,0,-1,-0.3624t-0.3483,-1.0449q0,-0.6854,0.3483,-1.0421t1.0197,-0.3567q0.3848,0,0.6489,0.1657q-0.3062,-0.6096,-0.6573,-0.9298l-0.8455,0.3736v-0.3202l0.6124,-0.264q-0.3062,-0.2444,-0.6798,-0.4438h0.5871q0.2247,0.1011,0.4775,0.2865l0.8596,-0.3708l-0.0028,0.3146l-0.5927,0.2584q0.4803,0.4382,0.7247,1.0084t0.2444,1.2219v0.0169q0,0.7331,-0.3497,1.111t-1.0463,0.3778zM2.4551,14.6489q0,-0.5393,-0.198,-0.7823t-0.6362,-0.243q-0.441,0,-0.6447,0.2444t-0.2037,0.7809q0,0.5337,0.2022,0.7837t0.6096,0.25q0.4522,0,0.6615,-0.2458t0.2093,-0.7879z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ð\"\r\n  },\r\n  'Xñ': {\r\n    getPath: () => `M2.3287,16v-1.927q0,-0.3006,-0.059,-0.4663t-0.1882,-0.2388t-0.3792,-0.073q-0.3652,0,-0.5758,0.25t-0.2107,0.6938v1.7612h-0.5056v-2.3904q0,-0.5309,-0.0169,-0.6489h0.4775q0.0028,0.014,0.0056,0.0758t0.007,0.1419t0.0098,0.302h0.0084q0.1742,-0.3146,0.4031,-0.4452t0.5688,-0.1306q0.5,0,0.7317,0.2486t0.2317,0.8216v2.0253h-0.5084zM2.0702,12.6264q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ñ\"\r\n  },\r\n  'Xò': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM1.8511,12.6264l-0.927,-0.7809v-0.0815h0.5815l0.6096,0.8062v0.0562h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ò\"\r\n  },\r\n  'Xó': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM1.2107,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ó\"\r\n  },\r\n  'Xô': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM2.5337,12.5702v0.0562h-0.2949l-0.6152,-0.4747h-0.0056l-0.6517,0.4747h-0.2921v-0.0562l0.6573,-0.7584h0.573z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ô\"\r\n  },\r\n  'Xõ': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM2.0758,12.6264q-0.118,0,-0.236,-0.052t-0.2275,-0.1152t-0.2093,-0.1152t-0.1868,-0.052q-0.1545,0,-0.2303,0.0871t-0.1011,0.2472h-0.2556q0.0309,-0.2865,0.0983,-0.434t0.1812,-0.2331t0.2907,-0.0857q0.1236,0,0.2416,0.052t0.2275,0.1152t0.2065,0.1152t0.1812,0.052q0.2809,0,0.3287,-0.3343h0.2584q-0.0478,0.4157,-0.1882,0.5843t-0.3792,0.1685z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"õ\"\r\n  },\r\n  'Xø': {\r\n    getPath: () => `M3.1236,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.5478,0,-0.8792,-0.2753l-0.2809,0.3258h-0.4691l0.5169,-0.6011q-0.2331,-0.3876,-0.2331,-1.0281q0,-1.573,1.3624,-1.573q0.5646,0,0.8876,0.2556l0.2556,-0.2949h0.4691l-0.486,0.5646q0.2275,0.3736,0.2275,1.0478zM2.5927,14.4775q0,-0.3624,-0.0646,-0.6208l-1.3567,1.5787q0.191,0.2472,0.5758,0.2472q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM0.9382,14.4775q0,0.3652,0.0674,0.6039l1.3539,-1.5758q-0.1882,-0.2275,-0.5815,-0.2275q-0.4438,0,-0.6419,0.2907t-0.198,0.9087z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"ø\"\r\n  },\r\n  'Xù': {\r\n    getPath: () => `M0.8989,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM1.8876,12.6264l-0.927,-0.7809v-0.0815h0.5815l0.6096,0.8062v0.0562h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ù\"\r\n  },\r\n  'Xú': {\r\n    getPath: () => `M0.8989,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM1.1657,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ú\"\r\n  },\r\n  'Xû': {\r\n    getPath: () => `M0.8989,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM2.5309,12.5702v0.0562h-0.2949l-0.6152,-0.4747h-0.0056l-0.6517,0.4747h-0.2921v-0.0562l0.6573,-0.7584h0.573z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"û\"\r\n  },\r\n  'Xü': {\r\n    getPath: () => `M0.8989,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM1.8989,12.5758v-0.5169h0.4579v0.5169h-0.4579zM0.7921,12.5758v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ü\"\r\n  },\r\n  'Xý': {\r\n    getPath: () => `M0.5365,17.1938q-0.2079,0,-0.3483,-0.0309v-0.3792q0.1067,0.0169,0.236,0.0169q0.4719,0,0.7472,-0.6938l0.0478,-0.1208l-1.2051,-3.0253h0.5393l0.6404,1.6798q0.014,0.0393,0.0337,0.0941t0.1264,0.3666t0.1152,0.3483l0.1966,-0.5534l0.6657,-1.9354h0.5337l-1.1685,3.0393q-0.1882,0.486,-0.3511,0.7233t-0.361,0.3539t-0.448,0.1166zM0.9972,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ý\"\r\n  },\r\n  'Xþ': {\r\n    getPath: () => `M0.3876,11.8315h0.5056v1.1882q0,0.1826,-0.0112,0.4298h0.0169q0.1348,-0.2809,0.3567,-0.4115t0.5843,-0.1306q0.5618,0,0.8399,0.3764t0.2781,1.1826q0,1.5899,-1.118,1.5899q-0.7022,0,-0.9438,-0.5281h-0.014q0.0112,0.0225,0.0112,0.4775v1.1882h-0.5056v-5.3624zM2.427,14.4775q0,-0.6348,-0.1713,-0.9073t-0.5449,-0.2725q-0.3006,0,-0.4705,0.1264t-0.2584,0.3947t-0.0885,0.698q0,0.5983,0.191,0.882t0.6208,0.2837q0.3764,0,0.5492,-0.2767t0.1728,-0.9284z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"þ\"\r\n  },\r\n  'Xÿ': {\r\n    getPath: () => `M0.5365,17.1938q-0.2079,0,-0.3483,-0.0309v-0.3792q0.1067,0.0169,0.236,0.0169q0.4719,0,0.7472,-0.6938l0.0478,-0.1208l-1.2051,-3.0253h0.5393l0.6404,1.6798q0.014,0.0393,0.0337,0.0941t0.1264,0.3666t0.1152,0.3483l0.1966,-0.5534l0.6657,-1.9354h0.5337l-1.1685,3.0393q-0.1882,0.486,-0.3511,0.7233t-0.361,0.3539t-0.448,0.1166zM1.7584,12.5758v-0.5169h0.4579v0.5169h-0.4579zM0.6517,12.5758v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ÿ\"\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XĀ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM2.6966,11.6039h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ā\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'Xā': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM2.3399,12.5281h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ā\"\r\n  },\r\n  // Kerning inherited from 'A'\r\n  'XĄ': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382zM3.8736,17.0927q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ą\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"v\": getGridUnitKerningRule(37),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"w\": getGridUnitKerningRule(37),\r\n      \"W\": getGridUnitKerningRule(76),\r\n      \"y\": getGridUnitKerningRule(37),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'Xą': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348zM3.1994,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ą\"\r\n  },\r\n  'XĆ': {\r\n    getPath: () => `M2.2247,12.4213q-0.6573,0,-1.0225,0.4228t-0.3652,1.1587q0,0.7275,0.3806,1.1699t1.0295,0.4424q0.8315,0,1.25,-0.823l0.4382,0.2191q-0.2444,0.5112,-0.6868,0.7781t-1.0267,0.2669q-0.5983,0,-1.0351,-0.2486t-0.6657,-0.7107t-0.2289,-1.0941q0,-0.9466,0.5112,-1.4831t1.4157,-0.5365q0.632,0,1.0562,0.2472t0.6236,0.7331l-0.5084,0.1685q-0.1376,-0.3455,-0.4424,-0.5281t-0.7233,-0.1826zM1.8736,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ć\"\r\n  },\r\n  'Xć': {\r\n    getPath: () => `M0.7725,14.4663q0,0.6067,0.191,0.8989t0.5758,0.2921q0.2697,0,0.4508,-0.1461t0.2233,-0.4494l0.5112,0.0337q-0.059,0.4382,-0.3736,0.6994t-0.7978,0.2612q-0.6376,0,-0.9733,-0.4031t-0.3357,-1.1756q0,-0.7669,0.3371,-1.1699t0.9663,-0.4031q0.4663,0,0.7739,0.2416t0.3862,0.6657l-0.5197,0.0393q-0.0393,-0.2528,-0.1994,-0.4017t-0.4551,-0.1489q-0.4017,0,-0.5815,0.2669t-0.1798,0.8989zM1.2107,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ć\"\r\n  },\r\n  'XČ': {\r\n    getPath: () => `M2.2247,12.4213q-0.6573,0,-1.0225,0.4228t-0.3652,1.1587q0,0.7275,0.3806,1.1699t1.0295,0.4424q0.8315,0,1.25,-0.823l0.4382,0.2191q-0.2444,0.5112,-0.6868,0.7781t-1.0267,0.2669q-0.5983,0,-1.0351,-0.2486t-0.6657,-0.7107t-0.2289,-1.0941q0,-0.9466,0.5112,-1.4831t1.4157,-0.5365q0.632,0,1.0562,0.2472t0.6236,0.7331l-0.5084,0.1685q-0.1376,-0.3455,-0.4424,-0.5281t-0.7233,-0.1826zM2.5225,11.7022h-0.573l-0.6573,-0.6713v-0.059h0.2921l0.6517,0.3904h0.0056l0.6152,-0.3904h0.2949v0.059z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Č\"\r\n  },\r\n  'Xč': {\r\n    getPath: () => `M0.7725,14.4663q0,0.6067,0.191,0.8989t0.5758,0.2921q0.2697,0,0.4508,-0.1461t0.2233,-0.4494l0.5112,0.0337q-0.059,0.4382,-0.3736,0.6994t-0.7978,0.2612q-0.6376,0,-0.9733,-0.4031t-0.3357,-1.1756q0,-0.7669,0.3371,-1.1699t0.9663,-0.4031q0.4663,0,0.7739,0.2416t0.3862,0.6657l-0.5197,0.0393q-0.0393,-0.2528,-0.1994,-0.4017t-0.4551,-0.1489q-0.4017,0,-0.5815,0.2669t-0.1798,0.8989zM1.8315,12.6264h-0.573l-0.6573,-0.7584v-0.0562h0.2921l0.6517,0.4747h0.0056l0.6152,-0.4747h0.2949v0.0562z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"č\"\r\n  },\r\n  'XĒ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM2.7472,11.6039h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ē\"\r\n  },\r\n  'Xē': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM2.3736,12.5281h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ē\"\r\n  },\r\n  'XĖ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM1.7219,11.4916v-0.4831h0.5056v0.4831h-0.5056z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ė\"\r\n  },\r\n  'Xė': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM1.3483,12.3146v-0.4831h0.5056v0.4831h-0.5056z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ė\"\r\n  },\r\n  'XĘ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM3.5899,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ę\"\r\n  },\r\n  'Xę': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM2.2781,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ę\"\r\n  },\r\n  'XĢ': {\r\n    getPath: () => `M0.2893,14.0028q0,-0.9635,0.5169,-1.4916t1.4522,-0.5281q0.6573,0,1.0674,0.2219t0.632,0.7107l-0.5112,0.1517q-0.1685,-0.3371,-0.4649,-0.4916t-0.7374,-0.1545q-0.6854,0,-1.0478,0.4143t-0.3624,1.1671q0,0.75,0.3848,1.184t1.0646,0.434q0.3876,0,0.7233,-0.118t0.5435,-0.3202v-0.7135h-1.1826v-0.4494h1.677v1.3652q-0.3146,0.3202,-0.7711,0.4958t-0.9902,0.1756q-0.6208,0,-1.0702,-0.2472t-0.6868,-0.7121t-0.2374,-1.0941zM2.5787,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ģ\"\r\n  },\r\n  'Xģ': {\r\n    getPath: () => `M1.5393,17.1938q-0.4972,0,-0.7921,-0.1952t-0.3792,-0.5548l0.5084,-0.073q0.0506,0.2107,0.2233,0.3244t0.4537,0.1138q0.7556,0,0.7556,-0.8848v-0.4888h-0.0056q-0.1433,0.2921,-0.3933,0.4396t-0.5843,0.1475q-0.559,0,-0.8216,-0.3708t-0.2626,-1.1657q0,-0.8062,0.2823,-1.1896t0.8581,-0.3834q0.323,0,0.5604,0.1475t0.3666,0.4199h0.0056q0,-0.0843,0.0112,-0.2921t0.0225,-0.2275h0.4803q-0.0169,0.1517,-0.0169,0.6292v2.323q0,1.2809,-1.2725,1.2809zM2.309,14.4803q0,-0.3708,-0.1011,-0.639t-0.2851,-0.4101t-0.4171,-0.1419q-0.3876,0,-0.5646,0.2809t-0.177,0.9101q0,0.6236,0.1657,0.8961t0.5674,0.2725q0.2388,0,0.4242,-0.1404t0.2865,-0.4031t0.1011,-0.625zM1.2416,12.3006q0,-0.2444,0.0618,-0.4087t0.1742,-0.2963h0.3287q-0.264,0.2809,-0.264,0.5337h0.2472v0.4691h-0.5478v-0.2978z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ģ\"\r\n  },\r\n  'XĪ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM1.5758,11.6039h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Ī\"\r\n  },\r\n  'Xī': {\r\n    getPath: () => `M0.5449,16v-3.0393h0.5056v3.0393h-0.5056zM1.5758,12.5281h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"ī\"\r\n  },\r\n  'XĮ': {\r\n    getPath: () => `M0.5309,16v-3.9579h0.5365v3.9579h-0.5365zM1.2416,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(569); },\r\n    height: 16,\r\n    char: \"Į\"\r\n  },\r\n  'Xį': {\r\n    getPath: () => `M0.3848,12.3146v-0.4831h0.5056v0.4831h-0.5056zM0.3848,16v-3.0393h0.5056v3.0393h-0.5056zM1.0702,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 16,\r\n    char: \"į\"\r\n  },\r\n  'XĶ': {\r\n    getPath: () => `M3.1067,16l-1.5815,-1.9101l-0.5169,0.3933v1.5169h-0.5365v-3.9579h0.5365v1.9831l1.9073,-1.9831h0.632l-1.6854,1.7191l1.9101,2.2388h-0.6657zM2.2612,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ķ\"\r\n  },\r\n  'Xķ': {\r\n    getPath: () => `M2.2921,16l-1.0281,-1.3876l-0.3708,0.3062v1.0815h-0.5056v-4.1685h0.5056v2.6039l1.3343,-1.4747h0.5927l-1.2331,1.3062l1.2978,1.7331h-0.5927zM1.8596,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ķ\"\r\n  },\r\n  // Kerning inherited from 'L'\r\n  'XĻ': {\r\n    getPath: () => `M0.4719,16v-3.9579h0.5365v3.5197h2v0.4382h-2.5365zM2.014,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"Ļ\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(152),\r\n      \"y\": getGridUnitKerningRule(76),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'Xļ': {\r\n    getPath: () => `M0.3876,16v-4.1685h0.5056v4.1685h-0.5056zM0.9185,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 16,\r\n    char: \"ļ\"\r\n  },\r\n  // Kerning inherited from 'L'\r\n  'XŁ': {\r\n    getPath: () => `M1.7303,13.7612l-0.7219,0.4185v1.382h2v0.4382h-2.5365v-1.5112l-0.4157,0.2388v-0.4438l0.4157,-0.2388v-2.0028h0.5365v1.6938l0.7219,-0.4157v0.441z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"Ł\",\r\n    kerningRules: {\r\n      \"T\": getGridUnitKerningRule(152),\r\n      \"V\": getGridUnitKerningRule(152),\r\n      \"W\": getGridUnitKerningRule(152),\r\n      \"y\": getGridUnitKerningRule(76),\r\n      \"Y\": getGridUnitKerningRule(152)\r\n    }\r\n  },\r\n  'Xł': {\r\n    getPath: () => `M0.3876,16v-1.5225l-0.3427,0.191v-0.4438l0.3427,-0.191v-2.2022h0.5056v1.9101l0.3483,-0.2022v0.4466l-0.3483,0.1994v1.8146h-0.5056z`,\r\n    get width() { return getGridUnitWidth(455); },\r\n    height: 16,\r\n    char: \"ł\"\r\n  },\r\n  'XŃ': {\r\n    getPath: () => `M3.0393,16l-2.118,-3.3708l0.014,0.2725l0.014,0.4691v2.6292h-0.4775v-3.9579h0.6236l2.1404,3.3933q-0.0337,-0.5506,-0.0337,-0.7978v-2.5955h0.4831v3.9579h-0.6461zM1.6882,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ń\"\r\n  },\r\n  'Xń': {\r\n    getPath: () => `M2.3287,16v-1.927q0,-0.3006,-0.059,-0.4663t-0.1882,-0.2388t-0.3792,-0.073q-0.3652,0,-0.5758,0.25t-0.2107,0.6938v1.7612h-0.5056v-2.3904q0,-0.5309,-0.0169,-0.6489h0.4775q0.0028,0.014,0.0056,0.0758t0.007,0.1419t0.0098,0.302h0.0084q0.1742,-0.3146,0.4031,-0.4452t0.5688,-0.1306q0.5,0,0.7317,0.2486t0.2317,0.8216v2.0253h-0.5084zM1.2921,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ń\"\r\n  },\r\n  'XŅ': {\r\n    getPath: () => `M3.0393,16l-2.118,-3.3708l0.014,0.2725l0.014,0.4691v2.6292h-0.4775v-3.9579h0.6236l2.1404,3.3933q-0.0337,-0.5506,-0.0337,-0.7978v-2.5955h0.4831v3.9579h-0.6461zM2.3483,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ņ\"\r\n  },\r\n  'Xņ': {\r\n    getPath: () => `M2.3287,16v-1.927q0,-0.3006,-0.059,-0.4663t-0.1882,-0.2388t-0.3792,-0.073q-0.3652,0,-0.5758,0.25t-0.2107,0.6938v1.7612h-0.5056v-2.3904q0,-0.5309,-0.0169,-0.6489h0.4775q0.0028,0.014,0.0056,0.0758t0.007,0.1419t0.0098,0.302h0.0084q0.1742,-0.3146,0.4031,-0.4452t0.5688,-0.1306q0.5,0,0.7317,0.2486t0.2317,0.8216v2.0253h-0.5084zM1.8961,16.5421q0,0.2444,-0.0618,0.3947t-0.1742,0.2823h-0.3287q0.1264,-0.1348,0.1952,-0.2556t0.0688,-0.25h-0.2472v-0.4382h0.5478v0.2669z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ņ\"\r\n  },\r\n  'XŐ': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952zM1.4438,11.7022v-0.0562l0.5534,-0.6376h0.5815v0.0815l-0.8708,0.6124h-0.264zM2.4185,11.7022v-0.0562l0.5534,-0.6376h0.5815v0.0815l-0.8708,0.6124h-0.264z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"Ő\"\r\n  },\r\n  'Xő': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129zM0.8062,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264zM1.7809,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ő\"\r\n  },\r\n  'XŒ': {\r\n    getPath: () => `M2.8062,16q-0.1882,0.0281,-0.5899,0.0281q-0.9073,0,-1.4256,-0.5421t-0.5183,-1.4831q0,-0.9326,0.5169,-1.4621t1.4326,-0.5295q0.3006,0,0.5955,0.0309h2.5674v0.4382h-2.2556v1.2697h2.0871v0.4326h-2.0871v1.3792h2.3708v0.4382h-2.6938zM2.2163,15.5927q0.2303,0,0.3764,-0.0112v-3.1208q-0.1236,-0.0112,-0.2261,-0.0112h-0.1447q-0.6882,0,-1.0463,0.4017t-0.3581,1.1517q0,0.7528,0.3694,1.1713t1.0295,0.4185z`,\r\n    get width() { return getGridUnitWidth(2048); },\r\n    height: 16,\r\n    char: \"Œ\"\r\n  },\r\n  'Xœ': {\r\n    getPath: () => `M3.0056,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.7725,0,-1.1124,-0.514q-0.3483,0.514,-1.1264,0.514q-0.6685,0,-1.0211,-0.4059t-0.3525,-1.1728q0,-0.7837,0.3553,-1.1784t1.0351,-0.3947q0.7893,0,1.118,0.4972q0.3539,-0.4972,1.0843,-0.4972q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4747,14.4775q0,-0.6152,-0.1938,-0.9073t-0.6404,-0.2921q-0.4551,0,-0.6615,0.2992t-0.2065,0.9003q0,1.2051,0.8371,1.2051q0.4607,0,0.6629,-0.2921t0.2022,-0.9129zM4.6517,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404z`,\r\n    get width() { return getGridUnitWidth(1933); },\r\n    height: 16,\r\n    char: \"œ\"\r\n  },\r\n  'XŚ': {\r\n    getPath: () => `M3.573,14.9073q0,0.5478,-0.4284,0.8483t-1.2065,0.3006q-1.4466,0,-1.677,-1.0056l0.5197,-0.1039q0.0899,0.3567,0.382,0.5239t0.7949,0.1671q0.5197,0,0.802,-0.1784t0.2823,-0.5239q0,-0.1938,-0.0885,-0.3146t-0.2486,-0.1994t-0.382,-0.132t-0.4916,-0.1152q-0.4691,-0.1039,-0.7121,-0.2079t-0.3834,-0.2317t-0.2149,-0.2992t-0.0744,-0.3933q0,-0.5084,0.389,-0.7837t1.1138,-0.2753q0.6742,0,1.0309,0.2065t0.5,0.7037l-0.5281,0.0927q-0.0871,-0.3146,-0.3315,-0.4565t-0.677,-0.1419q-0.4747,0,-0.7247,0.1573t-0.25,0.4691q0,0.1826,0.0969,0.302t0.2795,0.2022t0.7275,0.2037q0.1826,0.0421,0.3638,0.0857t0.3469,0.1039t0.3104,0.1419t0.2514,0.1994t0.1671,0.2781t0.0604,0.3764zM1.5787,11.7022v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ś\"\r\n  },\r\n  'Xś': {\r\n    getPath: () => `M2.6685,15.1601q0,0.4298,-0.3244,0.6629t-0.9087,0.2331q-0.5674,0,-0.875,-0.1868t-0.4003,-0.5829l0.4466,-0.0871q0.0646,0.2444,0.2669,0.3581t0.5618,0.1138q0.3848,0,0.5632,-0.118t0.1784,-0.3539q0,-0.1798,-0.1236,-0.2921t-0.3989,-0.1854l-0.3624,-0.0955q-0.4354,-0.1124,-0.6194,-0.2205t-0.2879,-0.2626t-0.1039,-0.3792q0,-0.4157,0.2963,-0.6334t0.8638,-0.2177q0.5028,0,0.7992,0.177t0.375,0.5674l-0.4551,0.0562q-0.0421,-0.2022,-0.2261,-0.3104t-0.493,-0.1081q-0.3427,0,-0.5056,0.1039t-0.1629,0.3146q0,0.1292,0.0674,0.2135t0.1994,0.1433t0.5562,0.1629q0.4017,0.1011,0.5787,0.1868t0.2795,0.1896t0.1587,0.2402t0.0562,0.3104zM1.0815,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ś\"\r\n  },\r\n  'XŠ': {\r\n    getPath: () => `M3.573,14.9073q0,0.5478,-0.4284,0.8483t-1.2065,0.3006q-1.4466,0,-1.677,-1.0056l0.5197,-0.1039q0.0899,0.3567,0.382,0.5239t0.7949,0.1671q0.5197,0,0.802,-0.1784t0.2823,-0.5239q0,-0.1938,-0.0885,-0.3146t-0.2486,-0.1994t-0.382,-0.132t-0.4916,-0.1152q-0.4691,-0.1039,-0.7121,-0.2079t-0.3834,-0.2317t-0.2149,-0.2992t-0.0744,-0.3933q0,-0.5084,0.389,-0.7837t1.1138,-0.2753q0.6742,0,1.0309,0.2065t0.5,0.7037l-0.5281,0.0927q-0.0871,-0.3146,-0.3315,-0.4565t-0.677,-0.1419q-0.4747,0,-0.7247,0.1573t-0.25,0.4691q0,0.1826,0.0969,0.302t0.2795,0.2022t0.7275,0.2037q0.1826,0.0421,0.3638,0.0857t0.3469,0.1039t0.3104,0.1419t0.2514,0.1994t0.1671,0.2781t0.0604,0.3764zM2.2725,11.7022h-0.573l-0.6573,-0.6713v-0.059h0.2921l0.6517,0.3904h0.0056l0.6152,-0.3904h0.2949v0.059z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Š\"\r\n  },\r\n  'Xš': {\r\n    getPath: () => `M2.6685,15.1601q0,0.4298,-0.3244,0.6629t-0.9087,0.2331q-0.5674,0,-0.875,-0.1868t-0.4003,-0.5829l0.4466,-0.0871q0.0646,0.2444,0.2669,0.3581t0.5618,0.1138q0.3848,0,0.5632,-0.118t0.1784,-0.3539q0,-0.1798,-0.1236,-0.2921t-0.3989,-0.1854l-0.3624,-0.0955q-0.4354,-0.1124,-0.6194,-0.2205t-0.2879,-0.2626t-0.1039,-0.3792q0,-0.4157,0.2963,-0.6334t0.8638,-0.2177q0.5028,0,0.7992,0.177t0.375,0.5674l-0.4551,0.0562q-0.0421,-0.2022,-0.2261,-0.3104t-0.493,-0.1081q-0.3427,0,-0.5056,0.1039t-0.1629,0.3146q0,0.1292,0.0674,0.2135t0.1994,0.1433t0.5562,0.1629q0.4017,0.1011,0.5787,0.1868t0.2795,0.1896t0.1587,0.2402t0.0562,0.3104zM1.7163,12.6264h-0.573l-0.6573,-0.7584v-0.0562h0.2921l0.6517,0.4747h0.0056l0.6152,-0.4747h0.2949v0.0562z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"š\"\r\n  },\r\n  'XŪ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM2.8511,11.6039h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ū\"\r\n  },\r\n  'Xū': {\r\n    getPath: () => `M0.882,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM2.3596,12.5281h-1.5421v-0.3567h1.5421v0.3567z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ū\"\r\n  },\r\n  'XŰ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM1.25,11.7022v-0.0562l0.5534,-0.6376h0.5815v0.0815l-0.8708,0.6124h-0.264zM2.2247,11.7022v-0.0562l0.5534,-0.6376h0.5815v0.0815l-0.8708,0.6124h-0.264z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ű\"\r\n  },\r\n  'Xű': {\r\n    getPath: () => `M0.882,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM0.7949,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264zM1.7697,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ű\"\r\n  },\r\n  'XŲ': {\r\n    getPath: () => `M2.0534,16.0562q-0.486,0,-0.8483,-0.177t-0.5618,-0.514t-0.1994,-0.8034v-2.5197h0.5365v2.4747q0,0.5421,0.2753,0.823t0.7949,0.2809q0.5337,0,0.8301,-0.2907t0.2963,-0.8497v-2.4382h0.5337v2.4691q0,0.4803,-0.2037,0.8287t-0.5758,0.5323t-0.8778,0.184zM2.736,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Ų\"\r\n  },\r\n  'Xų': {\r\n    getPath: () => `M0.882,12.9607v1.927q0,0.3006,0.059,0.4663t0.1882,0.2388t0.3792,0.073q0.3652,0,0.5758,-0.25t0.2107,-0.6938v-1.7612h0.5056v2.3904q0,0.5309,0.0169,0.6489h-0.4775q-0.0028,-0.014,-0.0056,-0.0758t-0.007,-0.1419t-0.0098,-0.302h-0.0084q-0.1742,0.3146,-0.4031,0.4452t-0.5688,0.1306q-0.5,0,-0.7317,-0.2486t-0.2317,-0.8216v-2.0253h0.5084zM2.8904,17.1236q-0.177,0.0758,-0.3904,0.0758q-0.2949,0,-0.4438,-0.1433t-0.1489,-0.382q0,-0.1966,0.1222,-0.382t0.3132,-0.2921h0.3736q-0.0702,0.0393,-0.1433,0.1025t-0.1334,0.1461t-0.0983,0.1812t-0.0379,0.2079q0,0.118,0.0688,0.1854t0.1952,0.0674q0.1517,0,0.323,-0.0674v0.3006z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ų\"\r\n  },\r\n  // Kerning inherited from 'Y'\r\n  'XŸ': {\r\n    getPath: () => `M2.1826,14.3596v1.6404h-0.5337v-1.6404l-1.5225,-2.3174h0.5899l1.2051,1.8848l1.1994,-1.8848h0.5899zM2.2444,11.7022v-0.5169h0.4579v0.5169h-0.4579zM1.1376,11.7022v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Ÿ\",\r\n    kerningRules: {\r\n      \"a\": getGridUnitKerningRule(152),\r\n      \"A\": getGridUnitKerningRule(152),\r\n      \"e\": getGridUnitKerningRule(188),\r\n      \"i\": getGridUnitKerningRule(76),\r\n      \"o\": getGridUnitKerningRule(188),\r\n      \"p\": getGridUnitKerningRule(152),\r\n      \"q\": getGridUnitKerningRule(188),\r\n      \"u\": getGridUnitKerningRule(113),\r\n      \"v\": getGridUnitKerningRule(113)\r\n    }\r\n  },\r\n  'XŹ': {\r\n    getPath: () => `M3.3343,16h-3.1517v-0.4017l2.4101,-3.118h-2.2051v-0.4382h2.8146v0.3904l-2.4101,3.1292h2.5421v0.4382zM1.3708,11.7022v-0.0562l0.6096,-0.6348h0.5815v0.0815l-0.8708,0.6096h-0.3202z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"Ź\"\r\n  },\r\n  'Xź': {\r\n    getPath: () => `M0.2331,16v-0.3848l1.6994,-2.264h-1.6039v-0.3904h2.2022v0.3848l-1.7022,2.264h1.7612v0.3904h-2.3567zM1.0702,12.6264v-0.0562l0.6096,-0.8062h0.5815v0.0815l-0.927,0.7809h-0.264z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ź\"\r\n  },\r\n  'XŻ': {\r\n    getPath: () => `M3.3343,16h-3.1517v-0.4017l2.4101,-3.118h-2.2051v-0.4382h2.8146v0.3904l-2.4101,3.1292h2.5421v0.4382zM1.5056,11.4916v-0.4831h0.5056v0.4831h-0.5056z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"Ż\"\r\n  },\r\n  'Xż': {\r\n    getPath: () => `M0.2331,16v-0.3848l1.6994,-2.264h-1.6039v-0.3904h2.2022v0.3848l-1.7022,2.264h1.7612v0.3904h-2.3567zM1.1489,12.3146v-0.4831h0.5056v0.4831h-0.5056z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ż\"\r\n  },\r\n  'XŽ': {\r\n    getPath: () => `M3.3343,16h-3.1517v-0.4017l2.4101,-3.118h-2.2051v-0.4382h2.8146v0.3904l-2.4101,3.1292h2.5421v0.4382zM2.1067,11.7022h-0.573l-0.6573,-0.6713v-0.059h0.2921l0.6517,0.3904h0.0056l0.6152,-0.3904h0.2949v0.059z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"Ž\"\r\n  },\r\n  'Xž': {\r\n    getPath: () => `M0.2331,16v-0.3848l1.6994,-2.264h-1.6039v-0.3904h2.2022v0.3848l-1.7022,2.264h1.7612v0.3904h-2.3567zM1.6685,12.6264h-0.573l-0.6573,-0.7584v-0.0562h0.2921l0.6517,0.4747h0.0056l0.6152,-0.4747h0.2949v0.0562z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"ž\"\r\n  },\r\n  'Xа': {\r\n    getPath: () => `M1.1629,16.0562q-0.4579,0,-0.6882,-0.2416t-0.2303,-0.6629q0,-0.4719,0.3104,-0.7247t1.0014,-0.2697l0.6826,-0.0112v-0.1657q0,-0.3708,-0.1573,-0.5309t-0.4944,-0.1601q-0.3399,0,-0.4944,0.1152t-0.1854,0.368l-0.5281,-0.0478q0.1292,-0.8202,1.2191,-0.8202q0.573,0,0.8624,0.2626t0.2893,0.7598v1.309q0,0.2247,0.059,0.3385t0.2247,0.1138q0.073,0,0.1657,-0.0197v0.3146q-0.191,0.0449,-0.3904,0.0449q-0.2809,0,-0.4087,-0.1475t-0.1447,-0.4621h-0.0169q-0.1938,0.3483,-0.4508,0.493t-0.625,0.1447zM1.2781,15.677q0.2781,0,0.4944,-0.1264t0.3413,-0.3469t0.125,-0.4537v-0.25l-0.5534,0.0112q-0.3567,0.0056,-0.5407,0.073t-0.2823,0.2079t-0.0983,0.368q0,0.2472,0.1334,0.382t0.3806,0.1348z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"а\"\r\n  },\r\n  'Xб': {\r\n    getPath: () => `M2.5225,14.5899q0,-0.5674,-0.1854,-0.8357t-0.6039,-0.2683q-0.4466,0,-0.6559,0.2725t-0.2093,0.8315q0,0.5449,0.1952,0.8188t0.6138,0.2739q0.4522,0,0.6489,-0.2626t0.1966,-0.8301zM1.8399,13.1152q0.6236,0,0.9185,0.3666t0.2949,1.1025q0,0.7444,-0.3511,1.1081t-1.0197,0.3638q-0.691,0,-1.0183,-0.4522t-0.3272,-1.3904q0,-0.4775,0.0646,-0.8385t0.2022,-0.6222t0.3553,-0.4354t0.5478,-0.2809t1.4031,-0.2556v0.4522q-1.177,0.1517,-1.5239,0.2893t-0.4874,0.4382t-0.1517,0.8989q0.1208,-0.3511,0.4045,-0.5478t0.6882,-0.1966z`,\r\n    get width() { return getGridUnitWidth(1173); },\r\n    height: 16,\r\n    char: \"б\"\r\n  },\r\n  'Xв': {\r\n    getPath: () => `M1.5843,12.9607q0.5618,0,0.8427,0.1966t0.2809,0.5646q0,0.2612,-0.1601,0.4354t-0.4663,0.2331v0.0197q0.3624,0.0478,0.5435,0.2303t0.1812,0.4831q0,0.4129,-0.3076,0.6447t-0.8497,0.2317h-1.25v-3.0393h1.1854zM0.9045,15.6264h0.6629q0.3876,0,0.5449,-0.1194t0.1573,-0.3806q0,-0.2837,-0.1671,-0.4003t-0.5688,-0.1166h-0.6292v1.0169zM0.9045,13.3455v0.8989h0.6067q0.3596,0,0.5126,-0.1011t0.1531,-0.3539q0,-0.2303,-0.1433,-0.3371t-0.4831,-0.1067h-0.6461z`,\r\n    get width() { return getGridUnitWidth(1088); },\r\n    height: 16,\r\n    char: \"в\"\r\n  },\r\n  'Xг': {\r\n    getPath: () => `M1.9298,12.9607v0.368h-1.0253v2.6713h-0.5056v-3.0393h1.5309z`,\r\n    get width() { return getGridUnitWidth(747); },\r\n    height: 16,\r\n    char: \"г\"\r\n  },\r\n  'Xд': {\r\n    getPath: () => `M2.3427,13.3287h-0.8596q-0.1039,0.764,-0.2303,1.3301t-0.3062,0.9733h1.3961v-2.3034zM3.2584,17.1461h-0.4579v-1.1461h-2.2865v1.1461h-0.4579v-1.514h0.3343q0.2107,-0.3511,0.3652,-0.9972t0.2837,-1.6742h1.809v2.6713h0.4101v1.514z`,\r\n    get width() { return getGridUnitWidth(1195); },\r\n    height: 16,\r\n    char: \"д\"\r\n  },\r\n  'Xе': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"е\"\r\n  },\r\n  'Xё': {\r\n    getPath: () => `M0.7753,14.5871q0,0.5225,0.2163,0.8062t0.632,0.2837q0.3287,0,0.5267,-0.132t0.2683,-0.3343l0.4438,0.1264q-0.2725,0.7191,-1.2388,0.7191q-0.6742,0,-1.0267,-0.4017t-0.3525,-1.1938q0,-0.7528,0.3525,-1.1545t1.007,-0.4017q1.3399,0,1.3399,1.6152v0.0674h-2.1685zM2.4213,14.1994q-0.0421,-0.4803,-0.2444,-0.7008t-0.5815,-0.2205q-0.368,0,-0.5829,0.2458t-0.2317,0.6756h1.6404zM1.9298,12.5758v-0.5169h0.4579v0.5169h-0.4579zM0.823,12.5758v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"ё\"\r\n  },\r\n  'Xж': {\r\n    getPath: () => `M1.6713,14.6601q-0.073,0,-0.1643,-0.0169t-0.1447,-0.0393l-0.7809,1.3961h-0.5618l0.9916,-1.6629q-0.0983,-0.0815,-0.3596,-0.4635l-0.6067,-0.9129h0.5281l0.4157,0.6713q0.1854,0.2978,0.2865,0.4284t0.184,0.1812t0.2121,0.0506v-1.3315h0.5056v1.3315q0.0843,0,0.1517,-0.0225t0.1404,-0.0941t0.1657,-0.2008t0.6404,-1.014h0.5281l-0.6067,0.9129q-0.2612,0.382,-0.3596,0.4635l0.9916,1.6629h-0.5618l-0.7809,-1.3961q-0.0534,0.0225,-0.1447,0.0393t-0.1643,0.0169v1.3399h-0.5056v-1.3399z`,\r\n    get width() { return getGridUnitWidth(1370); },\r\n    height: 16,\r\n    char: \"ж\"\r\n  },\r\n  'Xз': {\r\n    getPath: () => `M1.2865,16.0562q-0.4691,0,-0.7458,-0.1756t-0.4031,-0.5379l0.4466,-0.1236q0.1489,0.4607,0.7135,0.4607q0.2697,0,0.4284,-0.132t0.1587,-0.3876q0,-0.5618,-0.9298,-0.5618v-0.3848q0.4522,0,0.6657,-0.118t0.2135,-0.3652q0,-0.2079,-0.139,-0.3287t-0.4003,-0.1208q-0.25,0,-0.4087,0.1039t-0.1924,0.3006l-0.4551,-0.0562q0.1292,-0.7247,1.059,-0.7247q0.4719,0,0.7612,0.2233t0.2893,0.5772q0,0.2837,-0.2037,0.4747t-0.493,0.2163v0.0056q0.3399,0.0365,0.5548,0.2374t0.2149,0.507q0,0.427,-0.302,0.6685t-0.8329,0.2416z`,\r\n    get width() { return getGridUnitWidth(939); },\r\n    height: 16,\r\n    char: \"з\"\r\n  },\r\n  'Xи': {\r\n    getPath: () => `M0.8876,12.9607v1.6629l-0.0281,0.7781l1.4017,-2.441h0.5534v3.0393h-0.4831v-1.8539q0,-0.1011,0.0098,-0.3062t0.0183,-0.2921l-1.4213,2.4522h-0.5393v-3.0393h0.4888z`,\r\n    get width() { return getGridUnitWidth(1144); },\r\n    height: 16,\r\n    char: \"и\"\r\n  },\r\n  'Xй': {\r\n    getPath: () => `M0.8876,12.9607v1.6629l-0.0281,0.7781l1.4017,-2.441h0.5534v3.0393h-0.4831v-1.8539q0,-0.1011,0.0098,-0.3062t0.0183,-0.2921l-1.4213,2.4522h-0.5393v-3.0393h0.4888zM1.6124,12.6292q-1,0,-1.0309,-0.8989h0.4607q0.0337,0.559,0.5702,0.559t0.5702,-0.559h0.4607q-0.0309,0.8989,-1.0309,0.8989z`,\r\n    get width() { return getGridUnitWidth(1144); },\r\n    height: 16,\r\n    char: \"й\"\r\n  },\r\n  'Xк': {\r\n    getPath: () => `M0.3876,12.9607h0.5056v1.3315q0.0843,0,0.1517,-0.0225t0.1404,-0.0941t0.1657,-0.2008t0.6404,-1.014h0.5281l-0.6067,0.9129q-0.2612,0.382,-0.3596,0.4635l0.9916,1.6629h-0.5618l-0.7809,-1.3961q-0.0534,0.0225,-0.1447,0.0393t-0.1643,0.0169v1.3399h-0.5056v-3.0393z`,\r\n    get width() { return getGridUnitWidth(896); },\r\n    height: 16,\r\n    char: \"к\"\r\n  },\r\n  'Xл': {\r\n    getPath: () => `M2.4494,16v-2.6713h-1.0534q-0.1657,1.2247,-0.2556,1.6531t-0.1938,0.6475t-0.257,0.323t-0.3947,0.1039q-0.1404,0,-0.264,-0.0365v-0.3624q0.0702,0.0253,0.191,0.0253q0.1545,0,0.2486,-0.1545t0.1713,-0.5337t0.1756,-1.1208l0.1236,-0.9129h2.0169v3.0393h-0.5084z`,\r\n    get width() { return getGridUnitWidth(1195); },\r\n    height: 16,\r\n    char: \"л\"\r\n  },\r\n  'Xм': {\r\n    getPath: () => `M2.2107,16h-0.4298l-0.9101,-2.6713q0.0169,0.4382,0.0169,0.6376v2.0337h-0.4888v-3.0393h0.7865l0.618,1.8567q0.1461,0.4017,0.191,0.8034q0.0618,-0.4522,0.191,-0.8034l0.618,-1.8567h0.7556v3.0393h-0.486v-2.0337l0.0084,-0.3202l0.014,-0.323z`,\r\n    get width() { return getGridUnitWidth(1408); },\r\n    height: 16,\r\n    char: \"м\"\r\n  },\r\n  'Xн': {\r\n    getPath: () => `M0.9045,12.9607v1.2865h1.368v-1.2865h0.5056v3.0393h-0.5056v-1.3848h-1.368v1.3848h-0.5056v-3.0393h0.5056z`,\r\n    get width() { return getGridUnitWidth(1131); },\r\n    height: 16,\r\n    char: \"н\"\r\n  },\r\n  'Xо': {\r\n    getPath: () => `M2.9579,14.4775q0,0.7978,-0.3511,1.1882t-1.0197,0.3904q-0.6657,0,-1.0056,-0.4059t-0.3399,-1.1728q0,-1.573,1.3624,-1.573q0.6966,0,1.0253,0.3834t0.3287,1.1896zM2.427,14.4775q0,-0.6292,-0.1868,-0.9143t-0.6278,-0.2851q-0.4438,0,-0.6419,0.2907t-0.198,0.9087q0,0.6011,0.1952,0.9031t0.6138,0.302q0.4551,0,0.6503,-0.2921t0.1952,-0.9129z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"о\"\r\n  },\r\n  'Xп': {\r\n    getPath: () => `M2.7163,12.9607v3.0393h-0.5056v-2.6713h-1.3062v2.6713h-0.5056v-3.0393h2.3174z`,\r\n    get width() { return getGridUnitWidth(1109); },\r\n    height: 16,\r\n    char: \"п\"\r\n  },\r\n  'Xр': {\r\n    getPath: () => `M2.9579,14.4663q0,1.5899,-1.118,1.5899q-0.7022,0,-0.9438,-0.5281h-0.014q0.0112,0.0225,0.0112,0.4775v1.1882h-0.5056v-3.6124q0,-0.4691,-0.0169,-0.6208h0.4888q0.0028,0.0112,0.0084,0.0801t0.0126,0.2121t0.007,0.1966h0.0112q0.1348,-0.2809,0.3567,-0.4115t0.5843,-0.1306q0.5618,0,0.8399,0.3764t0.2781,1.1826zM2.427,14.4775q0,-0.6348,-0.1713,-0.9073t-0.5449,-0.2725q-0.3006,0,-0.4705,0.1264t-0.2584,0.3947t-0.0885,0.698q0,0.5983,0.191,0.882t0.6208,0.2837q0.3764,0,0.5492,-0.2767t0.1728,-0.9284z`,\r\n    get width() { return getGridUnitWidth(1139); },\r\n    height: 16,\r\n    char: \"р\"\r\n  },\r\n  'Xс': {\r\n    getPath: () => `M0.7725,14.4663q0,0.6067,0.191,0.8989t0.5758,0.2921q0.2697,0,0.4508,-0.1461t0.2233,-0.4494l0.5112,0.0337q-0.059,0.4382,-0.3736,0.6994t-0.7978,0.2612q-0.6376,0,-0.9733,-0.4031t-0.3357,-1.1756q0,-0.7669,0.3371,-1.1699t0.9663,-0.4031q0.4663,0,0.7739,0.2416t0.3862,0.6657l-0.5197,0.0393q-0.0393,-0.2528,-0.1994,-0.4017t-0.4551,-0.1489q-0.4017,0,-0.5815,0.2669t-0.1798,0.8989z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"с\"\r\n  },\r\n  'Xт': {\r\n    getPath: () => `M0.0983,12.9607h2.4382v0.368h-0.9663v2.6713h-0.5056v-2.6713h-0.9663v-0.368z`,\r\n    get width() { return getGridUnitWidth(938); },\r\n    height: 16,\r\n    char: \"т\"\r\n  },\r\n  'Xу': {\r\n    getPath: () => `M0.5365,17.1938q-0.2079,0,-0.3483,-0.0309v-0.3792q0.1067,0.0169,0.236,0.0169q0.4719,0,0.7472,-0.6938l0.0478,-0.1208l-1.2051,-3.0253h0.5393l0.6404,1.6798q0.014,0.0393,0.0337,0.0941t0.1264,0.3666t0.1152,0.3483l0.1966,-0.5534l0.6657,-1.9354h0.5337l-1.1685,3.0393q-0.1882,0.486,-0.3511,0.7233t-0.361,0.3539t-0.448,0.1166z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"у\"\r\n  },\r\n  'Xф': {\r\n    getPath: () => `M4.4888,14.4663q0,0.7978,-0.2598,1.1938t-0.7654,0.3961q-0.6348,0,-0.8567,-0.5281h-0.0169q0.014,0.2444,0.014,0.4775v1.1882h-0.4775v-1.1882q0,-0.3062,0.014,-0.4944h-0.014q-0.1292,0.2921,-0.3385,0.4185t-0.5211,0.1264q-0.5225,0,-0.7739,-0.3862t-0.2514,-1.1756q0,-1.5899,1.0253,-1.5899q0.3146,0,0.5239,0.1264t0.3357,0.4017h0.014l-0.014,-0.4242v-1.177h0.4775v1.1798l-0.0084,0.4382h0.014q0.1292,-0.2921,0.3315,-0.4171t0.5225,-0.125q0.514,0,0.7697,0.3834t0.2556,1.1756zM0.7725,14.4775q0,0.632,0.1531,0.9101t0.4846,0.2781q0.3652,0,0.5365,-0.2767t0.1798,-0.8778v-0.0674q0,-0.5927,-0.1671,-0.8792t-0.5435,-0.2865q-0.3399,0,-0.4916,0.2893t-0.1517,0.9101zM3.9579,14.4775q0,-0.6124,-0.1503,-0.8961t-0.4874,-0.2837q-0.264,0,-0.4129,0.1292t-0.2261,0.3947t-0.0772,0.6952v0.0646q0.0056,0.5646,0.177,0.8329t0.5337,0.2683q0.3343,0,0.4888,-0.2879t0.1545,-0.9171z`,\r\n    get width() { return getGridUnitWidth(1685); },\r\n    height: 16,\r\n    char: \"ф\"\r\n  },\r\n  'Xх': {\r\n    getPath: () => `M2.25,16l-0.8174,-1.2472l-0.823,1.2472h-0.5449l1.0815,-1.5618l-1.0309,-1.4775h0.559l0.7584,1.1826l0.7528,-1.1826h0.5646l-1.0309,1.4719l1.0955,1.5674h-0.5646z`,\r\n    get width() { return getGridUnitWidth(1024); },\r\n    height: 16,\r\n    char: \"х\"\r\n  },\r\n  'Xц': {\r\n    getPath: () => `M0.9045,12.9607v2.6713h1.3399v-2.6713h0.5056v2.6713h0.4129v1.514h-0.4579v-1.1461h-2.3062v-3.0393h0.5056z`,\r\n    get width() { return getGridUnitWidth(1173); },\r\n    height: 16,\r\n    char: \"ц\"\r\n  },\r\n  'Xч': {\r\n    getPath: () => `M0.8483,12.9607v1.1292q0,0.4551,0.4663,0.4551q0.309,0,0.7753,-0.132v-1.4522h0.5056v3.0393h-0.5056v-1.2949l-0.2191,0.0843q-0.4101,0.1573,-0.764,0.1573q-0.3624,0,-0.5632,-0.2177t-0.2008,-0.6138v-1.1545h0.5056z`,\r\n    get width() { return getGridUnitWidth(1067); },\r\n    height: 16,\r\n    char: \"ч\"\r\n  },\r\n  'Xш': {\r\n    getPath: () => `M0.3989,16v-3.0393h0.5056v2.6713h1.1517v-2.6713h0.5056v2.6713h1.1489v-2.6713h0.5056v3.0393h-3.8174z`,\r\n    get width() { return getGridUnitWidth(1643); },\r\n    height: 16,\r\n    char: \"ш\"\r\n  },\r\n  'Xщ': {\r\n    getPath: () => `M0.3989,16v-3.0393h0.5056v2.6713h1.1376v-2.6713h0.5056v2.6713h1.1348v-2.6713h0.5056v2.6713h0.4129v1.514h-0.4579v-1.1461h-3.7444z`,\r\n    get width() { return getGridUnitWidth(1685); },\r\n    height: 16,\r\n    char: \"щ\"\r\n  },\r\n  'Xъ': {\r\n    getPath: () => `M2.1938,14.2472q0.5758,0,0.8708,0.2065t0.2949,0.6531q0,0.4326,-0.3034,0.6629t-0.8596,0.2303h-1.1489v-2.6713h-0.9213v-0.368h1.427v1.2865h0.6404zM1.5534,15.6433h0.5674q0.3652,0,0.5337,-0.1292t0.1685,-0.4073q0,-0.264,-0.1629,-0.3862t-0.5365,-0.1222h-0.5702v1.0449z`,\r\n    get width() { return getGridUnitWidth(1280); },\r\n    height: 16,\r\n    char: \"ъ\"\r\n  },\r\n  'Xы': {\r\n    getPath: () => `M1.5449,14.2472q0.5758,0,0.8708,0.2065t0.2949,0.6531q0,0.4326,-0.3034,0.6629t-0.8596,0.2303h-1.1489v-3.0393h0.5056v1.2865h0.6404zM0.9045,15.6433h0.5674q0.3652,0,0.5337,-0.1292t0.1685,-0.4073q0,-0.264,-0.1629,-0.3862t-0.5365,-0.1222h-0.5702v1.0449zM3.2303,16v-3.0393h0.5056v3.0393h-0.5056z`,\r\n    get width() { return getGridUnitWidth(1472); },\r\n    height: 16,\r\n    char: \"ы\"\r\n  },\r\n  'Xь': {\r\n    getPath: () => `M1.5955,14.2472q0.5758,0,0.8708,0.2065t0.2949,0.6531q0,0.4326,-0.3034,0.6629t-0.8596,0.2303h-1.1994v-3.0393h0.5056v1.2865h0.691zM0.9045,15.6433h0.618q0.3652,0,0.5337,-0.1292t0.1685,-0.4073q0,-0.264,-0.1629,-0.3862t-0.5365,-0.1222h-0.6208v1.0449z`,\r\n    get width() { return getGridUnitWidth(1067); },\r\n    height: 16,\r\n    char: \"ь\"\r\n  },\r\n  'Xэ': {\r\n    getPath: () => `M0.1545,15.1152l0.5112,-0.0337q0.0449,0.3034,0.2317,0.4494t0.4677,0.1461q0.3624,0,0.5618,-0.2486t0.2331,-0.7823h-1.1601v-0.368h1.1601q-0.0225,-0.5309,-0.2121,-0.764t-0.5772,-0.2331q-0.5899,0,-0.6798,0.5506l-0.5197,-0.0393q0.0787,-0.4185,0.3919,-0.6531t0.7935,-0.2346q0.6461,0,0.9902,0.4045t0.3441,1.1685q0,0.7753,-0.3441,1.177t-0.9958,0.4017q-0.4972,0,-0.8174,-0.2528t-0.3792,-0.6882z`,\r\n    get width() { return getGridUnitWidth(1045); },\r\n    height: 16,\r\n    char: \"э\"\r\n  },\r\n  'Xю': {\r\n    getPath: () => `M4.073,14.4775q0,0.7978,-0.3301,1.1882t-0.9565,0.3904q-0.5955,0,-0.9143,-0.3694t-0.3441,-1.0716h-0.6236v1.3848h-0.5056v-3.0393h0.5056v1.2865h0.6264q0.0927,-1.3427,1.2725,-1.3427q0.6657,0,0.9677,0.3933t0.302,1.1798zM3.5421,14.4775q0,-0.6292,-0.1685,-0.9143t-0.5618,-0.2851q-0.3989,0,-0.5772,0.2907t-0.1784,0.9087q0,0.6124,0.177,0.9087t0.5506,0.2963q0.4101,0,0.5843,-0.2935t0.1742,-0.9115z`,\r\n    get width() { return getGridUnitWidth(1536); },\r\n    height: 16,\r\n    char: \"ю\"\r\n  },\r\n  'Xя': {\r\n    getPath: () => `M1.5028,14.7135l-0.8848,1.2865h-0.5702l0.9663,-1.323q-0.6994,-0.1433,-0.6994,-0.8764q0,-0.4185,0.3034,-0.6292t0.8848,-0.2107h1.2135v3.0393h-0.5056v-1.2865h-0.7079zM2.2107,13.3174h-0.6573q-0.3652,0,-0.5337,0.1292t-0.1685,0.3904q0,0.264,0.1503,0.3947t0.4986,0.1306h0.7107v-1.0449z`,\r\n    get width() { return getGridUnitWidth(1109); },\r\n    height: 16,\r\n    char: \"я\"\r\n  },\r\n  'XА': {\r\n    getPath: () => `M3.2781,16l-0.4522,-1.1573h-1.8034l-0.4551,1.1573h-0.5562l1.6152,-3.9579h0.6096l1.5899,3.9579h-0.5478zM1.9242,12.4466l-0.0253,0.0787q-0.0702,0.2331,-0.2079,0.5983l-0.5056,1.3006h1.4803l-0.5084,-1.3062q-0.0787,-0.1938,-0.1573,-0.4382z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"А\"\r\n  },\r\n  'XБ': {\r\n    getPath: () => `M3.4775,14.8399q0,0.5253,-0.3624,0.8427t-1,0.3174h-1.6433v-3.9579h2.6011v0.4382h-2.0646v1.236h1.073q0.6629,0,1.0295,0.2949t0.3666,0.8287zM2.9382,14.8455q0,-0.3399,-0.2303,-0.5211t-0.691,-0.1812h-1.0084v1.4326h1.0309q0.4607,0,0.6798,-0.191t0.2191,-0.5393z`,\r\n    get width() { return getGridUnitWidth(1344); },\r\n    height: 16,\r\n    char: \"Б\"\r\n  },\r\n  'XВ': {\r\n    getPath: () => `M3.5337,14.8848q0,0.5281,-0.3848,0.8216t-1.0702,0.2935h-1.6067v-3.9579h1.4382q1.3933,0,1.3933,0.9607q0,0.3511,-0.1966,0.5899t-0.5562,0.3202q0.4719,0.0562,0.7275,0.316t0.2556,0.6559zM2.764,13.0674q0,-0.3202,-0.2191,-0.4579t-0.6348,-0.1376h-0.9017v1.2528h0.9017q0.4298,0,0.6419,-0.1615t0.2121,-0.4958zM2.9916,14.8427q0,-0.6994,-0.9831,-0.6994h-1v1.427h1.0421q0.4916,0,0.7163,-0.1826t0.2247,-0.5449z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"В\"\r\n  },\r\n  'XГ': {\r\n    getPath: () => `M3.0084,12.0393v0.4382h-2v3.5197h-0.5365v-3.9579h2.5365z`,\r\n    get width() { return getGridUnitWidth(1109); },\r\n    height: 16,\r\n    char: \"Г\"\r\n  },\r\n  'XД': {\r\n    getPath: () => `M3.2978,15.5506h0.4916v1.5955h-0.5056v-1.1461h-2.736v1.1461h-0.5056v-1.5955h0.4045q0.2191,-0.2725,0.3722,-0.7654t0.257,-1.3104l0.1882,-1.4326h2.0337v3.5084zM2.7753,15.5506v-3.059h-1.0534l-0.1376,1.0337q-0.1039,0.7697,-0.2303,1.2556t-0.3034,0.7697h1.7247z`,\r\n    get width() { return getGridUnitWidth(1387); },\r\n    height: 16,\r\n    char: \"Д\"\r\n  },\r\n  'XЕ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Е\"\r\n  },\r\n  'XЁ': {\r\n    getPath: () => `M0.4719,16v-3.9579h3.0028v0.4382h-2.4663v1.2697h2.2978v0.4326h-2.2978v1.3792h2.5815v0.4382h-3.118zM2.2921,11.7022v-0.5169h0.4579v0.5169h-0.4579zM1.1854,11.7022v-0.5169h0.4635v0.5169h-0.4635z`,\r\n    get width() { return getGridUnitWidth(1367); },\r\n    height: 16,\r\n    char: \"Ё\"\r\n  },\r\n  'XЖ': {\r\n    getPath: () => `M2.3876,14.1882q-0.1039,0,-0.2598,-0.0365t-0.2261,-0.0702l-1.1994,1.9185h-0.6236l1.4298,-2.177q-0.1348,-0.0983,-0.5028,-0.6292l-0.7949,-1.1517h0.5618l0.5758,0.8567q0.3118,0.4691,0.4466,0.6194t0.2584,0.2065t0.3343,0.0562v-1.7388h0.5365v1.7388q0.2107,0,0.3371,-0.0576t0.264,-0.2135t0.4382,-0.611l0.5758,-0.8567h0.5618l-0.7949,1.1517q-0.368,0.5309,-0.5028,0.6292l1.4298,2.177h-0.6236l-1.1994,-1.9185q-0.0702,0.0337,-0.2233,0.0702t-0.2626,0.0365v1.8118h-0.5365v-1.8118z`,\r\n    get width() { return getGridUnitWidth(1891); },\r\n    height: 16,\r\n    char: \"Ж\"\r\n  },\r\n  'XЗ': {\r\n    getPath: () => `M1.7444,16.0562q-0.573,0,-0.9438,-0.2261t-0.6124,-0.7514l0.4635,-0.2163q0.3343,0.764,1.073,0.764q0.4298,0,0.677,-0.1994t0.2472,-0.559q0,-0.3736,-0.2697,-0.5393t-0.8371,-0.1657h-0.1994v-0.4157h0.1994q0.5084,0,0.7514,-0.1671t0.243,-0.5126q0,-0.3006,-0.2037,-0.4733t-0.5829,-0.1728q-0.3539,0,-0.5955,0.1643t-0.3848,0.5295l-0.5,-0.1713q0.1966,-0.486,0.5674,-0.7219t0.9326,-0.236q0.5955,0,0.9494,0.2795t0.3539,0.7542q0,0.3567,-0.2022,0.5899t-0.5843,0.323q0.427,0.0646,0.6657,0.3104t0.2388,0.6166q0,0.5478,-0.389,0.8722t-1.0576,0.3244z`,\r\n    get width() { return getGridUnitWidth(1237); },\r\n    height: 16,\r\n    char: \"З\"\r\n  },\r\n  'XИ': {\r\n    getPath: () => `M0.4719,16v-3.9579h0.4831v2.5955q0,0.3202,-0.0225,0.7697l2.1067,-3.3652h0.6236v3.9579h-0.4775v-2.6292q0,-0.3427,0.0169,-0.7135l-2.0843,3.3427h-0.6461z`,\r\n    get width() { return getGridUnitWidth(1472); },\r\n    height: 16,\r\n    char: \"И\"\r\n  },\r\n  'XЙ': {\r\n    getPath: () => `M0.4719,16v-3.9579h0.4831v2.5955q0,0.3202,-0.0225,0.7697l2.1067,-3.3652h0.6236v3.9579h-0.4775v-2.6292q0,-0.3427,0.0169,-0.7135l-2.0843,3.3427h-0.6461zM2.0843,11.7022q-1,0,-1.0309,-0.8989h0.4607q0.0337,0.559,0.5702,0.559t0.5702,-0.559h0.4607q-0.0309,0.8989,-1.0309,0.8989z`,\r\n    get width() { return getGridUnitWidth(1472); },\r\n    height: 16,\r\n    char: \"Й\"\r\n  },\r\n  'XК': {\r\n    getPath: () => `M0.4719,12.0421h0.5365v1.7388q0.2107,0,0.3371,-0.0576t0.264,-0.2135t0.4382,-0.611l0.5758,-0.8567h0.5618l-0.7949,1.1517q-0.368,0.5309,-0.5028,0.6292l1.4298,2.177h-0.6236l-1.1994,-1.9185q-0.0702,0.0337,-0.2233,0.0702t-0.2626,0.0365v1.8118h-0.5365v-3.9579z`,\r\n    get width() { return getGridUnitWidth(1193); },\r\n    height: 16,\r\n    char: \"К\"\r\n  },\r\n  'XЛ': {\r\n    getPath: () => `M2.7837,12.4916h-1.1742l-0.1376,1.0337q-0.1433,1.118,-0.2767,1.6096t-0.3357,0.7008t-0.5674,0.2093q-0.1629,0,-0.2416,-0.0281v-0.427q0.0534,0.0197,0.1573,0.0197q0.1489,0,0.243,-0.0913t0.1756,-0.3034t0.1629,-0.6292t0.1629,-1.0281t0.1994,-1.5154h2.1545v3.9579h-0.5225v-3.5084z`,\r\n    get width() { return getGridUnitWidth(1344); },\r\n    height: 16,\r\n    char: \"Л\"\r\n  },\r\n  'XМ': {\r\n    getPath: () => `M3.8371,16v-2.6404q0,-0.4382,0.0253,-0.8427q-0.1376,0.5028,-0.2472,0.7865l-1.0225,2.6966h-0.3764l-1.0365,-2.6966l-0.1573,-0.4775l-0.0927,-0.309l0.0084,0.3118l0.0112,0.5309v2.6404h-0.4775v-3.9579h0.7051l1.0534,2.7444q0.0562,0.1657,0.1081,0.3553t0.0688,0.2739q0.0225,-0.1124,0.0941,-0.3413t0.0969,-0.2879l1.0337,-2.7444h0.6882v3.9579h-0.4831z`,\r\n    get width() { return getGridUnitWidth(1706); },\r\n    height: 16,\r\n    char: \"М\"\r\n  },\r\n  'XН': {\r\n    getPath: () => `M3.1489,16v-1.8343h-2.1404v1.8343h-0.5365v-3.9579h0.5365v1.6742h2.1404v-1.6742h0.5365v3.9579h-0.5365z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Н\"\r\n  },\r\n  'XО': {\r\n    getPath: () => `M4.1994,14.0028q0,0.6208,-0.2374,1.0871t-0.6812,0.7163t-1.0478,0.25q-0.6096,0,-1.052,-0.2472t-0.6756,-0.7149t-0.2331,-1.0913q0,-0.9494,0.5197,-1.4846t1.4466,-0.5351q0.6039,0,1.0478,0.2402t0.6784,0.698t0.2346,1.0815zM3.6517,14.0028q0,-0.7388,-0.3694,-1.1601t-1.0435,-0.4213q-0.6798,0,-1.0506,0.4157t-0.3708,1.1657q0,0.7444,0.375,1.1812t1.0407,0.4368q0.6854,0,1.052,-0.4228t0.3666,-1.1952z`,\r\n    get width() { return getGridUnitWidth(1593); },\r\n    height: 16,\r\n    char: \"О\"\r\n  },\r\n  'XП': {\r\n    getPath: () => `M3.1433,16v-3.5056h-2.1404v3.5056h-0.5365v-3.9579h3.2135v3.9579h-0.5365z`,\r\n    get width() { return getGridUnitWidth(1472); },\r\n    height: 16,\r\n    char: \"П\"\r\n  },\r\n  'XР': {\r\n    getPath: () => `M3.5337,13.2331q0,0.5618,-0.3666,0.8933t-0.9958,0.3315h-1.1629v1.5421h-0.5365v-3.9579h1.6657q0.6657,0,1.0309,0.3118t0.3652,0.8792zM2.9944,13.2388q0,-0.7669,-0.9213,-0.7669h-1.0646v1.5618h1.0871q0.8989,0,0.8989,-0.7949z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Р\"\r\n  },\r\n  'XС': {\r\n    getPath: () => `M2.2247,12.4213q-0.6573,0,-1.0225,0.4228t-0.3652,1.1587q0,0.7275,0.3806,1.1699t1.0295,0.4424q0.8315,0,1.25,-0.823l0.4382,0.2191q-0.2444,0.5112,-0.6868,0.7781t-1.0267,0.2669q-0.5983,0,-1.0351,-0.2486t-0.6657,-0.7107t-0.2289,-1.0941q0,-0.9466,0.5112,-1.4831t1.4157,-0.5365q0.632,0,1.0562,0.2472t0.6236,0.7331l-0.5084,0.1685q-0.1376,-0.3455,-0.4424,-0.5281t-0.7233,-0.1826z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"С\"\r\n  },\r\n  'XТ': {\r\n    getPath: () => `M2.0225,12.4803v3.5197h-0.5337v-3.5197h-1.3596v-0.4382h3.2528v0.4382h-1.3596z`,\r\n    get width() { return getGridUnitWidth(1251); },\r\n    height: 16,\r\n    char: \"Т\"\r\n  },\r\n  'XУ': {\r\n    getPath: () => `M0.9326,16.0562q-0.1742,0,-0.3638,-0.0534t-0.3188,-0.1433l0.2275,-0.4045q0.264,0.1657,0.4663,0.1657q0.1433,0,0.2402,-0.0548t0.1952,-0.1882t0.3848,-0.6559l-1.6096,-2.6798h0.6124l1.2612,2.2022l1.0787,-2.2022h0.5758l-1.6208,3.0646q-0.2388,0.4494,-0.3876,0.6208t-0.3244,0.25t-0.4171,0.0787z`,\r\n    get width() { return getGridUnitWidth(1301); },\r\n    height: 16,\r\n    char: \"У\"\r\n  },\r\n  'XФ': {\r\n    getPath: () => `M4.0421,13.9326q0,0.4298,-0.1784,0.7626t-0.5126,0.5154t-0.7837,0.1826h-0.1124v0.6376h-0.5365v-0.6376h-0.1124q-0.4522,0,-0.7865,-0.184t-0.5112,-0.5169t-0.177,-0.7598q0,-0.6685,0.3919,-1.0379t1.1138,-0.3694h0.0815v-0.5112h0.5365v0.5112h0.0787q0.7247,0,1.1166,0.3708t0.3919,1.0365zM3.5028,13.9438q0,-1.0309,-1.0337,-1.0309h-0.014v2.0955h0.0365q0.4888,0,0.75,-0.2697t0.2612,-0.7949zM0.8708,13.9438q0,0.5253,0.2612,0.7949t0.75,0.2697h0.0365v-2.0955h-0.0253q-0.5112,0,-0.7669,0.2528t-0.2556,0.7781z`,\r\n    get width() { return getGridUnitWidth(1557); },\r\n    height: 16,\r\n    char: \"Ф\"\r\n  },\r\n  'XХ': {\r\n    getPath: () => `M3.1236,16l-1.1882,-1.7303l-1.2135,1.7303h-0.5927l1.5056,-2.0562l-1.3904,-1.9017h0.5927l1.1011,1.5534l1.0702,-1.5534h0.5927l-1.3539,1.882l1.4691,2.0758h-0.5927z`,\r\n    get width() { return getGridUnitWidth(1366); },\r\n    height: 16,\r\n    char: \"Х\"\r\n  },\r\n  'XЦ': {\r\n    getPath: () => `M4.1489,15.5506v1.5955h-0.5056v-1.1461h-3.1713v-3.9579h0.5365v3.5084h2.1264v-3.5084h0.5225v3.5084h0.4916z`,\r\n    get width() { return getGridUnitWidth(1515); },\r\n    height: 16,\r\n    char: \"Ц\"\r\n  },\r\n  'XЧ': {\r\n    getPath: () => `M2.8315,14.573q-0.4354,0.0955,-0.691,0.1292t-0.4551,0.0337q-0.6236,0,-0.9298,-0.2542t-0.3062,-0.7711v-1.6685h0.5337v1.6124q0,0.3455,0.1826,0.4972t0.559,0.1517q0.4185,0,1.1067,-0.1376v-2.1236h0.5337v3.9579h-0.5337v-1.427z`,\r\n    get width() { return getGridUnitWidth(1365); },\r\n    height: 16,\r\n    char: \"Ч\"\r\n  },\r\n  'XШ': {\r\n    getPath: () => `M0.4719,16v-3.9579h0.5365v3.5084h1.3736v-3.5084h0.5225v3.5084h1.3736v-3.5084h0.5225v3.9579h-4.3287z`,\r\n    get width() { return getGridUnitWidth(1877); },\r\n    height: 16,\r\n    char: \"Ш\"\r\n  },\r\n  'XЩ': {\r\n    getPath: () => `M5.1657,15.5506v1.5955h-0.5056v-1.1461h-4.1882v-3.9579h0.5365v3.5084h1.3118v-3.5084h0.5225v3.5084h1.309v-3.5084h0.5225v3.5084h0.4916z`,\r\n    get width() { return getGridUnitWidth(1920); },\r\n    height: 16,\r\n    char: \"Щ\"\r\n  },\r\n  'XЪ': {\r\n    getPath: () => `M1.9551,13.7163h0.9045q0.6629,0,1.0295,0.2949t0.3666,0.8287q0,0.5253,-0.3624,0.8427t-1,0.3174h-1.4747v-3.5197h-1.2893v-0.4382h1.8258v1.6742zM3.7163,14.8455q0,-0.3399,-0.2303,-0.5211t-0.691,-0.1812h-0.8399v1.4326h0.8624q0.4607,0,0.6798,-0.191t0.2191,-0.5393z`,\r\n    get width() { return getGridUnitWidth(1621); },\r\n    height: 16,\r\n    char: \"Ъ\"\r\n  },\r\n  'XЫ': {\r\n    getPath: () => `M3.4775,14.8399q0,0.5253,-0.3624,0.8427t-1,0.3174h-1.6433v-3.9579h0.5365v1.6742h1.073q0.6629,0,1.0295,0.2949t0.3666,0.8287zM2.9382,14.8455q0,-0.3399,-0.2303,-0.5211t-0.691,-0.1812h-1.0084v1.4326h1.0309q0.4607,0,0.6798,-0.191t0.2191,-0.5393zM4.0843,16v-3.9579h0.5365v3.9579h-0.5365z`,\r\n    get width() { return getGridUnitWidth(1813); },\r\n    height: 16,\r\n    char: \"Ы\"\r\n  },\r\n  'XЬ': {\r\n    getPath: () => `M3.4775,14.8399q0,0.5253,-0.3624,0.8427t-1,0.3174h-1.6433v-3.9579h0.5365v1.6742h1.073q0.6629,0,1.0295,0.2949t0.3666,0.8287zM2.9382,14.8567q0,-0.3399,-0.2303,-0.5239t-0.691,-0.184h-1.0084v1.427h1.0309q0.8989,0,0.8989,-0.7191z`,\r\n    get width() { return getGridUnitWidth(1344); },\r\n    height: 16,\r\n    char: \"Ь\"\r\n  },\r\n  'XЭ': {\r\n    getPath: () => `M2.0028,12.4213q-0.427,0,-0.7331,0.1896t-0.4326,0.5211l-0.5084,-0.1685q0.1994,-0.486,0.6236,-0.7331t1.0562,-0.2472q0.9045,0,1.4157,0.5365t0.5112,1.4831q0,0.6264,-0.2275,1.0899t-0.6615,0.7135t-1.0379,0.25q-1.1966,0,-1.7135,-1.0449l0.4382,-0.2191q0.1938,0.3933,0.5169,0.6081t0.7303,0.2149q0.5983,0,0.9733,-0.3806t0.4284,-1.0267h-1.8371v-0.4326h1.8371q-0.059,-0.6433,-0.4199,-0.9986t-0.9593,-0.3553z`,\r\n    get width() { return getGridUnitWidth(1472); },\r\n    height: 16,\r\n    char: \"Э\"\r\n  },\r\n  'XЮ': {\r\n    getPath: () => `M5.5365,14.0028q0,0.6208,-0.2247,1.0885t-0.6461,0.7163t-0.9831,0.2486q-0.8287,0,-1.316,-0.5028t-0.5295,-1.3876h-0.8287v1.8343h-0.5365v-3.9579h0.5365v1.6742h0.8371q0.0758,-0.8202,0.5576,-1.2767t1.2851,-0.4565q0.8708,0,1.3596,0.5379t0.4888,1.4817zM4.9888,14.0028q0,-0.7388,-0.3413,-1.1601t-0.9593,-0.4213q-0.6264,0,-0.9677,0.4157t-0.3413,1.1657q0,0.7444,0.3469,1.1812t0.9565,0.4368q0.6264,0,0.9663,-0.4199t0.3399,-1.198z`,\r\n    get width() { return getGridUnitWidth(2069); },\r\n    height: 16,\r\n    char: \"Ю\"\r\n  },\r\n  'XЯ': {\r\n    getPath: () => `M0.2697,16l1.1236,-1.7051q-0.4522,-0.0787,-0.7093,-0.3792t-0.257,-0.7416q0,-0.5337,0.3624,-0.8329t1.0337,-0.2992h1.8624v3.9579h-0.5365v-1.6433h-1.2331l-1.0281,1.6433h-0.618zM0.9663,13.1798q0,0.3567,0.2317,0.5548t0.6559,0.198h1.2949v-1.4607h-1.2725q-0.441,0,-0.6756,0.1812t-0.2346,0.5267z`,\r\n    get width() { return getGridUnitWidth(1479); },\r\n    height: 16,\r\n    char: \"Я\"\r\n  }\r\n};\r\n\r\nfor (const letter of Object.values(alphabetData)) {\r\n  letter.specialRule = \"external glyph\";\r\n  letter.leftSideBearing = parseFloat((defaultLeftSideBearing / fontUnitToGridUnitDivisor).toFixed(7));\r\n  letter.rightSideBearing = parseFloat((defaultRightSideBearing / fontUnitToGridUnitDivisor).toFixed(7));\r\n}\r\n\r\nexport { alphabetData };","/**\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\n// Replaced at build time by Vite's define (also available in Vitest and VitePress).\r\n// Falls back to empty string when imported outside Vite (e.g. bare Node).\r\nexport const LIB_VERSION = typeof __LIB_VERSION__ !== 'undefined' ? __LIB_VERSION__ : '';\r\n\r\n/**\r\n * Known option keys (kebab-case) that are explicitly processed in #processOptions().\r\n * Any option key NOT in this set will be passed through as-is (for unknown SVG attributes like stroke-dasharray).\r\n */\r\nexport const KNOWN_OPTION_KEYS = new Set([\r\n  'stroke-width', 'dot-extra-width', 'char-space', 'word-space', 'external-glyph-space',\r\n  'margin', 'margin-top', 'margin-bottom', 'margin-left', 'margin-right',\r\n  'min-width', 'center',\r\n  'crop', 'crop-top', 'crop-bottom', 'crop-left', 'crop-right',\r\n  'grid', 'grid-color', 'grid-major-color', 'grid-medium-color', 'grid-minor-color',\r\n  'grid-sky-color', 'grid-earth-color',\r\n  'grid-stroke-width', 'grid-major-stroke-width', 'grid-medium-stroke-width',\r\n  'grid-minor-stroke-width', 'grid-sky-stroke-width', 'grid-earth-stroke-width',\r\n  'color', 'background', 'background-top', 'background-mid', 'background-bottom',\r\n  'text', 'svg-desc', 'svg-title', 'svg-height', 'error-placeholder',\r\n  'key'\r\n]);\r\n\r\n/**\r\n * Returns false for event handler attribute names (on*) or names containing\r\n * characters outside the safe allowlist to prevent XSS.\r\n */\r\nexport const isSafeAttributeName = (name) =>\r\n  /^[a-zA-Z][a-zA-Z0-9-]*$/.test(name) && !/^on/i.test(name);\r\n\r\n/**\r\n * Escapes HTML special characters to prevent XSS in SVG output.\r\n */\r\nexport const escapeHtml = (str) => String(str)\r\n  .replace(/&/g, '&amp;')\r\n  .replace(/</g, '&lt;')\r\n  .replace(/>/g, '&gt;')\r\n  .replace(/\"/g, '&quot;')\r\n  .replace(/'/g, '&#39;');\r\n\r\n/**\r\n * Converts a camelCase string to kebab-case.\r\n * e.g., strokeWidth → stroke-width, gridSkyColor → grid-sky-color\r\n * Single-word keys (color, grid, margin) pass through unchanged.\r\n */\r\nexport const camelToKebab = (str) => str.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\r\n\r\n/**\r\n * Generates a random 8-character key for element identity.\r\n * ~2.8 trillion combinations — negligible collision probability.\r\n */\r\nexport function generateKey() {\r\n  const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\r\n  let key = '';\r\n  for (let i = 0; i < 8; i++) key += chars[Math.floor(Math.random() * 36)];\r\n  return key;\r\n}\r\n\r\n/**\r\n * Options that should NOT be rendered as SVG attributes.\r\n *\r\n * Builder-level options: handled by SVG construction logic (margins, grid, cropping, etc.)\r\n * Element-level positioning: handled by element positioning logic (x, y, kerning)\r\n * Internal calculation options: used for calculations but not rendered (dotExtraWidth)\r\n *\r\n * Note: strokeWidth is NOT here - it's a multi-level option like 'color'\r\n * that can appear at both global and element levels as SVG attributes.\r\n */\r\nexport const INTERNAL_OPTIONS = new Set([\r\n  // Grid options (builder-level only)\r\n  'grid',\r\n  'gridSkyColor',\r\n  'gridEarthColor',\r\n  'gridMajorColor',\r\n  'gridMediumColor',\r\n  'gridMinorColor',\r\n  'gridSkyStrokeWidth',\r\n  'gridEarthStrokeWidth',\r\n  'gridMajorStrokeWidth',\r\n  'gridMediumStrokeWidth',\r\n  'gridMinorStrokeWidth',\r\n\r\n  // Cropping and margins (builder-level only)\r\n  'cropTop',\r\n  'cropBottom',\r\n  'cropLeft',\r\n  'cropRight',\r\n  'marginTop',\r\n  'marginBottom',\r\n  'marginLeft',\r\n  'marginRight',\r\n\r\n  // Internal calculation options\r\n  'dotExtraWidth',\r\n\r\n  // Builder-level settings\r\n  'background',\r\n  'backgroundTop',\r\n  'backgroundMid',\r\n  'backgroundBottom',\r\n  'charSpace',\r\n  'wordSpace',\r\n\r\n  'externalGlyphSpace',\r\n  'minWidth',\r\n  'center',\r\n  'autoVertical',\r\n  'cropCompact',\r\n  'text',\r\n  'svgDesc',\r\n  'svgTitle',\r\n  'svgHeight',\r\n  'errorPlaceholder',\r\n\r\n  // Element identity (extracted to node.key before option processing)\r\n  'key',\r\n\r\n  // Element positioning (handled by positioning logic, not SVG attributes)\r\n  'x',\r\n  'y',\r\n  'relativeKerning',\r\n  'absoluteKerning'\r\n]);\r\n\r\n/**\r\n * Maps semantic indicator types to their root B-codes.\r\n * When overriding indicators, the semantic root is preserved by default\r\n * unless the new indicators include a semantic indicator or force-strip (!) is used.\r\n */\r\nexport const SEMANTIC_INDICATOR_ROOTS = {\r\n  thing: 'B97',\r\n  abstract: 'B6436'\r\n};\r\n\r\n/**\r\n * Maximum allowed depth for element nesting and parser recursion.\r\n * Prevents stack overflow on pathological or self-referential definitions.\r\n */\r\nexport const MAX_RECURSION_DEPTH = 50;\r\n\r\n/**\r\n * Approximate minimum y-coordinate for content bounds in external glyphs\r\n * and text fallbacks. Actual values vary per glyph; this is used for\r\n * effectiveBounds estimation only.\r\n */\r\nexport const APPROX_GLYPH_MIN_Y = 11;\r\n","/** \r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { alphabetData } from \"../external-font-data/liberation-sans-svg-path-data.js\";\r\nimport { escapeHtml, APPROX_GLYPH_MIN_Y } from \"./bliss-constants.js\";\r\n\r\n/**\r\n * Checks if a character has hardcoded path data available.\r\n *\r\n * @param {string} char - The character to check.\r\n * @return {boolean} True if path data exists, false if text fallback would be used.\r\n */\r\nexport function hasPathData(char) {\r\n  return !!alphabetData[`X${char}`];\r\n}\r\n\r\n/**\r\n * Creates a text fallback glyph for characters without hardcoded path data.\r\n * Uses SVG <text> element which relies on system fonts.\r\n *\r\n * @param {string} str - The character or string to render.\r\n * @return {object} A glyph object compatible with createExternalGlyph.\r\n */\r\nexport function createTextFallbackGlyph(str) {\r\n  // Use known character widths where available, generous fallback for unknown.\r\n  // Users may need manual kerning/cropping for precise layouts with unknown chars.\r\n  const unknownCharWidth = 2.5;\r\n  const defaultCharSpace = 272 / 356; // ~0.764\r\n  const charWidths = [...str].reduce((sum, char) => {\r\n    const glyphData = alphabetData[`X${char}`];\r\n    return sum + (glyphData ? glyphData.width : unknownCharWidth);\r\n  }, 0);\r\n  const charSpacing = (str.length - 1) * defaultCharSpace;\r\n  const width = charWidths + charSpacing;\r\n  const approxMinY = APPROX_GLYPH_MIN_Y;\r\n  const maxY = 16;\r\n\r\n  return {\r\n    getPath: (x, y, options = {}) => {\r\n      const fill = escapeHtml(options.color || '#000000');\r\n      const safeStr = escapeHtml(str);\r\n      const closePath = `\"/>`;\r\n      const openPath = `<path d=\"`;\r\n      const baseline = 16;\r\n      const textX = x - 0.3;\r\n      const textY = y + baseline;\r\n      return `${closePath}<text x=\"${textX}\" y=\"${textY}\" font-family=\"Liberation Sans, sans-serif\" font-size=\"5.7\" stroke-width=\"0\" fill=\"${fill}\">${safeStr}</text>${openPath}`;\r\n    },\r\n    width,\r\n    y: approxMinY,\r\n    height: maxY - approxMinY,\r\n    isExternalGlyph: true,\r\n    // Single-char fallback IS a single glyph: `char` + `glyphCode`,\r\n    // parallel to single X-codes.\r\n    // Multi-char fallback is a composite carrying multiple chars: no\r\n    // `char`, no `glyphCode`, but a `codeName` (alias-style identifier).\r\n    ...(str.length === 1\r\n      ? { char: str, glyphCode: `XTXT_${str}` }\r\n      : { codeName: `XTXT_${str}` }),\r\n  };\r\n}\r\n\r\n/**\r\n * Create an invisible zero-sized anchor element with zero width and height.\r\n * Used to prevent normalization when explicit positioning is needed.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createZeroSizedAnchor() {\r\n  return {\r\n    getPath: () => '',\r\n    width: 0,\r\n    height: 0,\r\n  };\r\n}\r\n\r\n/**\r\n * Create an invisible space glyph.\r\n * Width is 0 (invisible). advanceWidth controls cursor movement.\r\n * @param {number} advanceWidth - Default advance width (may be overridden by BlissSVGBuilder based on options)\r\n * @returns {Object} - An object with getPath, width, height, and advanceWidth.\r\n */\r\nexport function createSpace(advanceWidth) {\r\n  return {\r\n    getPath: () => '',\r\n    width: 0,\r\n    height: 0,\r\n    advanceWidth,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a circle object with a specified radius.\r\n * @param {number} radius - The radius of the circle.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createCircle(radius) {\r\n  const initialX = 0;\r\n  const initialY = radius;\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 1,1 ${radius * 2},0a${radius},${radius} 0 1,1 ${-radius * 2},0`;\r\n    },\r\n    width: radius * 2,\r\n    height: radius * 2,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a half circle object with a specified radius and radial direction.\r\n * @param {number} radius - The radius of the half circle.\r\n * @param {'N'|'S'|'W'|'E'} radialDirection - The direction of the half circle's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createHalfCircle(radius, radialDirection) {\r\n  const directionMapping = {\r\n    'N': { initialX: 0, initialY: radius, endX: radius * 2, endY: 0, sweepFlag: 1, width: radius * 2, height: radius },\r\n    'S': { initialX: 0, initialY: 0, endX: radius * 2, endY: 0, sweepFlag: 0, width: radius * 2, height: radius },\r\n    'W': { initialX: radius, initialY: 0, endX: 0, endY: radius * 2, sweepFlag: 0, width: radius, height: radius * 2 },\r\n    'E': { initialX: 0, initialY: 0, endX: 0, endY: radius * 2, sweepFlag: 1, width: radius, height: radius * 2 },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag, width, height } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 1,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width,\r\n    height,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a quarter circle object with a specified radius and radial direction.\r\n * @param {number} radius - The radius of the quarter circle.\r\n * @param {'NW'|'NE'|'SW'|'SE'} radialDirection - The direction of the quarter circle's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createQuarterCircle(radius, radialDirection) {\r\n  const directionMapping = {\r\n    'NW': { initialX: 0, initialY: radius, endX: radius, endY: -radius, sweepFlag: 1 },\r\n    'NE': { initialX: 0, initialY: 0, endX: radius, endY: radius, sweepFlag: 1 },\r\n    'SW': { initialX: 0, initialY: 0, endX: radius, endY: radius, sweepFlag: 0 },\r\n    'SE': { initialX: 0, initialY: radius, endX: radius, endY: -radius, sweepFlag: 0 },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width: radius,\r\n    height: radius,\r\n  };\r\n}\r\n\r\n/**\r\n * Create an open circle object with a specified radius and opening direction.\r\n * @param {number} radius - The radius of the open circle.\r\n * @param {'NW'|'NE'|'SW'|'SE'} openingDirection - The direction of the open circle's opening.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createOpenCircle(radius, openingDirection) {\r\n  const directionMapping = {\r\n    'NW': { initialX: radius, initialY: 0, endX: -radius, endY: radius, sweepFlag: 1 },\r\n    'NE': { initialX: radius * 2, initialY: radius, endX: -radius, endY: -radius, sweepFlag: 1 },\r\n    'SW': { initialX: 0, initialY: radius, endX: radius, endY: radius, sweepFlag: 1 },\r\n    'SE': { initialX: radius, initialY: radius * 2, endX: radius, endY: -radius, sweepFlag: 1 },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag } = directionMapping[openingDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 1,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width: radius * 2,\r\n    height: radius * 2,\r\n  };\r\n}\r\n\r\n/**\r\n * Create an wave object with a specified length and radial direction.\r\n * @param {number} length - The width (N/S) or height (W/E) of the wave.\r\n * @param {'N'|'S'|'W'|'E'} radialDirection - The direction of the leftmost (W/E) or uppermost (N/S) half-wave's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createWave(length, radialDirection) {\r\n  const radius = length * 5 / 8 / 2;\r\n\r\n  const directionMapping = {\r\n    'N': { initialX: 0, initialY: length / 8, endX: length / 2, endY: 0, firstSweepFlag: 1, secondSweepFlag: 0, width: length, height: length / 4 },\r\n    'S': { initialX: 0, initialY: length / 8, endX: length / 2, endY: 0, firstSweepFlag: 0, secondSweepFlag: 1, width: length, height: length / 4 },\r\n    'W': { initialX: length / 8, initialY: 0, endX: 0, endY: length / 2, firstSweepFlag: 0, secondSweepFlag: 1, width: length / 4, height: length },\r\n    'E': { initialX: length / 8, initialY: 0, endX: 0, endY: length / 2, firstSweepFlag: 1, secondSweepFlag: 0, width: length / 4, height: length },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, firstSweepFlag, secondSweepFlag, width, height } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,${firstSweepFlag} ${endX},${endY}a${radius},${radius} 0 0,${secondSweepFlag} ${endX},${endY}`;\r\n    },\r\n    width,\r\n    height,\r\n  }\r\n}\r\n\r\n/**\r\n * Create an half-wave arc object with a specified length and radial direction.\r\n * @param {number} length - The width (N/S) or height (W/E) of the half-wave arc.\r\n * @param {'N'|'S'|'W'|'E'} radialDirection - The direction of the half-wave's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createHalfWave(length, radialDirection) {\r\n  const radius = length * 5 / 8;\r\n\r\n  const directionMapping = {\r\n    'N': { initialX: 0, initialY: length / 4, endX: length, endY: 0, sweepFlag: 1, width: length, height: length / 4 },\r\n    'S': { initialX: 0, initialY: 0, endX: length, endY: 0, sweepFlag: 0, width: length, height: length / 4 },\r\n    'W': { initialX: length / 4, initialY: 0, endX: 0, endY: length, sweepFlag: 0, width: length / 4, height: length },\r\n    'E': { initialX: 0, initialY: 0, endX: 0, endY: length, sweepFlag: 1, width: length / 4, height: length },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag, width, height } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width,\r\n    height,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a horizontal quarter-wave arc object with a specified width and radial direction.\r\n * @param {number} width - The width of the quarter-wave arc.\r\n * @param {'NW'|'NE'|'SW'|'SE'} radialDirection - The direction of the quarter-wave's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createHorizontalQuarterWave(width, radialDirection) {\r\n  const radius = width * 5 / 4;\r\n\r\n  const directionMapping = {\r\n    'NW': { initialX: 0, initialY: width / 2, endX: width, endY: -width / 2, sweepFlag: 1 },\r\n    'NE': { initialX: 0, initialY: 0, endX: width, endY: width / 2, sweepFlag: 1 },\r\n    'SW': { initialX: 0, initialY: 0, endX: width, endY: width / 2, sweepFlag: 0 },\r\n    'SE': { initialX: 0, initialY: width / 2, endX: width, endY: -width / 2, sweepFlag: 0 },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width,\r\n    height: width / 2,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a vertical quarter-wave arc object with a specified height and radial direction.\r\n * @param {number} height - The height of the quarter-wave arc.\r\n * @param {'NW'|'NE'|'SW'|'SE'} radialDirection - The direction of the quarter-wave's arc.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createVerticalQuarterWave(height, radialDirection) {\r\n  const radius = height * 5 / 4;\r\n\r\n  const directionMapping = {\r\n    'NW': { initialX: height / 2, initialY: 0, endX: -height / 2, endY: height, sweepFlag: 0 },\r\n    'NE': { initialX: 0, initialY: 0, endX: height / 2, endY: height, sweepFlag: 1 },\r\n    'SW': { initialX: 0, initialY: 0, endX: height / 2, endY: height, sweepFlag: 0 },\r\n    'SE': { initialX: height / 2, initialY: 0, endX: -height / 2, endY: height, sweepFlag: 1 },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY, sweepFlag } = directionMapping[radialDirection];\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,${sweepFlag} ${endX},${endY}`;\r\n    },\r\n    width: height / 2,\r\n    height,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a vertical line object with a specified length.\r\n * @param {number} length - The length of the line.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createVerticalLine(length) {\r\n  return {\r\n    getPath: (x, y) => `M${x},${y}v${length}`,\r\n    width: 0,\r\n    height: length,\r\n  };\r\n}\r\n\r\n/**\r\n * Create a horizontal line object with a specified length.\r\n * @param {number} length - The length of the line.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createHorizontalLine(length) {\r\n  return {\r\n    getPath: (x, y) => `M${x},${y}h${length}`,\r\n    width: length,\r\n    height: 0,\r\n  };\r\n}\r\n\r\n/**\r\n * Create an ascending diagonal line object with a specified width and height.\r\n * @param {number} width - The horizontal length of the line.\r\n * @param {number} height - The vertical length of the line.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createAscendingDiagonalLine(width, height) {\r\n  return {\r\n    getPath: (x, y) => `M${x},${y + height}l${width},${-height}`,\r\n    width,\r\n    height,\r\n  };\r\n};\r\n\r\n/**\r\n * Create a descending diagonal line object with a specified width and height.\r\n * @param {number} width - The horizontal length of the line.\r\n * @param {number} height - The vertical length of the line.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createDescendingDiagonalLine(width, height) {\r\n  return {\r\n    getPath: (x, y) => `M${x},${y}l${width},${height}`,\r\n    width,\r\n    height,\r\n  };\r\n};\r\n\r\n/** \r\n * Create a diagonal line between a circle and a corner of a square in a specified direction, for a square/circle with a specified width/height/diameter.\r\n * @param {number} size - The width/height/diameter of the circle/square.\r\n * @param {'NW'|'NE'|'SW'|'SE'} direction - The direction of the diagonal line.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n*/\r\nexport function createDiagonalLineOutsideCircle(size, direction) {\r\n  const radius = size / 2;\r\n  const lineWidth = radius * (1 - Math.SQRT1_2);\r\n  const lineHeight = lineWidth;\r\n\r\n  const directionMapping = {\r\n    'NW': { initialX: 0, initialY: 0, endX: lineWidth, endY: lineHeight },\r\n    'NE': { initialX: size - lineWidth, initialY: lineHeight, endX: lineWidth, endY: -lineHeight },\r\n    'SW': { initialX: 0, initialY: size, endX: lineWidth, endY: -lineHeight },\r\n    'SE': { initialX: size - lineWidth, initialY: size - lineHeight, endX: lineWidth, endY: lineHeight },\r\n  };\r\n\r\n  const { initialX, initialY, endX, endY } = directionMapping[direction];\r\n\r\n  return {\r\n    //x and y are in this case the coordinates of the square that the diagonal lines are related to. Also width and height relates to the square.\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}l${endX},${endY}`;\r\n    },\r\n    width: size,\r\n    height: size,\r\n  };\r\n}\r\n\r\n/** \r\n * Create an ascending diagonal line inside a circle with a specified radius.\r\n * @param {number} radius - The radius of the circle.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n*/\r\nexport function createAscendingDiagonalLineInsideCircle(radius) {\r\n  const lineWidth = radius * 2 * Math.SQRT1_2;\r\n  const lineHeight = lineWidth;\r\n\r\n  return {\r\n    //x and y are in this case the coordinates of the bounding box of the circle that the diagonal lines are related to. Also width and height relates to the square.\r\n    getPath: (x, y) => {\r\n      const startX = radius - lineWidth / 2 + x;\r\n      const startY = radius + lineHeight / 2 + y;\r\n      const endX = lineWidth;\r\n      const endY = -lineHeight;\r\n      return `M${startX},${startY}l${endX},${endY}`;\r\n    },\r\n    width: radius * 2,\r\n    height: radius * 2,\r\n  };\r\n}\r\n\r\n/** \r\n * Create a descending diagonal line inside a circle with a specified radius.\r\n * @param {number} radius - The radius of the circle.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n*/\r\nexport function createDescendingDiagonalLineInsideCircle(radius) {\r\n  const lineWidth = radius * 2 * Math.SQRT1_2;\r\n  const lineHeight = lineWidth;\r\n\r\n  return {\r\n    //x and y are in this case the coordinates of the bounding box of the circle that the diagonal lines are related to. Also width and height relates to the square.\r\n    getPath: (x, y) => {\r\n      const startX = radius - lineWidth / 2 + x;\r\n      const startY = radius - lineHeight / 2 + y;\r\n      const endX = lineWidth;\r\n      const endY = lineHeight;\r\n      return `M${startX},${startY}l${endX},${endY}`;\r\n    },\r\n    width: radius * 2,\r\n    height: radius * 2,\r\n  };\r\n}\r\n\r\n/** \r\n * Create a heart with a specified size.\r\n * @param {number} size - The size of the heart.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n*/\r\nexport function createHeart(size) {\r\n  const radius = size / 4\r\n\r\n  return {\r\n    getPath: (x, y) => `M${x},${y + radius}a${radius},${radius} 0 1,1 ${radius * 2},0a${radius},${radius} 0 1,1 ${radius * 2},0q0,${size * 3 / 8} ${-(size / 2)},${size * 3 / 4}q${-(size / 2)},${-(size * 3 / 8)} ${-(size / 2)},${-(size * 3 / 4)}`,\r\n    width: size,\r\n    height: size,\r\n  };\r\n}\r\n\r\n/** \r\n * Create an ear with a specified height.\r\n * @param {number} height - The height of the ear.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n*/\r\nexport function createEar(height) {\r\n  const radius = height / 4\r\n  \r\n  return {\r\n    getPath: (x, y) => `M${x},${y + radius}a${radius},${radius} 0 1,1 ${radius * 2},0q0,${height * 3 / 8} ${-(height / 2)},${height * 3 / 4}`,\r\n    width: height / 2,\r\n    height,\r\n  };\r\n}\r\n\r\n/** \r\n * Create a dot.\r\n * @param {number} defaultBaseStrokeWidth - The default stroke width to use with returned functions. The stroke-width of a normal line in the SVG, used to derive other dimensions of the dot.\r\n * @param {number} defaultExtraDotWidth - The default extra dot width do use with returned functions. The outer diameter of the dot is the normal stroke-width + extra-dot-width.\r\n * @returns {Object} - An object with a getDotData method, getDotSVGString method, width, and height properties.\r\n*/\r\nexport function createDot(defaultBaseStrokeWidth = 0.5, defaultExtraDotWidth = 0.333) {\r\n  const dot = {\r\n    /**\r\n     * Create an object with SVG string parts closePath, openPath, dotPath and openPath\r\n     * so that joining these can be used along with other shapes' getPath functions,\r\n     * based on specified strokeWidth and extraDotWidth.\r\n     * @param {number} x - The x-coordinate of the dot's position.\r\n     * @param {number} y - The y-coordinate of the dot's position.\r\n     * @param {number} baseStrokeWidth - The stroke-width of a normal line in the SVG, used to derive other dimensions of the dot.\r\n     * @param {number} extraDotWidth - A dot's outer diameter is the normal line stroke-width + extraDotWidth.\r\n     * @returns {Object} - An object with closePath, openPath, dotPath and openPath properties.\r\n     */\r\n    getDotData: (x, y, settings = { baseStrokeWidth: defaultBaseStrokeWidth, extraDotWidth: defaultExtraDotWidth }) => {\r\n      const dotStrokeWidth = (settings.baseStrokeWidth + settings.extraDotWidth) / 2;\r\n      const dotStrokeRadius = dotStrokeWidth / 2;\r\n      return {\r\n        closePath: `\"/>`,\r\n        openWrapper: `<g stroke-width=\"${dotStrokeWidth}\">`,\r\n        openDotPath: `<path d=\"`,\r\n        dotPath: `M${x - dotStrokeRadius},${y}a${dotStrokeRadius},${dotStrokeRadius} 0 1,1 ${dotStrokeRadius * 2},0a${dotStrokeRadius},${dotStrokeRadius} 0 1,1 ${-dotStrokeRadius * 2},0`,\r\n        closeDotPath: `\"/>`,\r\n        closeWrapper: `</g>`,\r\n        openPath: `<path d=\"`\r\n      };\r\n    },\r\n    width: 0,\r\n    height: 0,\r\n  };\r\n\r\n  /**\r\n   * Create an SVG string with the components closePath, openDotPath, dotPath and openPath\r\n   * so that joining these can be used along with other shapes' getPath functions,\r\n   * based on specified baseStrokeWidth and extraDotWidth.\r\n   * @param {number} x - The x-coordinate of the dot's position.\r\n   * @param {number} y - The y-coordinate of the dot's position.\r\n   * @param {number} baseStrokeWidth - The stroke-width of a normal line in the SVG, used to derive other dimensions of the dot.\r\n   * @param {number} extraDotWidth - A dot's outer diameter is the normal line stroke-width + extraDotWidth.\r\n   * @returns {Object} - An object with closePath, openPath, dotPath and openPath properties.\r\n   */\r\n  dot.getPath = (x, y, settings = { baseStrokeWidth: defaultBaseStrokeWidth, extraDotWidth: defaultExtraDotWidth }) => {\r\n    const { closePath, openWrapper, openDotPath, dotPath, closeDotPath, closeWrapper, openPath } = dot.getDotData(x, y, settings);\r\n    return `${closePath}${openWrapper}${openDotPath}${dotPath}${closeDotPath}${closeWrapper}${openPath}`;\r\n  };\r\n\r\n  return dot;\r\n}\r\n\r\n/** \r\n * Create a comma.\r\n * @param {number} defaultBaseStrokeWidth - The default stroke width to use with returned functions. The stroke-width of a normal line in the SVG, used to derive other dimensions of the comma.\r\n * @param {number} defaultExtraDotWidth - The default extra dot width to use with returned functions. The outer diameter of the dot (which the comma is partly made of) is the normal stroke-width + the extra dot width.\r\n * @returns {Object} - An object with a getCommaData method, getCommaSVGString method, width, and height properties.\r\n*/\r\nexport function createComma(defaultBaseStrokeWidth = 0.5, defaultExtraDotWidth = 0.333) {\r\n  const comma = {\r\n    /**\r\n     * Create an object with SVG string parts closePath, openDotPath, dotPath, openCommaPath, commaPath and openPath so that joining these can be used along with other shapes' getPath functions, based on specified strokeWidth and extraDotWidth.\r\n     * @param {number} x - The x-coordinate of the dot's position.\r\n     * @param {number} y - The y-coordinate of the dot's position.\r\n     * @param {number} baseStrokeWidth - The stroke-width of a normal line in the SVG, used to derive other dimensions of the comma.\r\n     * @param {number} extraDotWidth - A dot's outer diameter is the normal line stroke-width + extraDotWidth.\r\n     * @returns {Object} - An object with closePath, openDotPath, dotPath, commaPath and openPath properties.\r\n     */\r\n    getCommaData: (x, y, settings = { baseStrokeWidth: defaultBaseStrokeWidth, extraDotWidth: defaultExtraDotWidth }) => {\r\n      const dotStrokeWidth = (settings.baseStrokeWidth + settings.extraDotWidth) / 2;\r\n      const dotStrokeRadius = dotStrokeWidth / 2;\r\n      const commaStrokeWidth = dotStrokeWidth * 2 / 3;\r\n      const commaStartX = commaStrokeWidth + x;\r\n      const commaStartY = y;\r\n      const commaEndX = commaStrokeWidth * -2;\r\n      const commaEndY = commaStrokeWidth * 4;\r\n      const commaQX = commaStrokeWidth / 4\r\n      const commaQY = commaStrokeWidth * 2.5;\r\n      return {\r\n        closePath: `\"/>`,\r\n        openDotWrapper: `<g stroke-width=\"${dotStrokeWidth}\">`,\r\n        openDotPath: `<path d=\"`,\r\n        dotPath: `M${x - dotStrokeRadius},${y}a${dotStrokeRadius},${dotStrokeRadius} 0 1,1 ${dotStrokeRadius * 2},0a${dotStrokeRadius},${dotStrokeRadius} 0 1,1 ${-dotStrokeRadius * 2},0`,\r\n        closeDotPath: `\"/>`,\r\n        closeDotWrapper: `</g>`,\r\n        openCommaWrapper: `<g stroke-width=\"${commaStrokeWidth}\">`,\r\n        openCommaPath: `<path d=\"`,\r\n        commaPath: `M${commaStartX},${commaStartY}q${commaQX},${commaQY} ${commaEndX},${commaEndY}`,\r\n        closeCommaPath: `\"/>`,\r\n        closeCommaWrapper: `</g>`,\r\n        openPath: `<path d=\"`\r\n      };\r\n    },\r\n    width: 0,\r\n    height: (defaultBaseStrokeWidth + defaultExtraDotWidth) * 4 / 3,\r\n  };\r\n\r\n  /**\r\n   * Create an SVG string with the components closePath, openDotPath, dotPath, openCommaPath, commaPath and openPath\r\n   * so that joining these can be used along with other elements' getPath functions,\r\n   * based on specified baseStrokeWidth and extraDotWidth.\r\n   * @param {number} x - The x-coordinate of the dot's position.\r\n   * @param {number} y - The y-coordinate of the dot's position.\r\n   * @param {number} baseStrokeWidth - The stroke-width of a normal line in the SVG, used to derive other dimensions of the comma.\r\n   * @param {number} extraDotWidth - A dot's outer diameter is the normal line stroke-width + extraDotWidth.\r\n   * @returns {Object} - An object with closePath, openDotPath, dotPath, openCommaPath, commaPath and openPath properties.\r\n   */\r\n  comma.getPath = (x, y, settings = { baseStrokeWidth: defaultBaseStrokeWidth, extraDotWidth: defaultExtraDotWidth }) => {\r\n    const { closePath, openDotWrapper, openDotPath, dotPath, closeDotPath, closeDotWrapper, openCommaWrapper, openCommaPath, commaPath, closeCommaPath, closeCommaWrapper, openPath } = comma.getCommaData(x, y, settings);\r\n    return `${closePath}${openDotWrapper}${openDotPath}${dotPath}${closeDotPath}${closeDotWrapper}${openCommaWrapper}${openCommaPath}${commaPath}${closeCommaPath}${closeCommaWrapper}${openPath}`;\r\n  };\r\n\r\n  return comma;\r\n}\r\n\r\n/**\r\n * Create a fiber with a specified height.\r\n * @param {number} height - The height of the fiber.\r\n * @returns {Object} - An object with a getPath method, width, and height properties.\r\n */\r\nexport function createFiber(height) {\r\n  const radius = height * 5 / 8;\r\n  const initialX = 0;\r\n  const initialY = height;\r\n  const midX = height / 4;\r\n  const midY = -height / 2;\r\n  const endX = height / 4;\r\n  const endY = -height / 2;\r\n\r\n  return {\r\n    getPath: (x, y) => {\r\n      const startX = initialX + x;\r\n      const startY = initialY + y;\r\n      return `M${startX},${startY}a${radius},${radius} 0 0,1 ${midX},${midY}a${radius},${radius} 0 0,0 ${endX},${endY}`;\r\n    },\r\n    width: height / 2,\r\n    height,\r\n  };\r\n}\r\n\r\n/**\r\n * Creates an external glyph object for the given rendered character.\r\n *\r\n * @param {string} char - The rendered character (e.g. \"a\" from input code \"Xa\").\r\n * @return {object} An object with getPath, width, kerningRules, char, glyphCode, isExternalGlyph properties.\r\n */\r\nexport function createExternalGlyph(char) {\r\n  const aObj = alphabetData[`X${char}`];\r\n  const adjustX = -aObj.leftSideBearing;\r\n  const adjustY = -0.015; //revisit this\r\n  const closePath = `\"/>`;\r\n  const glyphPath = aObj?.getPath() || \"\";\r\n  const openPath = `<path d=\"`;\r\n\r\n  const round = (num) => parseFloat(num.toFixed(4));\r\n\r\n  // aObj.height is actually maxY (where the bottom of the glyph path sits), not content height.\r\n  const approxMinY = APPROX_GLYPH_MIN_Y;\r\n  const maxY = aObj.height || 0;\r\n\r\n  return {\r\n    getPath: (x, y, options = {}) => {\r\n      // Transform all M coordinates directly (paths use relative commands after M)\r\n      const transformedPath = glyphPath.replace(\r\n        /M(-?\\d+\\.?\\d*),(-?\\d+\\.?\\d*)/g,\r\n        (_, mx, my) => `M${round(parseFloat(mx) + x + adjustX)},${round(parseFloat(my) + y + adjustY)}`\r\n      );\r\n      const fill = options.color || \"#000000\";\r\n      const openGlyphPath = `<path stroke=\"none\" fill=\"${fill}\" d=\"`;\r\n      return `${closePath}${openGlyphPath}${transformedPath}${closePath}${openPath}`;\r\n    },\r\n    width: aObj.width || 0,\r\n    y: approxMinY,\r\n    height: maxY - approxMinY,\r\n    // Indicates that this \"shape\" is an external, non-Bliss glyph.\r\n    isExternalGlyph: true,\r\n    // The rendered character.\r\n    char: aObj.char,\r\n    // Single external glyph identifier (parallel to B-codes' glyphCode).\r\n    glyphCode: `X${aObj.char}`,\r\n    // The kerning rules for the glyph\r\n    kerningRules: {...aObj.kerningRules}\r\n  }\r\n}\r\n","/*\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nconst digitKerning = {\r\n  B9: -1, B10: -1, B11: -1, B12: -1, B13: -1,\r\n  B14: -1, B15: -1, B16: -1, B17: -1, B18: -1\r\n};\r\n\r\nconst smallDigitKerning = {\r\n  B19: -1, B20: -1, B21: -1, B22: -1, B23: -1,\r\n  B24: -1, B25: -1, B26: -1, B27: -1, B28: -1\r\n};\r\n\r\nconst glyphData = {\r\n  B1: {\r\n    codeString: \"VL6:0,8;DOT:0,16\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B2: {\r\n    codeString: \"C2:0,8;DL4-8N:0,8;C2:2,14\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B3: {\r\n    codeString: \"OC4SW:0,8;VL2:2,12;DOT:2,16\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B4: {\r\n    codeString: \"DOT:0,16\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B5: {\r\n    codeString: \"COMMA:0,16\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B6: {\r\n    codeString: \"DOT:0,14;DOT:0,16\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B7: {\r\n    codeString: \"COMMA:0,8\",\r\n    shrinksPrecedingWordSpace: true\r\n  },\r\n  B8: {\r\n    codeString: \"C2:0,8\"\r\n  },\r\n  B9: {\r\n    codeString: \"HC2N:0,12;VL2:0,13;HC2S:0,15;VL2:2,13\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B10: {\r\n    codeString: \"DL1N:0,12;VL4:1,12;HL2:0,16\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B11: {\r\n    codeString: \"HC2N:0,12;DL2-3N:0,13;HL2:0,16\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B12: {\r\n    codeString: \"OC2SW:0,12;OC2NW:0,14\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B13: {\r\n    codeString: \"VL2:0,12;HL2:0,14;VL4:2,12\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B14: {\r\n    codeString: \"HL2:0,12;VL2:0,12;HL1:0,14;HL1:0,16;HC2E:1,14\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B15: {\r\n    codeString: \"HC2N:0,12;VL2:0,13;C2:0,14\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B16: {\r\n    codeString: \"HL2:0,12;DL1-4N:1,12\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B17: {\r\n    codeString: \"C2:0,12;C2:0,14\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B18: {\r\n    codeString: \"C2:0,12;HC2S:0,15;VL2:2,13\",\r\n    kerningRules: digitKerning\r\n  },\r\n  B19: {\r\n    codeString: \"HC1N:0,14;VL1:0,14.5;HC1S:0,15.5;VL1:1,14.5\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B20: {\r\n    codeString: \"DL.5N:0,14;VL2:0.5,14;HL1:0,16\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B21: {\r\n    codeString: \"HC1N:0,14;DL1-1.5N:0,14.5;HL1:0,16\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B22: {\r\n    codeString: \"OC1SW:0,14;OC1NW:0,15\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B23: {\r\n    codeString: \"VL1:0,14;HL1:0,15;VL2:1,14\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B24: {\r\n    codeString: \"HL1:0,14;VL1:0,14;HL.5:0,15;HL.5:0,16;HC1E:0.5,15\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B25: {\r\n    codeString: \"HC1N:0,14;VL1:0,14.5;C1:0,15\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B26: {\r\n    codeString: \"HL1:0,14;DL.5-2N:0.5,14\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B27: {\r\n    codeString: \"C1:0,14;C1:0,15\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B28: {\r\n    codeString: \"C1:0,14;HC1S:0,15.5;VL1:1,14.5\",\r\n    kerningRules: smallDigitKerning\r\n  },\r\n  B81: {\r\n    codeString: \"AA2N:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    name: \"INDICATOR ACTION\"\r\n  },\r\n  B82: {\r\n    codeString: \"AA2E:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    name: \"INDICATOR ACTIVE\"\r\n  },\r\n  B83: {\r\n    codeString: \"OC1SW:0,4;VL.25:0.5,5;DOT:0.5,6\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 1,\r\n    name: \"INDICATOR PRESENT CONDITIONAL\"\r\n  },\r\n  B84: {\r\n    codeString: \"B86;B270:3,-8\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    anchorOffsetX: -0.5,\r\n    width: 3,\r\n    name: \"INDICATOR DESCRIPTION AFTER THE FACT\"\r\n  },\r\n  B85: {\r\n    codeString: \"B270:0,-8;B86:1,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    anchorOffsetX:  0.5,\r\n    width: 3,\r\n    name: \"INDICATOR DESCRIPTION BEFORE THE FACT\"\r\n  },\r\n  B86: {\r\n    codeString: \"AA2S:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    name: \"INDICATOR DESCRIPTION\"\r\n  },\r\n  B87: {\r\n    codeString: \"HW2W:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 0.5,\r\n    name: \"INDICATOR FUTURE\"\r\n  },\r\n  B88: {\r\n    codeString: \"B83;B87:2,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 2.5,\r\n    name: \"INDICATOR FUTURE CONDITIONAL\"\r\n  },\r\n  B89: {\r\n    codeString: \"B91;B87:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 3.5,\r\n    name: \"INDICATOR FUTURE PASSIVE\"\r\n  },\r\n  B90: {\r\n    codeString: \"B91;B88:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 5.5,\r\n    name: \"INDICATOR FUTURE PASSIVE CONDITIONAL\"\r\n  },\r\n  B91: {\r\n    codeString: \"AA2W:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    name: \"INDICATOR PASSIVE\"\r\n  },\r\n  B92: {\r\n    codeString: \"HW2E:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 0.5,\r\n    name: \"INDICATOR PAST\"\r\n  },\r\n  B93: {\r\n    codeString: \"B83;B92:2,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 2.5,\r\n    name: \"INDICATOR PAST CONDITIONAL\"\r\n  },\r\n  B94: {\r\n    codeString: \"B91;B93:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 5.5,\r\n    name: \"INDICATOR PAST PASSIVE CONDITIONAL\"\r\n  },\r\n  B95: {\r\n    codeString: \"B91;B92:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 3.5,\r\n    name: \"INDICATOR PAST PASSIVE\"\r\n  },\r\n  B96: {\r\n    codeString: \"B91;B83:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 4,\r\n    name: \"INDICATOR PRESENT PASSIVE CONDITIONAL\"\r\n  },\r\n  B97: {\r\n    codeString: \"S2:0,4\",\r\n    isIndicator: true,\r\n    semanticIndicator: 'thing',\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR THING\"\r\n  },\r\n  B98: {\r\n    codeString: \"B97;B99:3,0\",\r\n    isIndicator: true,\r\n    semanticIndicator: 'thing',\r\n    indicatorRole: 'nominal',\r\n    width: 5,\r\n    name: \"INDICATOR PLURAL THING\"\r\n  },\r\n  B99: {\r\n    codeString: \"DC2:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR PLURAL\"\r\n  },\r\n  B100: {\r\n    codeString: \"DL2S:0,11\"\r\n  },\r\n  B101: {\r\n    codeString: \"B270;B297:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B102: {\r\n    codeString: \"RA4E:0,10\"\r\n  },\r\n  B103: {\r\n    codeString: \"B239;VL6:2,8;HL4:2,8;VL6:6,8\"\r\n  },\r\n  B104: {\r\n    codeString: \"VL6:2,10;HL4:0,12;HL4:0,14\"\r\n  },\r\n  B105: {\r\n    codeString: \"AA8N:0,8\"\r\n  },\r\n  B106: {\r\n    codeString: \"AA4N:0,12\"\r\n  },\r\n  B107: {\r\n    codeString: \"SC8:0,8\"\r\n  },\r\n  B108: {\r\n    codeString: \"B325;HL4:0,8;HL4:0,16\"\r\n  },\r\n  B109: {\r\n    codeString: \"B428;B270:2,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B110: {\r\n    codeString: \"B270;B270:2,0\"\r\n  },\r\n  B111: {\r\n    codeString: \"RA4W:0,10;RA4W:2,10\"\r\n  },\r\n  B112: {\r\n    codeString: \"HW4E:0,12\"\r\n  },\r\n  B113: {\r\n    codeString: \"B335;B335:0,4\"\r\n  },\r\n  B114: {\r\n    codeString: \"B597;B473:4,0\"\r\n  },\r\n  B115: {\r\n    codeString: \"B708;B700:2,0\"\r\n  },\r\n  B116: {\r\n    codeString: \"RA8S:0,8;VL4:4,12;HL8:0,16\"\r\n  },\r\n  B117: {\r\n    codeString: \"B291;B459\"\r\n  },\r\n  B118: {\r\n    codeString: \"Xa;Xb:3.2354,0;Xc:6.4708,0\"\r\n  },\r\n  B119: {\r\n    codeString: \"P4W:0,6;P4E:4,10;P4W:0,14\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B120: {\r\n    codeString: \"SC4:0,10\"\r\n  },\r\n  B121: {\r\n    codeString: \"DL8N:0,8;HL8:0,16\"\r\n  },\r\n  B122: {\r\n    codeString: \"HL8:0,12;AA4N:0,12;AA4N:4,12\"\r\n  },\r\n  B123: {\r\n    codeString: \"B122;B737:4,2\"\r\n  },\r\n  B124: {\r\n    codeString: \"HC4W:0,8;B122:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B125: {\r\n    codeString: \"B122;B737:4,0\"\r\n  },\r\n  B126: {\r\n    codeString: \"B122;HC2N:0,15;HC2N:4,15;HC2N:8,15\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B127: {\r\n    codeString: \"B122;B695:0,6\"\r\n  },\r\n  B128: {\r\n    codeString: \"P4E:0,14;B514:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B129: {\r\n    codeString: \"B291;B699:3,0\"\r\n  },\r\n  B130: {\r\n    codeString: \"B281;B100:3,0\"\r\n  },\r\n  B131: {\r\n    codeString: \"HC4N:0,10;HC4N:4,10;HC8S:0,12;QC4NW:4,8\"\r\n  },\r\n  B132: {\r\n    codeString: \"RA4SW:0,8\"\r\n  },\r\n  B133: {\r\n    codeString: \"B212;HL4:0,10;VL2:4,10\"\r\n  },\r\n  B134: {\r\n    codeString: \"B255;B270\"\r\n  },\r\n  B135: {\r\n    codeString: \"RA4E:0,10;B270:4,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B136: {\r\n    codeString: \"LARRC8SC:0,8;B5840:3,0\"\r\n  },\r\n  B137: {\r\n    codeString: \"B257;B11:7,0;B500:8,0\"\r\n  },\r\n  B138: {\r\n    codeString: \"QC4NW:3,4;VQW4NW:1,8;VQW4NE:3,8;HW4W:0,12;HW4E:5,12;B528:2.5,0;HL4:1,16\",\r\n    anchorOffsetX: -0.5,\r\n    anchorOffsetY: -4\r\n  },\r\n  B139: {\r\n    codeString: \"VL4:0,10;P4E:8,10\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B140: {\r\n    codeString: \"C4:0,12;VL4:4,12;HL4:4,14;VL4:8,12\"\r\n  },\r\n  B141: {\r\n    codeString: \"C4:0,12;AA4W:4,12\"\r\n  },\r\n  B142: {\r\n    codeString: \"C4:0,12;AT4W:4,12\"\r\n  },\r\n  B143: {\r\n    codeString: \"P4E:0,6;B518:3,0\",\r\n    anchorOffsetX: 1.5,\r\n    anchorOffsetY: -1\r\n  },\r\n  B144: {\r\n    codeString: \"B335;B145:0,4\"\r\n  },\r\n  B145: {\r\n    codeString: \"LARR8W:0,10\"\r\n  },\r\n  B146: {\r\n    codeString: \"VL4:0,8;HL8:0,8;VL4:8,8;HC8S:0,12\"\r\n  },\r\n  B147: {\r\n    codeString: \"HC4N:2,10;R84:0,12\"\r\n  },\r\n  B148: {\r\n    codeString: \"C4:0,12;HL4:0,14\"\r\n  },\r\n  B149: {\r\n    codeString: \"C8:0,4;QC4SE:0,12\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B150: {\r\n    codeString: \"QC4NW:0,4;HW8E:0,8;HC8E:0,8\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B151: {\r\n    codeString: \"B612;B428:12,0\"\r\n  },\r\n  B152: {\r\n    codeString: \"B122;B708\"\r\n  },\r\n  B153: {\r\n    codeString: \"B281;B695:8,4\"\r\n  },\r\n  B154: {\r\n    codeString: \"B801;C4:1,10\"\r\n  },\r\n  B155: {\r\n    codeString: \"B1139;P4W:7,16\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B156: {\r\n    codeString: \"VL8:0,8;HL8:0,12;DL4N:4,8;VL8:8,8\"\r\n  },\r\n  B157: {\r\n    codeString: \"B400;HC8N:2,8;HL8:2,12\"\r\n  },\r\n  B158: {\r\n    codeString: \"B270;B428:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B159: {\r\n    codeString: \"B428;B335\"\r\n  },\r\n  B160: {\r\n    codeString: \"B120:0,4\"\r\n  },\r\n  B161: {\r\n    codeString: \"C4:0,10;QC4NE:4,12\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B162: {\r\n    codeString: \"B428;B270:2,0;B428:4,0\"\r\n  },\r\n  B163: {\r\n    codeString: \"B708;AA2N:3,12\"\r\n  },\r\n  B164: {\r\n    codeString: \"B163;B695:0,6\"\r\n  },\r\n  B165: {\r\n    codeString: \"HW8W:0,8;HL8:2,8;HL2:2,16;HL2:8,16;HW8E:10,8;B140:2,-2;LARR4S:4,16\"\r\n  },\r\n  B166: {\r\n    codeString: \"B548;B622:3,0\"\r\n  },\r\n  B167: {\r\n    codeString: \"B712;B509\"\r\n  },\r\n  B168: {\r\n    codeString: \"S4:0,10;DL2N:0,8;HL4:2,8;DL2N:4,8;VL4:6,8;DL2N:4,12\"\r\n  },\r\n  B169: {\r\n    codeString: \"B639;P4N:2,13\"\r\n  },\r\n  B170: {\r\n    codeString: \"VL4:4,8;HL8:0,12;B239\"\r\n  },\r\n  B171: {\r\n    codeString: \"HW8W:0,8;HL8:2,8;HL8:2,16;HW8E:10,8\"\r\n  },\r\n  B172: {\r\n    codeString: \"DOT:0,8;VL4:0,10;DOT:0,16\"\r\n  },\r\n  B173: {\r\n    codeString: \"B497;OR48W:4,8\"\r\n  },\r\n  B174: {\r\n    codeString: \"VL4:2,8;C4:0,12\"\r\n  },\r\n  B175: {\r\n    codeString: \"B291;P4N:2,17\"\r\n  },\r\n  B176: {\r\n    codeString: \"C4:0,10;C4:4,10;RA4N:2,14\"\r\n  },\r\n  B177: {\r\n    codeString: \"S8:0,8;DL4N:0,4;HL8:4,4;DL4N:8,4;VL8:12,4;DL4N:8,12\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B178: {\r\n    codeString: \"C4:0,8;B106\"\r\n  },\r\n  B179: {\r\n    codeString: \"B666;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B180: {\r\n    codeString: \"HW4W:0,12;HL8:1,12;HL8:1,16;HW4E:9,12\"\r\n  },\r\n  B181: {\r\n    codeString: \"B171;P4N:2,12;P4N:6,12\"\r\n  },\r\n  B182: {\r\n    codeString: \"B1154;HC8N:4,12;B1154:12,0\"\r\n  },\r\n  B183: {\r\n    codeString: \"OR84S:0,12;VL8:4,8\"\r\n  },\r\n  B184: {\r\n    codeString: \"OR84N:0,8;VL8:4,8\"\r\n  },\r\n  B185: {\r\n    codeString: \"B345;P4W:5,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B186: {\r\n    codeString: \"B123;HC4N:0,10\"\r\n  },\r\n  B187: {\r\n    codeString: \"B1137;P4W:7,16\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B188: {\r\n    codeString: \"B892;DL2N:9,9;DL2S:10,10\"\r\n  },\r\n  B189: {\r\n    codeString: \"B884;B188:10,0;HL10:12,16\"\r\n  },\r\n  B190: {\r\n    codeString: \"QC4SE:0,10;VL6:4,10;QC4SW:4,10\"\r\n  },\r\n  B191: {\r\n    codeString: \"B451:2,0;B239\"\r\n  },\r\n  B192: {\r\n    codeString: \"HL4:0,12;VL4:4,10\"\r\n  },\r\n  B193: {\r\n    codeString: \"HW8W:0,8;HW8E:2,8;HW8W:4,8;HW8E:6,8\"\r\n  },\r\n  B194: {\r\n    codeString: \"P4E:0,10;B518:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B195: {\r\n    codeString: \"RA4W:0,10\"\r\n  },\r\n  B196: {\r\n    codeString: \"B422;HC4N:2,10\"\r\n  },\r\n  B197: {\r\n    codeString: \"B391;HC4N:0,10;HC4N:4,10\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B198: {\r\n    codeString: \"B291;B424\"\r\n  },\r\n  B199: {\r\n    codeString: \"VL4:0,8;B688;RA8N:0,4;VL4:8,8\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B200: {\r\n    codeString: \"C4:0,8;VL4:0,10;VL4:4,10;HC4S:0,14\"\r\n  },\r\n  B201: {\r\n    codeString: \"B700:3,0;B939\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B202: {\r\n    codeString: \"B688;DL2N:5,9;DL2S:6,10\"\r\n  },\r\n  B203: {\r\n    codeString: \"QC4NW:4,12;B281;AA4S:2,16\"\r\n  },\r\n  B204: {\r\n    codeString: \"B1099;LARR4E:4,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B205: {\r\n    codeString: \"HL14:0,8;VL8:0,8;C4:2,10;HL6:4,10;C4:8,10;VL8:14,8;HL14:0,16\"\r\n  },\r\n  B206: {\r\n    codeString: \"RT8E:0,8\"\r\n  },\r\n  B207: {\r\n    codeString: \"B644;DOT:2,14\"\r\n  },\r\n  B208: {\r\n    codeString: \"B572;P4N:2,9\"\r\n  },\r\n  B209: {\r\n    codeString: \"B1119;VL6:2,8;VL8:4,8;VL6:6,8;HC4S:2,14\"\r\n  },\r\n  B210: {\r\n    codeString: \"HC4N:0,10;VL2:0,12;HC4S:0,14;VL10:2,8\"\r\n  },\r\n  B211: {\r\n    codeString: \"B265;B357:6,0\"\r\n  },\r\n  B212: {\r\n    codeString: \"VL8:0,8;HL4:0,12;VL4:4,12\"\r\n  },\r\n  B213: {\r\n    codeString: \"B423;B695\"\r\n  },\r\n  B214: {\r\n    codeString: \"B306;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B215: {\r\n    codeString: \"RA4NE:0,12;QC4SW:0,12\"\r\n  },\r\n  B216: {\r\n    codeString: \"DL8N:0,8;VL4:8,8;B651:6,2\",\r\n    anchorOffsetX: 3\r\n  },\r\n  B217: {\r\n    codeString: \"B338;B528:1.5,0;HW4W:5,8;C4:4,12;B528:5.5,0\"\r\n  },\r\n  B218: {\r\n    codeString: \"B171;P4N:4,12\"\r\n  },\r\n  B219: {\r\n    codeString: \"S8:0,8;HL8:0,12;DOT:4,10;DOT:4,14\"\r\n  },\r\n  B220: {\r\n    codeString: \"C4:0,8;B956\"\r\n  },\r\n  B221: {\r\n    codeString: \"B1132;P4W:9,6\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B222: {\r\n    codeString: \"B306;P4N:2,17\"\r\n  },\r\n  B223: {\r\n    codeString: \"B368:0,-4;HL4:0,12;B303:0,2\"\r\n  },\r\n  B224: {\r\n    codeString: \"B1085;P4N:4,17\"\r\n  },\r\n  B225: {\r\n    codeString: \"B281;B433:2,0\"\r\n  },\r\n  B226: {\r\n    codeString: \"B126;P4W:11,14\",\r\n    anchorOffsetX: -2.5\r\n  },\r\n  B227: {\r\n    codeString: \"B978;P4W:8,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B228: {\r\n    codeString: \"VL8:2,8;VL8:6,8;HL8:0,10;HL8:0,14\"\r\n  },\r\n  B229: {\r\n    codeString: \"B228;B548\"\r\n  },\r\n  B230: {\r\n    codeString: \"B597;W8N:0,7\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B231: {\r\n    codeString: \"OR84N:0,12;VL4:4,12\"\r\n  },\r\n  B232: {\r\n    codeString: \"C4:0,10;C4:2,10\"\r\n  },\r\n  B233: {\r\n    codeString: \"C2:0,4;C2:1,4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B234: {\r\n    codeString: \"B622:0,4;B255:1,0\"\r\n  },\r\n  B235: {\r\n    codeString: \"HC4N:0,8;HC4N:4,8;VL6:0,10;VL6:4,10;VL6:8,10;HL8:0,16\"\r\n  },\r\n  B236: {\r\n    codeString: \"W8S:0,11;B285:6,0\",\r\n    anchorOffsetX: 3\r\n  },\r\n  B237: {\r\n    codeString: \"RA8N:0,8;HC8S:0,12\"\r\n  },\r\n  B238: {\r\n    codeString: \"B447;B447:0,-4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B239: {\r\n    codeString: \"HC8S:0,12\"\r\n  },\r\n  B240: {\r\n    codeString: \"B687;DOT:4,10;DOT:4,12;DOT:4,14\"\r\n  },\r\n  B241: {\r\n    codeString: \"B572;P4W:9,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B242: {\r\n    codeString: \"DL4S:0,8;OR84S:4,12\"\r\n  },\r\n  B243: {\r\n    codeString: \"B281;B322:4,0\"\r\n  },\r\n  B244: {\r\n    codeString: \"B281;B666\"\r\n  },\r\n  B245: {\r\n    codeString: \"B433;B710:4,0\"\r\n  },\r\n  B246: {\r\n    codeString: \"B433;B548:2,0;B710:8,0\"\r\n  },\r\n  B247: {\r\n    codeString: \"AT8N:0,8\"\r\n  },\r\n  B248: {\r\n    codeString: \"VL8:2,8;HL4:0,10\"\r\n  },\r\n  B249: {\r\n    codeString: \"B171;P4N:4,17\"\r\n  },\r\n  B250: {\r\n    codeString: \"RA4N:0,8;B651;RA4S:0,14\"\r\n  },\r\n  B251: {\r\n    codeString: \"B352;HC4E:4,10\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B252: {\r\n    codeString: \"S8:0,8;DOT:2,12;VL8:4,8;DOT:6,12\"\r\n  },\r\n  B253: {\r\n    codeString: \"B161;C4:0,14;HW4N:4,15\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B254: {\r\n    codeString: \"OS8S:0,8;QC4SE:0,8;QC4SW:4,8\"\r\n  },\r\n  B255: {\r\n    codeString: \"HC8E:0,8\"\r\n  },\r\n  B256: {\r\n    codeString: \"B247;B401:4,0\"\r\n  },\r\n  B257: {\r\n    codeString: \"B548;B314:2,0\"\r\n  },\r\n  B258: {\r\n    codeString: \"B281;B636\"\r\n  },\r\n  B259: {\r\n    codeString: \"B423;B939\"\r\n  },\r\n  B260: {\r\n    codeString: \"B447;B292\"\r\n  },\r\n  B261: {\r\n    codeString: \"B213;LARR8E:8,10\",\r\n    anchorOffsetX: -4\r\n  },\r\n  B262: {\r\n    codeString: \"B939;B578:2,0\"\r\n  },\r\n  B263: {\r\n    codeString: \"C4:0,12;HW4E:5,12\"\r\n  },\r\n  B264: {\r\n    codeString: \"B939;B562\"\r\n  },\r\n  B265: {\r\n    codeString: \"DL4S:0,12;HL8:4,16;DL4N:12,12\"\r\n  },\r\n  B266: {\r\n    codeString: \"DOT:4,10;HL8:0,12;DOT:4,14\"\r\n  },\r\n  B267: {\r\n    codeString: \"VL12:2,6;OC4SE:0,8;OC4NW:0,12\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B268: {\r\n    codeString: \"HC4E:0,14;B851:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B269: {\r\n    codeString: \"OS8S:0,8\"\r\n  },\r\n  B270: {\r\n    codeString: \"DOT:0,12\"\r\n  },\r\n  B271: {\r\n    codeString: \"LARR8S:0,8\"\r\n  },\r\n  B272: {\r\n    codeString: \"RA4SW:0,12;DL8N:0,8\"\r\n  },\r\n  B273: {\r\n    codeString: \"DL8S:0,8;RA4SE:4,12\"\r\n  },\r\n  B274: {\r\n    codeString: \"B219;P4W:9,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B275: {\r\n    codeString: \"B695;B329:2,0\"\r\n  },\r\n  B276: {\r\n    codeString: \"B391;HC4N:2,10\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B277: {\r\n    codeString: \"B426;B270:4,-6\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B278: {\r\n    codeString: \"E:0,8\"\r\n  },\r\n  B279: {\r\n    codeString: \"B651;B278:2,0\"\r\n  },\r\n  B280: {\r\n    codeString: \"DL8S:0,8;C8:0,8\"\r\n  },\r\n  B281: {\r\n    codeString: \"HL8:0,16\"\r\n  },\r\n  B282: {\r\n    codeString: \"B636;P4E:5,10\"\r\n  },\r\n  B283: {\r\n    codeString: \"B639;P4S:6,9\"\r\n  },\r\n  B284: {\r\n    codeString: \"B559;OR48W:0,8\"\r\n  },\r\n  B285: {\r\n    codeString: \"C8:0,8;HW4N:2,11;HW4S:2,12\"\r\n  },\r\n  B286: {\r\n    codeString: \"B270;RA4E:0,10\"\r\n  },\r\n  B287: {\r\n    codeString: \"P4E:0,10;B132:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B288: {\r\n    codeString: \"DL4N:0,8;HL4:0,12;DL4N:0,12\"\r\n  },\r\n  B289: {\r\n    codeString: \"DL8-4S:0,10;VL4:8,10;DL8-4S:8,10\"\r\n  },\r\n  B290: {\r\n    codeString: \"B171;B894:4,0\"\r\n  },\r\n  B291: {\r\n    codeString: \"S8:0,8\"\r\n  },\r\n  B292: {\r\n    codeString: \"B335;B428:8,0\"\r\n  },\r\n  B293: {\r\n    codeString: \"B289;B636:4,0\"\r\n  },\r\n  B294: {\r\n    codeString: \"B712;B695\"\r\n  },\r\n  B295: {\r\n    codeString: \"B518;DL2N:0,10\"\r\n  },\r\n  B296: {\r\n    codeString: \"VL2:2,6;HW8W:0,8;HW8E:2,8\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B297: {\r\n    codeString: \"AA8S:0,8\"\r\n  },\r\n  B298: {\r\n    codeString: \"B281;VQW4NE:4,12;QC4NE:4,12\"\r\n  },\r\n  B299: {\r\n    codeString: \"B894;B1154\"\r\n  },\r\n  B300: {\r\n    codeString: \"B666;QC4SE:0,10;QC4SW:4,10\"\r\n  },\r\n  B301: {\r\n    codeString: \"B447;B1042:2,0\"\r\n  },\r\n  B302: {\r\n    codeString: \"LARR4W:0,10;LARR4N:4,6;B651:4,0;LARR4E:8,10;LARR4S:4,14\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B303: {\r\n    codeString: \"C4:0,10;DOT:2,12\"\r\n  },\r\n  B304: {\r\n    codeString: \"B1138;P4W:5,6\",\r\n    anchorOffsetX: -1.5,\r\n    anchorOffsetY: -2\r\n  },\r\n  B305: {\r\n    codeString: \"B303;P4S:0,7\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B306: {\r\n    codeString: \"B376;DOT:2,10;DOT:6,10\"\r\n  },\r\n  B307: {\r\n    codeString: \"B447;B299:2,0\"\r\n  },\r\n  B308: {\r\n    codeString: \"B393;B704:10,0\"\r\n  },\r\n  B309: {\r\n    codeString: \"B513;B548:2,0;B513:8,0\"\r\n  },\r\n  B310: {\r\n    codeString: \"HC8N:0,8;RA8S:0,12\"\r\n  },\r\n  B311: {\r\n    codeString: \"B548;B317\"\r\n  },\r\n  B312: {\r\n    codeString: \"B548;B433:2,0\"\r\n  },\r\n  B313: {\r\n    codeString: \"H:0,8\"\r\n  },\r\n  B314: {\r\n    codeString: \"AT4N:0,12\"\r\n  },\r\n  B315: {\r\n    codeString: \"B1135;P4W:17,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B316: {\r\n    codeString: \"B171;B140:2,-2\"\r\n  },\r\n  B317: {\r\n    codeString: \"B357;B281\"\r\n  },\r\n  B318: {\r\n    codeString: \"B374;P4W:5,6\",\r\n    anchorOffsetX: -1.5,\r\n    anchorOffsetY: -1\r\n  },\r\n  B319: {\r\n    codeString: \"W8E:0,8\"\r\n  },\r\n  B320: {\r\n    codeString: \"B484;B319:3,0\"\r\n  },\r\n  B321: {\r\n    codeString: \"HC8S:0,12;HC8N:0,12\"\r\n  },\r\n  B322: {\r\n    codeString: \"VL8:0,8;OS4W:0,8\"\r\n  },\r\n  B323: {\r\n    codeString: \"B572;P4N:2,17\"\r\n  },\r\n  B324: {\r\n    codeString: \"B572;P4S:2,13\"\r\n  },\r\n  B325: {\r\n    codeString: \"C4:0,8;VL4:2,12\"\r\n  },\r\n  B326: {\r\n    codeString: \"B1137;P4W:7,8\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B327: {\r\n    codeString: \"B400;B708:2,0\"\r\n  },\r\n  B328: {\r\n    codeString: \"B597;B695\"\r\n  },\r\n  B329: {\r\n    codeString: \"B457;B1154\"\r\n  },\r\n  B330: {\r\n    codeString: \"B418;P4S:8,13\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B331: {\r\n    codeString: \"P4N:0,8;P4S:0,14\"\r\n  },\r\n  B332: {\r\n    codeString: \"RA4E:0,10;RA4E:2,10\"\r\n  },\r\n  B333: {\r\n    codeString: \"B306;P4S:2,7\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B334: {\r\n    codeString: \"DL6N:0,10;DL4S:2,10;DL2N:2,8;DL2N:6,12\"\r\n  },\r\n  B335: {\r\n    codeString: \"LARR8E:0,10\"\r\n  },\r\n  B336: {\r\n    codeString: \"B484;B313\"\r\n  },\r\n  B337: {\r\n    codeString: \"VL4:0,10;P4E:2,10\"\r\n  },\r\n  B338: {\r\n    codeString: \"QC4NW:2,8;C4:0,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B339: {\r\n    codeString: \"B293;B291:4,0\"\r\n  },\r\n  B340: {\r\n    codeString: \"B1141;P4W:7,8\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B341: {\r\n    codeString: \"HW8W:0,8\"\r\n  },\r\n  B342: {\r\n    codeString: \"B392;B700;B700:4,0\"\r\n  },\r\n  B343: {\r\n    codeString: \"B239;B694\"\r\n  },\r\n  B344: {\r\n    codeString: \"B281;B325:2,0\"\r\n  },\r\n  B345: {\r\n    codeString: \"B678;C4:0,10\"\r\n  },\r\n  B346: {\r\n    codeString: \"LARR4E:0,10;LARR4S:4,6;LARR4N:4,14;LARR4W:8,10\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B347: {\r\n    codeString: \"B106;B314:4,0\"\r\n  },\r\n  B348: {\r\n    codeString: \"B368;B457:0,-2\"\r\n  },\r\n  B349: {\r\n    codeString: \"B518;P4W:1,10\"\r\n  },\r\n  B350: {\r\n    codeString: \"B122;VL8:8,4;HL4:8,4\",\r\n    anchorOffsetX: -2,\r\n    anchorOffsetY: -4\r\n  },\r\n  B351: {\r\n    codeString: \"C4:0,8;B314\"\r\n  },\r\n  B352: {\r\n    codeString: \"OR48N:0,8\"\r\n  },\r\n  B353: {\r\n    codeString: \"B303;HC4N:4,10;B303:8,0\"\r\n  },\r\n  B354: {\r\n    codeString: \"OS8S:0,8;B148:2,0\"\r\n  },\r\n  B355: {\r\n    codeString: \"AA8N:0,4;HL2:0,12;HL2:6,12;B247\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B356: {\r\n    codeString: \"B239;B651:2,0\"\r\n  },\r\n  B357: {\r\n    codeString: \"B366;B366:4,0\"\r\n  },\r\n  B358: {\r\n    codeString: \"B312;B500:8,0\"\r\n  },\r\n  B359: {\r\n    codeString: \"B312;B455:8,0\"\r\n  },\r\n  B360: {\r\n    codeString: \"B312;B312:8,0\"\r\n  },\r\n  B361: {\r\n    codeString: \"B455;B500:8,0\"\r\n  },\r\n  B362: {\r\n    codeString: \"B455;B455:8,0\"\r\n  },\r\n  B363: {\r\n    codeString: \"B455;B312:8,0\"\r\n  },\r\n  B364: {\r\n    codeString: \"B500;B500:8,0\"\r\n  },\r\n  B365: {\r\n    codeString: \"C4:0,10;C4:4,10;C4:2,14;QC4NW:4,8\"\r\n  },\r\n  B366: {\r\n    codeString: \"QC4NW:0,12\"\r\n  },\r\n  B367: {\r\n    codeString: \"B281;HL8:0,20;VL2:8,18\"\r\n  },\r\n  B368: {\r\n    codeString: \"DC4:0,12\"\r\n  },\r\n  B369: {\r\n    codeString: \"HL12:0,12;HC4S:1,12\"\r\n  },\r\n  B370: {\r\n    codeString: \"B394;B271:2,0\"\r\n  },\r\n  B371: {\r\n    codeString: \"HW2W:0,10;HW2W:2,10;HW2W:4,10\"\r\n  },\r\n  B372: {\r\n    codeString: \"B1143;P4W:7,4\",\r\n    anchorOffsetX: -0.5,\r\n    anchorOffsetY: -3\r\n  },\r\n  B373: {\r\n    codeString: \"DL6N:0,10;DL4S:4,8\"\r\n  },\r\n  B374: {\r\n    codeString: \"DL4S:0,12;VL8:4,8\"\r\n  },\r\n  B375: {\r\n    codeString: \"B239;HL8:0,12;HC4N:2,10\"\r\n  },\r\n  B376: {\r\n    codeString: \"C8:0,8;VL4:4,10;HL4:2,14\"\r\n  },\r\n  B377: {\r\n    codeString: \"B132;VL8:4,8\"\r\n  },\r\n  B378: {\r\n    codeString: \"P4W:0,10;B319:3,0;P4E:6,10\"\r\n  },\r\n  B379: {\r\n    codeString: \"B122:4,0;DL4S:0,8;DL4S:4,8;DL4S:8,8\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B380: {\r\n    codeString: \"P4E:0,14;B418:3,0\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B381: {\r\n    codeString: \"B983;B700:2,0\"\r\n  },\r\n  B382: {\r\n    codeString: \"DL4-8N:0,8;B513:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B383: {\r\n    codeString: \"RA4E:0,10;B270:4,0;B270:6,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B384: {\r\n    codeString: \"B418;P4W:5,6\",\r\n    anchorOffsetX: -2,\r\n    anchorOffsetY: -2\r\n  },\r\n  B385: {\r\n    codeString: \"B127;DL4N:8,8;DL2S:12,8\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B386: {\r\n    codeString: \"B1154;B239:4,4;B1154:12,0\"\r\n  },\r\n  B387: {\r\n    codeString: \"HL8:0,12;RA4S:8,12\"\r\n  },\r\n  B388: {\r\n    codeString: \"B454;P4W:9,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B389: {\r\n    codeString: \"HL8:0,12;HC4N:4,10;QC4SE:8,8;QC4NE:8,12\"\r\n  },\r\n  B390: {\r\n    codeString: \"B123;P4W:9,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B391: {\r\n    codeString: \"B122;DL4N:8,8;DL2S:12,8\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B392: {\r\n    codeString: \"B878;B548\"\r\n  },\r\n  B393: {\r\n    codeString: \"B433;B548:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B394: {\r\n    codeString: \"B695;B651:2,0\"\r\n  },\r\n  B395: {\r\n    codeString: \"AT4S:0,12;HC4N:0,10\"\r\n  },\r\n  B396: {\r\n    codeString: \"B418;QC4SE:0,16;QC4SE:8,16\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B397: {\r\n    codeString: \"B447;B271:2,0\"\r\n  },\r\n  B398: {\r\n    codeString: \"B291;B270:4,0\"\r\n  },\r\n  B399: {\r\n    codeString: \"VL4:0,10;HL4:0,12;R84:4,10;HL4:12,12\"\r\n  },\r\n  B400: {\r\n    codeString: \"AA4N:0,12;AA4N:4,12;AA4N:8,12\"\r\n  },\r\n  B401: {\r\n    codeString: \"VL3:0,10;DOT:0,14\"\r\n  },\r\n  B402: {\r\n    codeString: \"B335;B291:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B403: {\r\n    codeString: \"QC4NW:0,12;HC4N:4,10;HL4:4,12;VL4:8,12;HL8:0,16\"\r\n  },\r\n  B404: {\r\n    codeString: \"B695:0,4;B281:8,0;B695:16,4\"\r\n  },\r\n  B405: {\r\n    codeString: \"VL4:0,12\"\r\n  },\r\n  B406: {\r\n    codeString: \"P4E:0,14;B1002:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B407: {\r\n    codeString: \"HL8:0,12;HC4S:0,12;VL4:8,12\"\r\n  },\r\n  B408: {\r\n    codeString: \"B457;B457:4,0\"\r\n  },\r\n  B409: {\r\n    codeString: \"DS8:0,4;QC4SE:0,12\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B410: {\r\n    codeString: \"B514;P4W:5,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B411: {\r\n    codeString: \"DL4S:0,12;DL8N:0,8\"\r\n  },\r\n  B412: {\r\n    codeString: \"B447;OR84N:0,12\"\r\n  },\r\n  B413: {\r\n    codeString: \"VL8:0,8;HL4:0,10;HL4:0,14;VL8:4,8\"\r\n  },\r\n  B414: {\r\n    codeString: \"B457;B278:2,0\"\r\n  },\r\n  B415: {\r\n    codeString: \"B281;B366:4,0\"\r\n  },\r\n  B416: {\r\n    codeString: \"HW8W:0,8;VL8:2,8;HW8E:2,8\"\r\n  },\r\n  B417: {\r\n    codeString: \"B418;P4W:7,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B418: {\r\n    codeString: \"AA8N:0,8;HL4:0,16;HL4:8,16\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B419: {\r\n    codeString: \"QC4NW:2,4;HW8W:0,8;HW8E:2,8\",\r\n    anchorOffsetX: -1,\r\n    anchorOffsetY: -4\r\n  },\r\n  B420: {\r\n    codeString: \"VL4:0,10;HL8:0,12;VL4:8,10\"\r\n  },\r\n  B421: {\r\n    codeString: \"B291;RA8S:0,8\"\r\n  },\r\n  B422: {\r\n    codeString: \"B281;QC4NE:0,12;B366:4,0\"\r\n  },\r\n  B423: {\r\n    codeString: \"B636;VL8:4,8\"\r\n  },\r\n  B424: {\r\n    codeString: \"B636;B303:2,0\"\r\n  },\r\n  B425: {\r\n    codeString: \"B597;B288:4,0\"\r\n  },\r\n  B426: {\r\n    codeString: \"VL8:0,8;B655;VL8:8,8\"\r\n  },\r\n  B427: {\r\n    codeString: \"B428;B428:8,0\"\r\n  },\r\n  B428: {\r\n    codeString: \"VL8:0,8\"\r\n  },\r\n  B429: {\r\n    codeString: \"P4S:0,7;B457;P4N:0,15\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B430: {\r\n    codeString: \"B818;HC4E:0,8;HC4W:6,8\"\r\n  },\r\n  B431: {\r\n    codeString: \"HL4:0,12;B313:4,0;B335:8,0\"\r\n  },\r\n  B432: {\r\n    codeString: \"B636;B700:2,0\"\r\n  },\r\n  B433: {\r\n    codeString: \"VL4:2,8;B106\"\r\n  },\r\n  B434: {\r\n    codeString: \"B518;DL2S:0,12\"\r\n  },\r\n  B435: {\r\n    codeString: \"W8E:0,8;QC4NW:1,4;B528:1.5,0;HC8E:1,8\"\r\n  },\r\n  B436: {\r\n    codeString: \"HL2:0,10;RA4N:2,8;HL2:6,10;RA4E:0,10;RA4W:6,10;HL8:0,14;VL2:4,14\"\r\n  },\r\n  B437: {\r\n    codeString: \"B548;B232:1,2\"\r\n  },\r\n  B438: {\r\n    codeString: \"B651;B1154\"\r\n  },\r\n  B439: {\r\n    codeString: \"B580;B829:3,0\"\r\n  },\r\n  B440: {\r\n    codeString: \"B509;B447;B457:2,0\"\r\n  },\r\n  B441: {\r\n    codeString: \"B420;VL4:4,10\"\r\n  },\r\n  B442: {\r\n    codeString: \"C8:0,8;C4:2,10;QC4NW:4,4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B443: {\r\n    codeString: \"VL4:0,8;VL4:2,8;VL4:4,8;VL4:6,8;VL10:8,6;VL4:10,8;VL4:12,8;VL4:14,8;VL4:16,8;HL16:0,12;HL4:6,16\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B444: {\r\n    codeString: \"B457:0,-6;VL8:2,8;B1154\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B445: {\r\n    codeString: \"B289;B291:4,0\"\r\n  },\r\n  B446: {\r\n    codeString: \"B291;P4S:2,10\"\r\n  },\r\n  B447: {\r\n    codeString: \"HC8N:0,8\"\r\n  },\r\n  B448: {\r\n    codeString: \"B456;B270:6,2\"\r\n  },\r\n  B449: {\r\n    codeString: \"HL4:0,12\"\r\n  },\r\n  B450: {\r\n    codeString: \"DL4S:0,8;ARR4SW:0,12\"\r\n  },\r\n  B451: {\r\n    codeString: \"C4:0,8;C4:0,12;VL8:2,8\"\r\n  },\r\n  B452: {\r\n    codeString: \"VL8:0,8;HC8E:0,8\"\r\n  },\r\n  B453: {\r\n    codeString: \"HW8E:0,8;HC8E:0,8\"\r\n  },\r\n  B454: {\r\n    codeString: \"HC8N:0,12;B281\"\r\n  },\r\n  B455: {\r\n    codeString: \"B548;B710:2,0\"\r\n  },\r\n  B456: {\r\n    codeString: \"RT8SE:0,8\"\r\n  },\r\n  B457: {\r\n    codeString: \"C4:0,10\"\r\n  },\r\n  B458: {\r\n    codeString: \"B695:0,4;HL12:0,16\"\r\n  },\r\n  B459: {\r\n    codeString: \"DC8:0,8\"\r\n  },\r\n  B460: {\r\n    codeString: \"B718;P4W:5,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B461: {\r\n    codeString: \"HC4N:0,10;HL4:0,12;VL4:2,12\"\r\n  },\r\n  B462: {\r\n    codeString: \"VL6:4,8;C4:0,12\"\r\n  },\r\n  B463: {\r\n    codeString: \"HL4:0,8;VL8:2,8\"\r\n  },\r\n  B464: {\r\n    codeString: \"B509;B457:2,0\"\r\n  },\r\n  B465: {\r\n    codeString: \"B1142;P4W:6,16\"\r\n  },\r\n  B466: {\r\n    codeString: \"B171;P4S:4,5\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B467: {\r\n    codeString: \"HL4:0,16;DL4-8N:2,8\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B468: {\r\n    codeString: \"VL8:0,8;HC4E:0,8\"\r\n  },\r\n  B469: {\r\n    codeString: \"B303;B278:2,0\"\r\n  },\r\n  B470: {\r\n    codeString: \"B281;B453:4,0\"\r\n  },\r\n  B471: {\r\n    codeString: \"B440;B939\"\r\n  },\r\n  B472: {\r\n    codeString: \"B636;P4N:2,9\"\r\n  },\r\n  B473: {\r\n    codeString: \"DL4-8N:0,8;HL4:0,16\"\r\n  },\r\n  B474: {\r\n    codeString: \"B112;B648:3,0\"\r\n  },\r\n  B475: {\r\n    codeString: \"B449:2,0;B281\"\r\n  },\r\n  B476: {\r\n    codeString: \"P4W:0,10;B477:3,0;P4E:12,10\"\r\n  },\r\n  B477: {\r\n    codeString: \"B136;P2E:1,11\"\r\n  },\r\n  B478: {\r\n    codeString: \"DL4-8N:1,8;HL8:2,10;DL4-8N:5,8;HL8:0,14\"\r\n  },\r\n  B479: {\r\n    codeString: \"B548;B347\"\r\n  },\r\n  B480: {\r\n    codeString: \"B695;B695:0,4\"\r\n  },\r\n  B481: {\r\n    codeString: \"QC4NW:1,8;HW4W:0,12;HW4E:1,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B482: {\r\n    codeString: \"B1154;P4S:0,14\"\r\n  },\r\n  B483: {\r\n    codeString: \"B281;C4:2,16;HW4W:3,16;HW4E:4,16\"\r\n  },\r\n  B484: {\r\n    codeString: \"OS8N:0,8\"\r\n  },\r\n  B485: {\r\n    codeString: \"B447;B457:2,0\"\r\n  },\r\n  B486: {\r\n    codeString: \"DL2N:0,8;VL8:2,8;DL2N:2,14\"\r\n  },\r\n  B487: {\r\n    codeString: \"B558;B558:4,0\"\r\n  },\r\n  B488: {\r\n    codeString: \"RA4W:0,10;B270:2,0\"\r\n  },\r\n  B489: {\r\n    codeString: \"B338;HW4W:1,12;HW4E:2,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B490: {\r\n    codeString: \"B291;B270:10,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B491: {\r\n    codeString: \"B291;B335:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B492: {\r\n    codeString: \"B291;B271:2,4\"\r\n  },\r\n  B493: {\r\n    codeString: \"B634;B270:4,-2\"\r\n  },\r\n  B494: {\r\n    codeString: \"HW8N:0,12;HL8:0,14;HW8S:0,14;B695:0,6\"\r\n  },\r\n  B495: {\r\n    codeString: \"HC4N:2,10;HL8:0,12;DL2-4S:0,12;HL4:2,16;DL2-4N:6,12\"\r\n  },\r\n  B496: {\r\n    codeString: \"HC4N:0,8;HC4N:4,8;VL6:4,10\"\r\n  },\r\n  B497: {\r\n    codeString: \"R48:0,8\"\r\n  },\r\n  B498: {\r\n    codeString: \"B428;B428:2,0\"\r\n  },\r\n  B499: {\r\n    codeString: \"HL12:0,8;VL8:0,8;RA8E:0,8;RA8W:8,8;VL8:12,8;HL12:0,16\"\r\n  },\r\n  B500: {\r\n    codeString: \"B548;B513:2,0\"\r\n  },\r\n  B501: {\r\n    codeString: \"B325;B281:2,0;B666:6,0\"\r\n  },\r\n  B502: {\r\n    codeString: \"DOT:2,10;HL4:0,12;DOT:2,14\"\r\n  },\r\n  B503: {\r\n    codeString: \"HW8E:0,8\"\r\n  },\r\n  B504: {\r\n    codeString: \"B122;P4W:9,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B505: {\r\n    codeString: \"B712;B313\"\r\n  },\r\n  B506: {\r\n    codeString: \"QC4NW:4,8;HC4N:0,10;HC4N:4,10;HC8S:0,12;B528:3.5,0\"\r\n  },\r\n  B507: {\r\n    codeString: \"QC4NW:3,4;VQW4NW:1,8;VQW4NE:3,8;HW4W:0,12;HW4E:5,12;HL4:1,16\",\r\n    anchorOffsetX: -0.5,\r\n    anchorOffsetY: -4\r\n  },\r\n  B508: {\r\n    codeString: \"B801;C2:2,9;C2:2,13\"\r\n  },\r\n  B509: {\r\n    codeString: \"DL8S:0,8\"\r\n  },\r\n  B510: {\r\n    codeString: \"B434;P4W:3,12\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B511: {\r\n    codeString: \"QC4NW:2,4;VL2:2,8;HC2N:0,9;HC2N:2,9;VL4:0,10;VL4:4,10;HC4S:0,14\",\r\n    anchorOffsetX: -1,\r\n    anchorOffsetY: -4\r\n  },\r\n  B512: {\r\n    codeString: \"HL8:0,16;VL8:4,8\"\r\n  },\r\n  B513: {\r\n    codeString: \"HL4:0,16;VL8:2,8\"\r\n  },\r\n  B514: {\r\n    codeString: \"VL4:0,8;DL4S:0,12;HL4:0,16\"\r\n  },\r\n  B515: {\r\n    codeString: \"HL8:0,16;VL4:8,12\"\r\n  },\r\n  B516: {\r\n    codeString: \"RA8N:0,12;VL4:8,12\"\r\n  },\r\n  B517: {\r\n    codeString: \"VL4:0,8;HL4:0,12;VL4:4,12\"\r\n  },\r\n  B518: {\r\n    codeString: \"VL8:0,8;HL4:0,16\"\r\n  },\r\n  B519: {\r\n    codeString: \"RA8E:0,8;HL4:0,16\"\r\n  },\r\n  B520: {\r\n    codeString: \"OR84S:0,12;HL2:8,16;B695:10,4;B170:10,0\"\r\n  },\r\n  B521: {\r\n    codeString: \"HC4S:0,8;HC4W:2,8;B122:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B522: {\r\n    codeString: \"B156;P4S:6,5\",\r\n    anchorOffsetX: -1,\r\n    anchorOffsetY: -3\r\n  },\r\n  B523: {\r\n    codeString: \"B1140;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B524: {\r\n    codeString: \"HL4:0,12;VL4:2,12\"\r\n  },\r\n  B525: {\r\n    codeString: \"QC4NE:0,4;VL4:4,4;QC4NW:4,4;HC4N:2,8;VL4:2,10;VL4:6,10;HC4S:2,14\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B526: {\r\n    codeString: \"B1086;P4W:13,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B527: {\r\n    codeString: \"C4:0,12;HL8:2,12;HL8:2,16\"\r\n  },\r\n  B528: {\r\n    codeString: \"HW2W:0,13;HW2E:0.5,13\"\r\n  },\r\n  B529: {\r\n    codeString: \"B180;HL8:1,14\"\r\n  },\r\n  B530: {\r\n    codeString: \"DL4S:0,8;OR48N:4,8;HC4E:8,10\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B531: {\r\n    codeString: \"B281;P4S:2,14\"\r\n  },\r\n  B532: {\r\n    codeString: \"B447;B840\"\r\n  },\r\n  B533: {\r\n    codeString: \"B325;QC4NW:2,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B534: {\r\n    codeString: \"B884;B688:10,0;HL6:12,16\"\r\n  },\r\n  B535: {\r\n    codeString: \"HC4W:0,8;DC4:2,12;HC4E:6,8\"\r\n  },\r\n  B536: {\r\n    codeString: \"B411;B281\"\r\n  },\r\n  B537: {\r\n    codeString: \"B338;B528:1.5,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B538: {\r\n    codeString: \"B411;P4W:9,6\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B539: {\r\n    codeString: \"B878;B695\"\r\n  },\r\n  B540: {\r\n    codeString: \"B559;B270:6,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B541: {\r\n    codeString: \"B620;VL8:0,8;HL8:0,16\"\r\n  },\r\n  B542: {\r\n    codeString: \"OR84N:0,12;DL4N:8,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B543: {\r\n    codeString: \"HW2N:1,9.5;VL6:1,10;HL2:0,12;HL3:1,16;HC2E:4,14\"\r\n  },\r\n  B544: {\r\n    codeString: \"DOT:0,16;DOT:4,12;DOT:4,16\"\r\n  },\r\n  B545: {\r\n    codeString: \"B289;B105:4,0\"\r\n  },\r\n  B546: {\r\n    codeString: \"B503;B341:4,0\"\r\n  },\r\n  B547: {\r\n    codeString: \"B198;LARR4E:8,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B548: {\r\n    codeString: \"RA8N:0,8\"\r\n  },\r\n  B549: {\r\n    codeString: \"B1129;P4W:9,16\"\r\n  },\r\n  B550: {\r\n    codeString: \"HL16:0,16;HL8:8,8;VL8:16,8\"\r\n  },\r\n  B551: {\r\n    codeString: \"B559;B559:4,0\"\r\n  },\r\n  B552: {\r\n    codeString: \"AT8N:0,8;DL8-4S:4,8;DL4N:8,12\"\r\n  },\r\n  B553: {\r\n    codeString: \"B484;B699:3,0\"\r\n  },\r\n  B554: {\r\n    codeString: \"B335:4,0;B335:0,4\"\r\n  },\r\n  B555: {\r\n    codeString: \"DL4N:0,12;DLOC4SW:4,8;C4:4,8;SC4:4,8\"\r\n  },\r\n  B556: {\r\n    codeString: \"B695;B271:2,0\"\r\n  },\r\n  B557: {\r\n    codeString: \"C2:0,11;C2:2,10;C2:2,12;QC4NE:4,12\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B558: {\r\n    codeString: \"RA8W:0,8\"\r\n  },\r\n  B559: {\r\n    codeString: \"RA8E:0,8\"\r\n  },\r\n  B560: {\r\n    codeString: \"B548;B513:6,0;B548:8,0\"\r\n  },\r\n  B561: {\r\n    codeString: \"COMMA:0,12;COMMA:2,12\"\r\n  },\r\n  B562: {\r\n    codeString: \"B313;B281\"\r\n  },\r\n  B563: {\r\n    codeString: \"B428;B145:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B564: {\r\n    codeString: \"B391;QC2SE:14,8\",\r\n    anchorOffsetX: -4\r\n  },\r\n  B565: {\r\n    codeString: \"B695:0,4;B357:2,0\"\r\n  },\r\n  B566: {\r\n    codeString: \"RA8SW:0,8;RA2NE:0,14\"\r\n  },\r\n  B567: {\r\n    codeString: \"C8:0,8;C4:2,10\"\r\n  },\r\n  B568: {\r\n    codeString: \"B335;B695:0,4\"\r\n  },\r\n  B569: {\r\n    codeString: \"B1148;P4S:2,13\"\r\n  },\r\n  B570: {\r\n    codeString: \"HW4W:0,12;HL4:1,12;HL4:1,16;HW4E:5,12\"\r\n  },\r\n  B571: {\r\n    codeString: \"B418;B700:0,4;B700:8,4\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B572: {\r\n    codeString: \"OS8W:0,8\"\r\n  },\r\n  B573: {\r\n    codeString: \"B1119;QC4SW:4,16\"\r\n  },\r\n  B574: {\r\n    codeString: \"VL4:0,8;B239;VL4:8,8\"\r\n  },\r\n  B575: {\r\n    codeString: \"VL8:0,8;DL4S:0,8;HL4:0,12\"\r\n  },\r\n  B576: {\r\n    codeString: \"B170;DL4S:4,8\"\r\n  },\r\n  B577: {\r\n    codeString: \"B265;QC4NE:4,12;QC4NW:8,12\"\r\n  },\r\n  B578: {\r\n    codeString: \"HL4:0,10;HL4:0,14\"\r\n  },\r\n  B579: {\r\n    codeString: \"DL12N:0,8;RA4SE:4,12;RA4SE:8,8\"\r\n  },\r\n  B580: {\r\n    codeString: \"B447;B247\"\r\n  },\r\n  B581: {\r\n    codeString: \"C4:0,12;VL8:4,8;C4:4,12\"\r\n  },\r\n  B582: {\r\n    codeString: \"VL8:0,8;W8E:2,8;VL8:6,8\"\r\n  },\r\n  B583: {\r\n    codeString: \"B291;B457:2,0\"\r\n  },\r\n  B584: {\r\n    codeString: \"B281;DOT:2,18;DOT:6,18\"\r\n  },\r\n  B585: {\r\n    codeString: \"DL8-4N:0,10;AT4N:2,12\"\r\n  },\r\n  B586: {\r\n    codeString: \"C4:2,8;C4:0,12;C4:4,12;VL2:4,14;QC4SE:0,16\"\r\n  },\r\n  B587: {\r\n    codeString: \"OS8S:0,8;HL8:0,12\"\r\n  },\r\n  B588: {\r\n    codeString: \"B1006;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B589: {\r\n    codeString: \"B171;P4S:8,5\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B590: {\r\n    codeString: \"HL4:0,8;VL6:2,8;HL4:0,14;HC4S:0,14\"\r\n  },\r\n  B591: {\r\n    codeString: \"B572;B556\"\r\n  },\r\n  B592: {\r\n    codeString: \"B171;P4W:13,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B593: {\r\n    codeString: \"B291;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B594: {\r\n    codeString: \"B239;B271:2,4\"\r\n  },\r\n  B595: {\r\n    codeString: \"B239;B695\"\r\n  },\r\n  B596: {\r\n    codeString: \"B688;QC4SE:8,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B597: {\r\n    codeString: \"HL8:0,8\"\r\n  },\r\n  B598: {\r\n    codeString: \"B1084;OS4S:0,12\"\r\n  },\r\n  B599: {\r\n    codeString: \"B291;B303:2,0\"\r\n  },\r\n  B600: {\r\n    codeString: \"B473;B1154:0,2\"\r\n  },\r\n  B601: {\r\n    codeString: \"HL8:0,16;HC4N:4,14;DL4N:8,12\"\r\n  },\r\n  B602: {\r\n    codeString: \"HC4N:0,12;HC4S:4,14;HC4N:8,12\"\r\n  },\r\n  B603: {\r\n    codeString: \"B602;B695:2,6\"\r\n  },\r\n  B604: {\r\n    codeString: \"B695;VL6:4,8;B622:3,4\"\r\n  },\r\n  B605: {\r\n    codeString: \"B604;P4W:6,14\"\r\n  },\r\n  B606: {\r\n    codeString: \"B651:0,2;B651:4,-2\"\r\n  },\r\n  B607: {\r\n    codeString: \"B548;B106:2,0\"\r\n  },\r\n  B608: {\r\n    codeString: \"B278;B1154\"\r\n  },\r\n  B609: {\r\n    codeString: \"B265;B695:4,0\"\r\n  },\r\n  B610: {\r\n    codeString: \"B636;P4S:2,13\"\r\n  },\r\n  B611: {\r\n    codeString: \"RA8SW:0,8;DL4N:0,12\"\r\n  },\r\n  B612: {\r\n    codeString: \"W8S:0,11;HW4N:8,11;HW4S:8,12\"\r\n  },\r\n  B613: {\r\n    codeString: \"C4:2,10;HC8N:0,12;HW4E:4,12\"\r\n  },\r\n  B614: {\r\n    codeString: \"DL4N:0,12;DLOC4SW:4,8;C4:4,8\"\r\n  },\r\n  B615: {\r\n    codeString: \"DL4-8S:0,8;HL4:4,16\"\r\n  },\r\n  B616: {\r\n    codeString: \"B513;B548:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B617: {\r\n    codeString: \"B482;B457\"\r\n  },\r\n  B618: {\r\n    codeString: \"B1119;C8:0,8;C4:2,10\"\r\n  },\r\n  B619: {\r\n    codeString: \"RA4NW:0,12;RA4NW:4,8\"\r\n  },\r\n  B620: {\r\n    codeString: \"HL8:0,8;VL4:4,8;HL4:4,12;VL8:8,8\"\r\n  },\r\n  B621: {\r\n    codeString: \"AT8N:0,8;AT8S:0,10\"\r\n  },\r\n  B622: {\r\n    codeString: \"VL4:1,10;DC2:0,11\"\r\n  },\r\n  B623: {\r\n    codeString: \"B695;B678:2,0\"\r\n  },\r\n  B624: {\r\n    codeString: \"B572;B623\"\r\n  },\r\n  B625: {\r\n    codeString: \"B325;P4W:3,12\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B626: {\r\n    codeString: \"B393;B455:10,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B627: {\r\n    codeString: \"B704;B312:8,0\"\r\n  },\r\n  B628: {\r\n    codeString: \"B171;P4S:4,10\"\r\n  },\r\n  B629: {\r\n    codeString: \"RT4SE:0,12\"\r\n  },\r\n  B630: {\r\n    codeString: \"B291;B319:3,0\"\r\n  },\r\n  B631: {\r\n    codeString: \"B161;DOT:1,12;DOT:3,12;DOT:2,13\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B632: {\r\n    codeString: \"B1150;P4S:2,13\"\r\n  },\r\n  B633: {\r\n    codeString: \"DOT:0,8;HL4:2,8;DOT:8,8;VL4:0,10;VL4:8,10;DOT:0,16;HL4:2,16;DOT:8,16\"\r\n  },\r\n  B634: {\r\n    codeString: \"HL8:0,12\"\r\n  },\r\n  B635: {\r\n    codeString: \"B1063;B335:4,0\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B636: {\r\n    codeString: \"C8:0,8\"\r\n  },\r\n  B637: {\r\n    codeString: \"B695:0,4;B1154\"\r\n  },\r\n  B638: {\r\n    codeString: \"B851;W8W:7,8;DL2S:8,8\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B639: {\r\n    codeString: \"OR84S:0,12\"\r\n  },\r\n  B640: {\r\n    codeString: \"P4E:0,8;B124:3,0\",\r\n    anchorOffsetX: 2.5\r\n  },\r\n  B641: {\r\n    codeString: \"B201:0,-4;HL15:0,12;B700:3,0;B700:7,0;B700:11,0;DL2N:12,9;DL2S:13,10\",\r\n    anchorOffsetX: 1.5,\r\n    anchorOffsetY: -4\r\n  },\r\n  B642: {\r\n    codeString: \"B473;B457\"\r\n  },\r\n  B643: {\r\n    codeString: \"B108;HL4:0,12\"\r\n  },\r\n  B644: {\r\n    codeString: \"B1121;B1121:4,0\"\r\n  },\r\n  B645: {\r\n    codeString: \"B927;DOT:2,18\"\r\n  },\r\n  B646: {\r\n    codeString: \"B270:0,2;B647:1,0\",\r\n    anchorOffsetX: 0.5\r\n  },\r\n  B647: {\r\n    codeString: \"DL2N:0,11\"\r\n  },\r\n  B648: {\r\n    codeString: \"HW4W:0,12\"\r\n  },\r\n  B649: {\r\n    codeString: \"B270;B270:2,0;RA4W:4,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B650: {\r\n    codeString: \"RT4E:0,10\"\r\n  },\r\n  B651: {\r\n    codeString: \"S4:0,10\"\r\n  },\r\n  B652: {\r\n    codeString: \"B647;B270:3,-2\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B653: {\r\n    codeString: \"B335;B428:4,0\"\r\n  },\r\n  B654: {\r\n    codeString: \"P4E:0,10;B374:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B655: {\r\n    codeString: \"C8:0,8;RA4SW:4,8\"\r\n  },\r\n  B656: {\r\n    codeString: \"B700;P4W:5,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B657: {\r\n    codeString: \"P4E:0,10;VL4:4,10\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B658: {\r\n    codeString: \"B418;P4W:13,14\",\r\n    anchorOffsetX: -3.5\r\n  },\r\n  B659: {\r\n    codeString: \"B695:0,4;B212:2,0\"\r\n  },\r\n  B660: {\r\n    codeString: \"B374;B651:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B661: {\r\n    codeString: \"B291;P4S:2,5\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B662: {\r\n    codeString: \"AT4S:0,12;VL2:2,10\"\r\n  },\r\n  B663: {\r\n    codeString: \"VL2:2,6;VL2:6,6;S8:0,8;VL2:2,16;VL2:6,16\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B664: {\r\n    codeString: \"B827;HL4:8,12;B700:8,0;DL2N:9,9;DL2S:10,10\"\r\n  },\r\n  B665: {\r\n    codeString: \"RA2NE:0,14;HL8:2,16;RA2NW:10,14\"\r\n  },\r\n  B666: {\r\n    codeString: \"QC4SE:0,8;VL8:4,8;QC4SW:4,8\"\r\n  },\r\n  B667: {\r\n    codeString: \"B281;B700:2,0\"\r\n  },\r\n  B668: {\r\n    codeString: \"B188;OS4S:0,8\"\r\n  },\r\n  B669: {\r\n    codeString: \"B666;P4W:5,12\"\r\n  },\r\n  B670: {\r\n    codeString: \"B447;B1048\"\r\n  },\r\n  B671: {\r\n    codeString: \"B281;C4:2,16;B416:2,0\"\r\n  },\r\n  B672: {\r\n    codeString: \"B122;HC8N:0,8;DL4N:8,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B673: {\r\n    codeString: \"B447;B502:2,0\"\r\n  },\r\n  B674: {\r\n    codeString: \"B548;VL6:4,8;HC4S:4,14\"\r\n  },\r\n  B675: {\r\n    codeString: \"B607;B11:7,0;B500:8,0\"\r\n  },\r\n  B676: {\r\n    codeString: \"B634;B270:4,2\"\r\n  },\r\n  B677: {\r\n    codeString: \"VL4:2,10;P4E:0,10\"\r\n  },\r\n  B678: {\r\n    codeString: \"LARR8N:0,8\"\r\n  },\r\n  B679: {\r\n    codeString: \"DL8S:0,8;RA4NW:0,8\"\r\n  },\r\n  B680: {\r\n    codeString: \"DL8N:0,8;RA4NE:4,8\"\r\n  },\r\n  B681: {\r\n    codeString: \"B171;B314:4,-2\"\r\n  },\r\n  B682: {\r\n    codeString: \"HW8W:0,8;HL8:2,8;HL2:2,16;HL2:8,16;HW8E:10,8;B314:4,-2;P4N:4,16\"\r\n  },\r\n  B683: {\r\n    codeString: \"B1144;P4S:10,13\"\r\n  },\r\n  B684: {\r\n    codeString: \"C4:2,12;B1119\"\r\n  },\r\n  B685: {\r\n    codeString: \"QC4NW:4,12;B281;C4:2,16\"\r\n  },\r\n  B686: {\r\n    codeString: \"B685;HW4W:3,16;HW4E:4,16\"\r\n  },\r\n  B687: {\r\n    codeString: \"HC4N:2,8;VL4:2,10;VL4:6,10;HC4S:2,14;B1119\"\r\n  },\r\n  B688: {\r\n    codeString: \"HL8:0,12;B700;B700:4,0\"\r\n  },\r\n  B689: {\r\n    codeString: \"DL4S:0,8;B688:4,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B690: {\r\n    codeString: \"B171:3,0;P4E:0,10;P4W:16,10\"\r\n  },\r\n  B691: {\r\n    codeString: \"B572;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B692: {\r\n    codeString: \"DC2:0,8;VL8:1,8\"\r\n  },\r\n  B693: {\r\n    codeString: \"B411;DL4N:8,12;DL8S:4,8\"\r\n  },\r\n  B694: {\r\n    codeString: \"B939;B651:2,0\"\r\n  },\r\n  B695: {\r\n    codeString: \"W8N:0,11\"\r\n  },\r\n  B696: {\r\n    codeString: \"B636;B556\"\r\n  },\r\n  B697: {\r\n    codeString: \"HL8:0,12;AT4N:2,12\"\r\n  },\r\n  B698: {\r\n    codeString: \"B636;P4W:1,10\"\r\n  },\r\n  B699: {\r\n    codeString: \"OC2SW:0,10;VL1:1,12;DOT:1,14\"\r\n  },\r\n  B700: {\r\n    codeString: \"C4:0,12;DLIC4N:0,12;DLIC4S:0,12\"\r\n  },\r\n  B701: {\r\n    codeString: \"B212;B700\"\r\n  },\r\n  B702: {\r\n    codeString: \"B281;B561:3,0\"\r\n  },\r\n  B703: {\r\n    codeString: \"B281;B699:3,0\"\r\n  },\r\n  B704: {\r\n    codeString: \"B548;B710:6,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B705: {\r\n    codeString: \"B114;B335:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B706: {\r\n    codeString: \"B291;SC8:0,8\"\r\n  },\r\n  B707: {\r\n    codeString: \"B291;VL8:2,8;VL8:6,8;HL8:0,10;HL8:0,14\"\r\n  },\r\n  B708: {\r\n    codeString: \"QC4NE:0,8;QC4NW:4,8\"\r\n  },\r\n  B709: {\r\n    codeString: \"B120:0,-4\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B710: {\r\n    codeString: \"VL4:2,8;B314\"\r\n  },\r\n  B711: {\r\n    codeString: \"B106;B106:0,-4\"\r\n  },\r\n  B712: {\r\n    codeString: \"B597;B281\"\r\n  },\r\n  B713: {\r\n    codeString: \"HL12:0,16;B602:0,4\"\r\n  },\r\n  B714: {\r\n    codeString: \"B132;P4W:1,6\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B715: {\r\n    codeString: \"B1135;P4S:10,13\"\r\n  },\r\n  B716: {\r\n    codeString: \"LARRC8EC:0,8\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B717: {\r\n    codeString: \"AA4S:0,8;HL4:0,12;HL4:0,14;VL4:2,12\"\r\n  },\r\n  B718: {\r\n    codeString: \"B132;HC4N:0,10\"\r\n  },\r\n  B719: {\r\n    codeString: \"B377;B106\"\r\n  },\r\n  B720: {\r\n    codeString: \"VL8:4,8;DL4N:0,8;HL4:0,12\"\r\n  },\r\n  B721: {\r\n    codeString: \"B170;DL4N:0,8\"\r\n  },\r\n  B722: {\r\n    codeString: \"B695;B617:2,0\"\r\n  },\r\n  B723: {\r\n    codeString: \"B678;B271:4,0\"\r\n  },\r\n  B724: {\r\n    codeString: \"VL8:0,8;HW4N:0,7;HW4S:0,8;HW4S:0,16;VL8:4,8\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B725: {\r\n    codeString: \"B313;B355\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B726: {\r\n    codeString: \"B313;B247\"\r\n  },\r\n  B727: {\r\n    codeString: \"B313;B733\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B728: {\r\n    codeString: \"B513;B737:0,-2\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B729: {\r\n    codeString: \"B708;B513:2,0\"\r\n  },\r\n  B730: {\r\n    codeString: \"B246;B622:5,0\"\r\n  },\r\n  B731: {\r\n    codeString: \"HC2W:0,14;HL8:1,14;HL8:1,16;HC2E:9,14\"\r\n  },\r\n  B732: {\r\n    codeString: \"B570;HL6:0,14\"\r\n  },\r\n  B733: {\r\n    codeString: \"B447:0,-4;B247\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B734: {\r\n    codeString: \"P4W:0,10;B355:3,0;P4E:12,10\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B735: {\r\n    codeString: \"B313;B894:2,0\"\r\n  },\r\n  B736: {\r\n    codeString: \"B803;B513:2,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B737: {\r\n    codeString: \"HC4S:0,8\"\r\n  },\r\n  B738: {\r\n    codeString: \"HW4W:0,8;HW4E:3,8\"\r\n  },\r\n  B739: {\r\n    codeString: \"B500;B548:8,0\"\r\n  },\r\n  B740: {\r\n    codeString: \"B455;B548:8,0\"\r\n  },\r\n  B741: {\r\n    codeString: \"B312;B548:8,0\"\r\n  },\r\n  B742: {\r\n    codeString: \"B739;B622:11,0\"\r\n  },\r\n  B743: {\r\n    codeString: \"B712;B303:2,0\"\r\n  },\r\n  B744: {\r\n    codeString: \"HL12:0,10;VL6:0,10;VL2:10,12;HL8:2,14;VL6:12,10;HL12:0,16\"\r\n  },\r\n  B745: {\r\n    codeString: \"W8E:0,8;W8W:6,8;HL6:1,16\"\r\n  },\r\n  B746: {\r\n    codeString: \"B412;B699:3,0\"\r\n  },\r\n  B747: {\r\n    codeString: \"RT8S:0,8;VL4:4,12;HL8:0,16\"\r\n  },\r\n  B748: {\r\n    codeString: \"C8:0,8;B894:2,0\"\r\n  },\r\n  B749: {\r\n    codeString: \"HL4:0,11;HL4:0,13;HC4N:2,8;VL4:2,10;HC4S:2,14\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B750: {\r\n    codeString: \"B467;HL4:8,16;DL4-8S:6,8\"\r\n  },\r\n  B751: {\r\n    codeString: \"B447;B106:2,0\"\r\n  },\r\n  B752: {\r\n    codeString: \"HC8N:0,8;HL12:0,12\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B753: {\r\n    codeString: \"B167;B457:2,0\"\r\n  },\r\n  B754: {\r\n    codeString: \"HW8N:0,12;HL8:0,14;HW8S:0,14\"\r\n  },\r\n  B755: {\r\n    codeString: \"HL4:0,8;VL8:0,8;VL8:2,8;VL8:4,8\"\r\n  },\r\n  B756: {\r\n    codeString: \"B731:0,-4;B700:1,0;B700:5,0\"\r\n  },\r\n  B757: {\r\n    codeString: \"B518:2,0;B700\"\r\n  },\r\n  B758: {\r\n    codeString: \"B292;B335:8,0\"\r\n  },\r\n  B759: {\r\n    codeString: \"C4:0,10;C4:3,10;C4:6,10\"\r\n  },\r\n  B760: {\r\n    codeString: \"HC8E:0,8;LARR8E:0,10\"\r\n  },\r\n  B761: {\r\n    codeString: \"B695:0,4;P4S:0,12\"\r\n  },\r\n  B762: {\r\n    codeString: \"B720;P4W:5,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B763: {\r\n    codeString: \"B720:1,0;P4N:0,13\",\r\n    anchorOffsetX: 0.5\r\n  },\r\n  B764: {\r\n    codeString: \"B170;P4S:5,9\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B765: {\r\n    codeString: \"B170;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B766: {\r\n    codeString: \"P4E:0,10;B170:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B767: {\r\n    codeString: \"B170;P4N:2,17\"\r\n  },\r\n  B768: {\r\n    codeString: \"B170;P4N:2,13\"\r\n  },\r\n  B769: {\r\n    codeString: \"B170;VL4:0,12\"\r\n  },\r\n  B770: {\r\n    codeString: \"B695:0,4;DL4N:1,12;DL4N:3,14;DL2S:1,16;DL2S:5,12;DL5N:6,8\"\r\n  },\r\n  B771: {\r\n    codeString: \"B695:0,4;DL4N:1,12;DL4N:3,14;DL2S:1,16;DL2S:5,12;DL2N:6,11;DL4N:7,6;DL4N:9,8;DL2S:7,10;DL2S:11,6\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B772: {\r\n    codeString: \"B170;RA4NW:0,8\"\r\n  },\r\n  B773: {\r\n    codeString: \"HC8N:0,4;B1040\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B774: {\r\n    codeString: \"C8:0,4;OR42N:2,12\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B775: {\r\n    codeString: \"B392;B270:4,0\"\r\n  },\r\n  B776: {\r\n    codeString: \"B265;HC8N:4,12\"\r\n  },\r\n  B777: {\r\n    codeString: \"DOT:0,10;DOT:0,14;DOT:4,10;DOT:4,14\"\r\n  },\r\n  B778: {\r\n    codeString: \"S4:0,8;VL4:2,12\"\r\n  },\r\n  B779: {\r\n    codeString: \"HC4N:0,8;VL4:0,10;VL4:4,10;HL4:0,14;VL2:2,14\"\r\n  },\r\n  B780: {\r\n    codeString: \"B395;P4W:4,8\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B781: {\r\n    codeString: \"R84:0,10;RA4E:0,10;RA4W:6,10\"\r\n  },\r\n  B782: {\r\n    codeString: \"RT4E:0,10;S4:2,10;RT4W:6,10\"\r\n  },\r\n  B783: {\r\n    codeString: \"LARRHC8NC:0,8;LARRHC8SC:2,12\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B784: {\r\n    codeString: \"B450;B428:4,0\"\r\n  },\r\n  B785: {\r\n    codeString: \"ARR4NW:0,8;ARR4SW:0,12;B428:4,0\"\r\n  },\r\n  B786: {\r\n    codeString: \"B374;B457:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B787: {\r\n    codeString: \"DL4S:0,8;DL4N:5,8;VL4:4,12;VL4:5,12\"\r\n  },\r\n  B788: {\r\n    codeString: \"B630;P4S:2,5\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B789: {\r\n    codeString: \"OS4N:0,12;HC4E:4,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B790: {\r\n    codeString: \"OS4N:0,12;DL4N:4,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B791: {\r\n    codeString: \"HL8:0,10;HC4N:2,8\"\r\n  },\r\n  B792: {\r\n    codeString: \"HC4W:0,8;OS8N:2,8;HC4E:10,8\"\r\n  },\r\n  B793: {\r\n    codeString: \"HL2:0,14;R84:2,12;HL2:10,14\"\r\n  },\r\n  B794: {\r\n    codeString: \"B280;P4W:8,7\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B795: {\r\n    codeString: \"B280;P4W:9,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B796: {\r\n    codeString: \"B280:3,0;P4E:0,6\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B797: {\r\n    codeString: \"B695:0,4;B456:8,0\"\r\n  },\r\n  B798: {\r\n    codeString: \"OR84N:0,8;RA4S:0,8;RA4S:4,8\"\r\n  },\r\n  B799: {\r\n    codeString: \"B281;B695:8,4;B281:16,0\"\r\n  },\r\n  B800: {\r\n    codeString: \"HL12:0,12;C8:2,8\"\r\n  },\r\n  B801: {\r\n    codeString: \"HW8W:0,8;HW8E:4,8\"\r\n  },\r\n  B802: {\r\n    codeString: \"B447;B699:3,0\"\r\n  },\r\n  B803: {\r\n    codeString: \"B447;LARR4E:8,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B804: {\r\n    codeString: \"B377;B447\"\r\n  },\r\n  B805: {\r\n    codeString: \"B1130;P4W:8,8\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B806: {\r\n    codeString: \"B1131;P4W:9,15\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B807: {\r\n    codeString: \"B321;QC2SW:8,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B808: {\r\n    codeString: \"B1134;P4W:9,13\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B809: {\r\n    codeString: \"B1133;P4W:9,15\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B810: {\r\n    codeString: \"B123;QC2SW:8,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B811: {\r\n    codeString: \"B566;P4N:2,17\"\r\n  },\r\n  B812: {\r\n    codeString: \"B851;VL2:0,16;VL2:4,16;VL2:8,16\"\r\n  },\r\n  B813: {\r\n    codeString: \"B447;HL4:2,12;AT4N:2,12\"\r\n  },\r\n  B814: {\r\n    codeString: \"R84:0,10;VL4:4,10\"\r\n  },\r\n  B815: {\r\n    codeString: \"B291;B723\"\r\n  },\r\n  B816: {\r\n    codeString: \"B817;B548:8,0;HL8:8,16;VL8:12,8;VL4:16,12\"\r\n  },\r\n  B817: {\r\n    codeString: \"B392;VL8:4,8\"\r\n  },\r\n  B818: {\r\n    codeString: \"B321;VL4:0,8;VL4:8,8\"\r\n  },\r\n  B819: {\r\n    codeString: \"B550;B191:8,0\"\r\n  },\r\n  B820: {\r\n    codeString: \"B803;B451:2,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B821: {\r\n    codeString: \"OR48N:0,8;RA4N:0,6\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B822: {\r\n    codeString: \"B566:3,0;P4E:0,10\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B823: {\r\n    codeString: \"B428;B120:2,0;B428:8,0\"\r\n  },\r\n  B824: {\r\n    codeString: \"R84:0,10\"\r\n  },\r\n  B825: {\r\n    codeString: \"RA4N:0,6;VL8:0,8;HL16:0,16;VL4:4,8;RA8N:4,8;VL4:12,8;RA4N:12,6;VL8:16,8\"\r\n  },\r\n  B826: {\r\n    codeString: \"B447;B206:4,0\"\r\n  },\r\n  B827: {\r\n    codeString: \"C8:0,8;DLIC8N:0,8;DLIC8S:0,8\"\r\n  },\r\n  B828: {\r\n    codeString: \"B447;B829:3,0\"\r\n  },\r\n  B829: {\r\n    codeString: \"VL2:1,10;C2:0,13\"\r\n  },\r\n  B830: {\r\n    codeString: \"HL12:0,12;AA4N:4,12;AA4N:8,12;VL4:12,8;HL2:12,8\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B831: {\r\n    codeString: \"LARR8W:0,10;VL4:8,8\"\r\n  },\r\n  B832: {\r\n    codeString: \"B239;B829:3,0\"\r\n  },\r\n  B833: {\r\n    codeString: \"HC4N:0,10;R84:0,12\"\r\n  },\r\n  B834: {\r\n    codeString: \"B122;B845\"\r\n  },\r\n  B835: {\r\n    codeString: \"B447;B678:2,0\"\r\n  },\r\n  B836: {\r\n    codeString: \"LARRHC8NC:0,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B837: {\r\n    codeString: \"B945;B433:2,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B838: {\r\n    codeString: \"B945;B513:2,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B839: {\r\n    codeString: \"B945;B710:2,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B840: {\r\n    codeString: \"RT8N:0,12\"\r\n  },\r\n  B841: {\r\n    codeString: \"B412;B270:4,0\"\r\n  },\r\n  B842: {\r\n    codeString: \"HC4N:0,8;VL4:0,10;VL4:4,10;HC4S:0,14\"\r\n  },\r\n  B843: {\r\n    codeString: \"B265;HL8:4,14\"\r\n  },\r\n  B844: {\r\n    codeString: \"HL8:0,12;DL4S:0,12\"\r\n  },\r\n  B845: {\r\n    codeString: \"DL2S:0,10;DL2S:2,10;DL2S:4,10\"\r\n  },\r\n  B846: {\r\n    codeString: \"DL8-4N:0,12;HL4:8,12\"\r\n  },\r\n  B847: {\r\n    codeString: \"B695:0,4;B366:4,0\"\r\n  },\r\n  B848: {\r\n    codeString: \"B639;P4S:2,9\"\r\n  },\r\n  B849: {\r\n    codeString: \"HL8:0,12;VL4:2,12;VL4:6,12;HL8:0,16\"\r\n  },\r\n  B850: {\r\n    codeString: \"B391;DL2N:13,7\",\r\n    anchorOffsetX: -3.5\r\n  },\r\n  B851: {\r\n    codeString: \"HC8N:0,12;B695:0,4\"\r\n  },\r\n  B852: {\r\n    codeString: \"B871;P4W:5,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B853: {\r\n    codeString: \"B871;P4W:5,14\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B854: {\r\n    codeString: \"HC8N:0,12\"\r\n  },\r\n  B855: {\r\n    codeString: \"B856;P4W:9,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B856: {\r\n    codeString: \"VL8:4,8;HW8N:0,12;HL8:0,14\"\r\n  },\r\n  B857: {\r\n    codeString: \"VL6:2,8;VL8:4,8;VL6:6,8;HC4S:2,14;B281;C4:2,16\"\r\n  },\r\n  B858: {\r\n    codeString: \"DOT:0,8;DOT:0,12;DOT:0,16;DOT:4,10;DOT:4,14;DOT:8,10;DOT:8,14;B695:6,0\"\r\n  },\r\n  B859: {\r\n    codeString: \"OR84S:0,12;HC8S:0,12\"\r\n  },\r\n  B860: {\r\n    codeString: \"B695;B939\"\r\n  },\r\n  B861: {\r\n    codeString: \"B866;DOT:2,10;DOT:2,12\"\r\n  },\r\n  B862: {\r\n    codeString: \"B527;DOT:6,14;DOT:8,14\"\r\n  },\r\n  B863: {\r\n    codeString: \"B114;B695:2,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B864: {\r\n    codeString: \"R84:0,10;VL4:2,10;VL4:4,10;VL4:6,10\"\r\n  },\r\n  B865: {\r\n    codeString: \"B651;B462:2,0\"\r\n  },\r\n  B866: {\r\n    codeString: \"VL8:0,8;VL8:4,8;C4:0,14\"\r\n  },\r\n  B867: {\r\n    codeString: \"HL4:0,8;B866\"\r\n  },\r\n  B868: {\r\n    codeString: \"B871;P4W:5,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B869: {\r\n    codeString: \"QC4NW:0,12;HL2:4,12;QC4NW:2,12;HL2:0,16\"\r\n  },\r\n  B870: {\r\n    codeString: \"B871;P4W:5,6\",\r\n    anchorOffsetX: -1.5,\r\n    anchorOffsetY: -1\r\n  },\r\n  B871: {\r\n    codeString: \"HL4:0,8;HL4:0,10;HL4:0,12;HL4:0,14;HL4:0,16\"\r\n  },\r\n  B872: {\r\n    codeString: \"VL8:0,8;P4W:1,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B873: {\r\n    codeString: \"B856;P4W:5,8\"\r\n  },\r\n  B874: {\r\n    codeString: \"B871;P4W:5,12\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B875: {\r\n    codeString: \"B573;VL8:4,8\"\r\n  },\r\n  B876: {\r\n    codeString: \"B736;LARR4W:14,10\",\r\n    anchorOffsetX: -5\r\n  },\r\n  B877: {\r\n    codeString: \"B597;B423;B281\"\r\n  },\r\n  B878: {\r\n    codeString: \"OR84N:0,12\"\r\n  },\r\n  B879: {\r\n    codeString: \"B391;P4W:9,14\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B880: {\r\n    codeString: \"HC8W:0,8;HC4E:4,8;HC4E:4,12\"\r\n  },\r\n  B881: {\r\n    codeString: \"B391;P4W:15,8\",\r\n    anchorOffsetX: -4.5\r\n  },\r\n  B882: {\r\n    codeString: \"B1128;P4W:7,10\"\r\n  },\r\n  B883: {\r\n    codeString: \"P4W:0,10;B513:3,0;P4E:8,10\"\r\n  },\r\n  B884: {\r\n    codeString: \"OR84S:0,12;HL4:8,16\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B885: {\r\n    codeString: \"B803;B457:2,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B886: {\r\n    codeString: \"B238;B2115:4,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B887: {\r\n    codeString: \"LARROC8NWC:0,8\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B888: {\r\n    codeString: \"B887;B281:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B889: {\r\n    codeString: \"B1136;P4S:10,13\"\r\n  },\r\n  B890: {\r\n    codeString: \"B695;HW4N:4,11\"\r\n  },\r\n  B891: {\r\n    codeString: \"VL4:0,10;HL4:0,12\"\r\n  },\r\n  B892: {\r\n    codeString: \"HL12:0,12;B700;B700:4,0;B700:8,0\"\r\n  },\r\n  B893: {\r\n    codeString: \"B271:2,0;B281\"\r\n  },\r\n  B894: {\r\n    codeString: \"C4:0,10;VL4:2,10\"\r\n  },\r\n  B895: {\r\n    codeString: \"B635;VL8:12,8\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B896: {\r\n    codeString: \"C8:0,8;B622:3,0\"\r\n  },\r\n  B897: {\r\n    codeString: \"B447;B516\"\r\n  },\r\n  B898: {\r\n    codeString: \"B438;DOT:2,12\"\r\n  },\r\n  B899: {\r\n    codeString: \"R48:0,8;HL4:0,12\"\r\n  },\r\n  B900: {\r\n    codeString: \"B280;P2SW:5,10\"\r\n  },\r\n  B901: {\r\n    codeString: \"B291;B829:3,0\"\r\n  },\r\n  B902: {\r\n    codeString: \"B86;B81:2,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    width: 4,\r\n    name: \"INDICATOR DESCRIPTION OF ACTION\"\r\n  },\r\n  B903: {\r\n    codeString: \"HL2:0,5\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    name: \"INDICATOR CONTINUOUS\"\r\n  },\r\n  B904: {\r\n    codeString: \"DL2N:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR DEFINITE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B905: {\r\n    codeString: \"AT2N:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR FEMININE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B906: {\r\n    codeString: \"VL2:0.5,4;HL1:0,6;DL.5N:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    width: 1,\r\n    name: \"INDICATOR FIRST PERSON\"\r\n  },\r\n  B907: {\r\n    codeString: \"VL1.25:0,4;DOT:0,6\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    width: 0,\r\n    name: \"INDICATOR IMPERATIVE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B908: {\r\n    codeString: \"DL2S:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR INDEFINITE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B909: {\r\n    codeString: \"VL2:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    width: 0,\r\n    name: \"INDICATOR NEUTER\"\r\n  },\r\n  // Not planned for Unicode\r\n  B910: {\r\n    codeString: \"P2E:0,4;VL2:2,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR DIRECT OBJECT\"\r\n  },\r\n  B911: {\r\n    codeString: \"B92;B86:1.5,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    width: 3.5,\r\n    name: \"INDICATOR PAST PARTICIPLE\"\r\n  },\r\n  B912: {\r\n    codeString: \"B92;B270:1.5,-8\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    width: 1.5,\r\n    name: \"INDICATOR PAST PERFECTIVE PARTICIPLE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B913: {\r\n    codeString: \"SC2:0,4\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR POSSESSIVE\"\r\n  },\r\n  B914: {\r\n    codeString: \"B928;B86:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'adjectival',\r\n    width: 5,\r\n    name: \"INDICATOR PRESENT PARTICIPLE\"\r\n  },\r\n  // Not planned for Unicode\r\n  B915: {\r\n    codeString: \"HC1N:0,4;DL1-1.5N:0,4.5;HL1:0,6\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    width: 1,\r\n    name: \"INDICATOR SECOND PERSON\"\r\n  },\r\n  // Not planned for Unicode\r\n  B916: {\r\n    codeString: \"OC1SW:0,4;OC1NW:0,5\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    width: 1,\r\n    name: \"INDICATOR THIRD PERSON\"\r\n  },\r\n  B917: {\r\n    codeString: \"B239;LARR4E:8,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B918: {\r\n    codeString: \"B239;HC2E:8,12\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B919: {\r\n    codeString: \"QC4SW:0,12\"\r\n  },\r\n  B920: {\r\n    codeString: \"B239;B271:2,0\"\r\n  },\r\n  B921: {\r\n    codeString: \"HL8:0,12;C4:2,10\"\r\n  },\r\n  B922: {\r\n    codeString: \"HW2E:0,11;HW4E:1,10;HW8E:1,8\"\r\n  },\r\n  B923: {\r\n    codeString: \"P4S:0,9;B619:1,0\",\r\n    anchorOffsetX: 0.5\r\n  },\r\n  B924: {\r\n    codeString: \"B695;B325:2,0\"\r\n  },\r\n  B925: {\r\n    codeString: \"C2:0,8;C8:1,8;C2:8,8;DOT:3,12;DOT:7,12;DOT:5,14\"\r\n  },\r\n  B926: {\r\n    codeString: \"LARRHC8NCC:0,12\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B927: {\r\n    codeString: \"B936;HL4:0,12\"\r\n  },\r\n  B928: {\r\n    codeString: \"B92;B87:1.5,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'verbal',\r\n    name: \"INDICATOR PRESENT\"\r\n  },\r\n  B929: {\r\n    codeString: \"B335;B651:8,0\",\r\n    anchorOffsetX: 4\r\n  },\r\n  B930: {\r\n    codeString: \"B447;B319:3,0\"\r\n  },\r\n  B931: {\r\n    codeString: \"B447;B303:2,0\"\r\n  },\r\n  B932: {\r\n    codeString: \"B447;B660\"\r\n  },\r\n  B933: {\r\n    codeString: \"HL4:0,12;DL4S:4,12\"\r\n  },\r\n  B934: {\r\n    codeString: \"DC8:0,8;VL4:0,12;VL4:8,12\"\r\n  },\r\n  B935: {\r\n    codeString: \"B335;B392:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B936: {\r\n    codeString: \"HL4:0,8;VL8:2,8;HL4:0,16\"\r\n  },\r\n  B937: {\r\n    codeString: \"B368:0,-4;HL4:0,12\"\r\n  },\r\n  B938: {\r\n    codeString: \"B447;B2115:4,0\"\r\n  },\r\n  B939: {\r\n    codeString: \"DL8N:0,8\"\r\n  },\r\n  B940: {\r\n    codeString: \"B335;VL2:8,8;VL2:8,14\"\r\n  },\r\n  B941: {\r\n    codeString: \"LARR4W:0,10;LARR4N:4,6;LARR4S:4,14;LARR4E:8,10\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B942: {\r\n    codeString: \"C4:0,12;HC8N:2,8;C4:8,12\"\r\n  },\r\n  B943: {\r\n    codeString: \"B335;VL2:4,8;VL2:4,14\"\r\n  },\r\n  B944: {\r\n    codeString: \"B239;LARRHC8NC:4,10\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B945: {\r\n    codeString: \"B597;B894:2,-6\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B946: {\r\n    codeString: \"VL4:0,10;VL4:8,10\"\r\n  },\r\n  B947: {\r\n    codeString: \"B239;HL8:0,12\"\r\n  },\r\n  B948: {\r\n    codeString: \"B412;B335:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B949: {\r\n    codeString: \"B239;B678:2,0\"\r\n  },\r\n  B950: {\r\n    codeString: \"S8:0,8;VL8:2,8;VL8:4,8;VL8:6,8;HL8:0,10;HL8:0,12;HL8:0,14\"\r\n  },\r\n  B951: {\r\n    codeString: \"B10:0,-4;DL4-8N:2,8;B11:6,0\"\r\n  },\r\n  B952: {\r\n    codeString: \"HL4:0,8;HL4:0,16\"\r\n  },\r\n  B953: {\r\n    codeString: \"HL4:0,16;B120:0,2\"\r\n  },\r\n  B954: {\r\n    codeString: \"B447;B401:3,0;B401:5,0\"\r\n  },\r\n  B955: {\r\n    codeString: \"B447;B401:4,0\"\r\n  },\r\n  B956: {\r\n    codeString: \"HL4:0,12;VL4:2,12;HL4:0,16\"\r\n  },\r\n  B957: {\r\n    codeString: \"HL4:0,12;HL4:0,16\"\r\n  },\r\n  B958: {\r\n    codeString: \"W8W:0,8;VL8:1,8\"\r\n  },\r\n  B959: {\r\n    codeString: \"B281;B107\"\r\n  },\r\n  B960: {\r\n    codeString: \"B447;B653\"\r\n  },\r\n  B961: {\r\n    codeString: \"B803;LARR4E:8,14\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B962: {\r\n    codeString: \"B10:0,-4;DL4-8N:2,8;B13:6,0\"\r\n  },\r\n  B963: {\r\n    codeString: \"B428;B428:4,0\"\r\n  },\r\n  B964: {\r\n    codeString: \"B447;B10:1,0;VL8:4,8\"\r\n  },\r\n  B965: {\r\n    codeString: \"VL4:0,10;HL4:0,12;VL4:4,10\"\r\n  },\r\n  B966: {\r\n    codeString: \"B695;DOT:6,10;DOT:6,14;DOT:10,10;DOT:10,14;DOT:14,8;DOT:14,12;DOT:14,16\"\r\n  },\r\n  B967: {\r\n    codeString: \"B377;HC4N:0,10\"\r\n  },\r\n  B968: {\r\n    codeString: \"HL4:0,8;B368:0,-4\"\r\n  },\r\n  B969: {\r\n    codeString: \"B484;B303:2,0\"\r\n  },\r\n  B970: {\r\n    codeString: \"B313;B457:2,0\"\r\n  },\r\n  B971: {\r\n    codeString: \"B411;B457:2,0\"\r\n  },\r\n  B972: {\r\n    codeString: \"XA;XB:3.87;XC:7.75\"\r\n  },\r\n  B973: {\r\n    codeString: \"B651;LARR4S:0,14\"\r\n  },\r\n  B974: {\r\n    codeString: \"B700;B1154\"\r\n  },\r\n  B975: {\r\n    codeString: \"B291;B313\"\r\n  },\r\n  B976: {\r\n    codeString: \"B145;B291:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B977: {\r\n    codeString: \"B291;B678:2,-4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B978: {\r\n    codeString: \"B163;HC2N:1,13;HC2N:5,13\"\r\n  },\r\n  B979: {\r\n    codeString: \"P4W:0,10;B288:3,0;P4E:8,10\"\r\n  },\r\n  B980: {\r\n    codeString: \"B651;P4W:5,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B981: {\r\n    codeString: \"P4W:0,10;B982:3,0;P4E:12,10\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B982: {\r\n    codeString: \"B814;HW2N:3,8.5;HW4N:2,7;HW2S:3,15;HW4S:2,16\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B983: {\r\n    codeString: \"DL8-4N:0,8;DL8-4S:0,8;VL2:4,10\"\r\n  },\r\n  B984: {\r\n    codeString: \"P4E:0,10;B651:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B985: {\r\n    codeString: \"B447;B894:2,0\"\r\n  },\r\n  B986: {\r\n    codeString: \"P4S:0,7;B651\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B987: {\r\n    codeString: \"B428;B288:2,0;B428:8,0\"\r\n  },\r\n  B988: {\r\n    codeString: \"RA4SW:0,12;DL8N:0,8;RA4NE:4,8\"\r\n  },\r\n  B989: {\r\n    codeString: \"LARRHC8SCC:2,12;P4N:0,12\"\r\n  },\r\n  B990: {\r\n    codeString: \"B651;P4N:0,15\"\r\n  },\r\n  B991: {\r\n    codeString: \"B447;B288:2,0\"\r\n  },\r\n  // Not planned for Unicode\r\n  B992: {\r\n    codeString: \"HL2:0,4;VL2:1,4;HL2:0,6\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR DIMINUTIVE\"\r\n  },\r\n  B993: {\r\n    codeString: \"HW8W:0,8;HL4:2,8;HL4:2,16;HW8E:6,8;DOT:4,12\"\r\n  },\r\n  B994: {\r\n    codeString: \"B270;B1028:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B995: {\r\n    codeString: \"W8E:0,4;B122:1,0\",\r\n    anchorOffsetX: 0.5,\r\n    anchorOffsetY: -4\r\n  },\r\n  B996: {\r\n    codeString: \"VL4:0,10;DOT:2,16;DOT:4,16;DOT:6,16;P4E:8,10\"\r\n  },\r\n  B997: {\r\n    codeString: \"B238;B449:2,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B998: {\r\n    codeString: \"B148:2,0;B281\"\r\n  },\r\n  B999: {\r\n    codeString: \"B216;C8:4,8\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B1000: {\r\n    codeString: \"B939;B303:1,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1001: {\r\n    codeString: \"B153;B335:4,0\"\r\n  },\r\n  B1002: {\r\n    codeString: \"B172;HL4:2,16;DOT:8,16\"\r\n  },\r\n  B1003: {\r\n    codeString: \"B174;P4W:3,6\",\r\n    anchorOffsetX: -0.5,\r\n    anchorOffsetY: -2\r\n  },\r\n  B1004: {\r\n    codeString: \"P4S:3,9;B180;P4N:3,17\"\r\n  },\r\n  B1005: {\r\n    codeString: \"P4E:0,10;B518:3,0;P4W:4,10\",\r\n    anchorOffsetX: -0.5\r\n  },\r\n  B1006: {\r\n    codeString: \"B291;B651:2,0\"\r\n  },\r\n  B1007: {\r\n    codeString: \"P4W:0,10;B394:2,0;P4E:10,10\"\r\n  },\r\n  B1008: {\r\n    codeString: \"B335;B651:8,0;B145:12,0\"\r\n  },\r\n  B1009: {\r\n    codeString: \"B239:0,-4\"\r\n  },\r\n  B1010: {\r\n    codeString: \"B239:0,4\"\r\n  },\r\n  B1011: {\r\n    codeString: \"B1094;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1012: {\r\n    codeString: \"B447;B120:2,0\"\r\n  },\r\n  B1013: {\r\n    codeString: \"B447;B449:2,0\"\r\n  },\r\n  B1014: {\r\n    codeString: \"B710;B710:4,0\"\r\n  },\r\n  B1015: {\r\n    codeString: \"B433;B433:4,0\"\r\n  },\r\n  B1016: {\r\n    codeString: \"C4:0,8;DLOC4SE:0,8;SC4:0,8;DL4S:4,12;B555:4,0\"\r\n  },\r\n  B1017: {\r\n    codeString: \"B278:2,0;B939\"\r\n  },\r\n  B1018: {\r\n    codeString: \"B153;B145:4,0\"\r\n  },\r\n  B1019: {\r\n    codeString: \"B335;B1063:8,0\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B1020: {\r\n    codeString: \"VL8:0,8;P4S:0,14;VL8:4,8\"\r\n  },\r\n  B1021: {\r\n    codeString: \"B236;B939:6,0\",\r\n    anchorOffsetX: 3\r\n  },\r\n  B1022: {\r\n    codeString: \"B428;B449:2,0;B428:8,0\"\r\n  },\r\n  B1023: {\r\n    codeString: \"DL2-4N:0,8;DL2-4S:2,8;DL2-4S:0,12;DL2-4N:2,12\"\r\n  },\r\n  B1024: {\r\n    codeString: \"B590:2,0;B281\"\r\n  },\r\n  B1025: {\r\n    codeString: \"VL8:0,8;B829:3,0;VL8:8,8\"\r\n  },\r\n  B1026: {\r\n    codeString: \"B712;B829:3,0\"\r\n  },\r\n  B1027: {\r\n    codeString: \"B505;B939\"\r\n  },\r\n  B1028: {\r\n    codeString: \"AA4S:0,12\"\r\n  },\r\n  B1029: {\r\n    codeString: \"B920;P4N:2,8\"\r\n  },\r\n  B1030: {\r\n    codeString: \"B319:3,0;B939\"\r\n  },\r\n  B1031: {\r\n    codeString: \"P4S:0,7;B303;P4N:0,15\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B1032: {\r\n    codeString: \"B303;P4N:0,15\"\r\n  },\r\n  B1033: {\r\n    codeString: \"VL4:0,10;DOT:2,16;DOT:4,16;DOT:6,16;VL4:8,10\"\r\n  },\r\n  B1034: {\r\n    codeString: \"P4E:0,10;B428:2,0;DOT:4,16;DOT:6,16;DOT:8,16;B428:10,0;P4W:10,10\"\r\n  },\r\n  B1035: {\r\n    codeString: \"P4E:0,10;B428:2,0;B428:10,0;P4W:10,10\"\r\n  },\r\n  B1036: {\r\n    codeString: \"B695:0,4;B239\"\r\n  },\r\n  B1037: {\r\n    codeString: \"B325;P4W:5,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1038: {\r\n    codeString: \"B428;LARRQC4NEC:0,12;B634:0,4\"\r\n  },\r\n  B1039: {\r\n    codeString: \"B695;B651:6,0\"\r\n  },\r\n  B1040: {\r\n    codeString: \"B597;B271:2,0\"\r\n  },\r\n  B1041: {\r\n    codeString: \"QC4NW:2,8;AT4S:0,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1042: {\r\n    codeString: \"B341;B699:2,0\"\r\n  },\r\n  B1043: {\r\n    codeString: \"B238;B120:2,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1044: {\r\n    codeString: \"B281;B651:2,4\"\r\n  },\r\n  B1045: {\r\n    codeString: \"B391;P4E:7,7\",\r\n    anchorOffsetX: -3,\r\n    anchorOffsetY: -1\r\n  },\r\n  B1046: {\r\n    codeString: \"P4E:0,10;B391:3,0\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1047: {\r\n    codeString: \"B399;P4W:17,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1048: {\r\n    codeString: \"B247;B699:3,1\"\r\n  },\r\n  B1049: {\r\n    codeString: \"VL4:0,12;HC8S:0,12;VL4:8,12\"\r\n  },\r\n  B1050: {\r\n    codeString: \"B548;B341:2,0;B699:3,0\"\r\n  },\r\n  B1051: {\r\n    codeString: \"HL4:0,8;VL8:4,8\"\r\n  },\r\n  B1052: {\r\n    codeString: \"B418;P4W:7,10;P4S:10,13\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B1053: {\r\n    codeString: \"B428;DOT:2,16;DOT:4,16;DOT:6,16;B428:8,0\"\r\n  },\r\n  B1054: {\r\n    codeString: \"B1127;P4W:9,4\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B1055: {\r\n    codeString: \"B335;B329:8,0;B145:12,0\"\r\n  },\r\n  B1056: {\r\n    codeString: \"C8:0,8;DOT:2,12;DOT:6,12;HW4N:0,11;HW4S:0,12;HW4N:4,11;HW4S:4,12\"\r\n  },\r\n  B1057: {\r\n    codeString: \"B335;B145:10,0\"\r\n  },\r\n  B1058: {\r\n    codeString: \"B1057:0,-2;B1066:0,2\"\r\n  },\r\n  B1059: {\r\n    codeString: \"B444:2,0;B708\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1060: {\r\n    codeString: \"VL4:0,10;VL4:4,10\"\r\n  },\r\n  B1061: {\r\n    codeString: \"B423;B335:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B1062: {\r\n    codeString: \"B457:2,0;B939\"\r\n  },\r\n  B1063: {\r\n    codeString: \"B145:0,-4;B145:0,4\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B1064: {\r\n    codeString: \"B171;B678:4,-4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1065: {\r\n    codeString: \"B392;B270:10,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1066: {\r\n    codeString: \"B145;B335:10,0\"\r\n  },\r\n  B1067: {\r\n    codeString: \"HC8N:0,4;B960\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1068: {\r\n    codeString: \"C8:0,8;DLIC8N:0,8;DLIC8S:0,8;VL8:4,8\"\r\n  },\r\n  B1069: {\r\n    codeString: \"B449:0,-2;B120:0,2\"\r\n  },\r\n  B1070: {\r\n    codeString: \"B120:0,2\"\r\n  },\r\n  B1071: {\r\n    codeString: \"B548;B695:0,4\"\r\n  },\r\n  B1072: {\r\n    codeString: \"B548;P4W:9,10\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1073: {\r\n    codeString: \"B651;LARR4E:4,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B1075: {\r\n    codeString: \"C8:0,8;DOT:4,12\"\r\n  },\r\n  B1076: {\r\n    codeString: \"B784;B447\"\r\n  },\r\n  B1077: {\r\n    codeString: \"B517;B335:0,4\"\r\n  },\r\n  B1078: {\r\n    codeString: \"HL4:0,8;VL8:0,8\"\r\n  },\r\n  B1079: {\r\n    codeString: \"B392;B939\"\r\n  },\r\n  B1080: {\r\n    codeString: \"VL4:0,12;P4S:0,14;VL4:4,12\"\r\n  },\r\n  B1081: {\r\n    codeString: \"VL4:0,12;HL4:0,16;VL4:2,12;VL4:4,12\"\r\n  },\r\n  B1082: {\r\n    codeString: \"B708;B148:2,0\"\r\n  },\r\n  B1083: {\r\n    codeString: \"B517;B1084\"\r\n  },\r\n  B1084: {\r\n    codeString: \"HL8:0,16;QC4SE:8,12\"\r\n  },\r\n  B1085: {\r\n    codeString: \"B457:0,2;HL8:2,16;B319:9,0\"\r\n  },\r\n  B1086: {\r\n    codeString: \"B457:0,2;HL10:2,16;VL4:8,12;B319:9,0;VL4:12,12\"\r\n  },\r\n  B1087: {\r\n    codeString: \"HW8W:0,8;VL12:2,8;HL4:0,12;HW8E:2,8\"\r\n  },\r\n  B1088: {\r\n    codeString: \"AA4N:0,8;B651:0,2\"\r\n  },\r\n  B1089: {\r\n    codeString: \"B612;B939:6,0\"\r\n  },\r\n  B1090: {\r\n    codeString: \"OC4NE:0,8;OC4NE:2,10;OC4NE:4,12\"\r\n  },\r\n  B1091: {\r\n    codeString: \"B457;LARRQC4NEC:4,12\",\r\n    anchorOffsetX: -3\r\n  },\r\n  B1092: {\r\n    codeString: \"B615;B148:6,0\"\r\n  },\r\n  B1093: {\r\n    codeString: \"B615;B263:6,0\"\r\n  },\r\n  B1094: {\r\n    codeString: \"DS8:0,8\"\r\n  },\r\n  B1095: {\r\n    codeString: \"B651;B695:2,0\"\r\n  },\r\n  B1096: {\r\n    codeString: \"P4E:0,10;B428:2,0;B428:6,0;P4W:6,10\"\r\n  },\r\n  B1097: {\r\n    codeString: \"B695:0,-4;B695;B695:0,4\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B1098: {\r\n    codeString: \"B291:0,-4;B700;B700:4,0\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1099: {\r\n    codeString: \"B651:0,-2;B700\"\r\n  },\r\n  B1100: {\r\n    codeString: \"B666;B939\"\r\n  },\r\n  B1101: {\r\n    codeString: \"LARRHC8EC:0,8\"\r\n  },\r\n  B1102: {\r\n    codeString: \"B676:0,4\"\r\n  },\r\n  B1103: {\r\n    codeString: \"B335;B412:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B1104: {\r\n    codeString: \"B428;LARRQC4NECC:0,10;B634:0,4\"\r\n  },\r\n  B1105: {\r\n    codeString: \"S8:0,8;DC8:0,8;SC8:0,8\"\r\n  },\r\n  B1106: {\r\n    codeString: \"QC4NW:0,12;QC4SE:0,12;B127:4,0\",\r\n    anchorOffsetX: 2\r\n  },\r\n  B1107: {\r\n    codeString: \"B281;B695\"\r\n  },\r\n  B1108: {\r\n    codeString: \"B428;P4W:0,10;P4E:6,10;B428:8,0\"\r\n  },\r\n  B1109: {\r\n    codeString: \"B239;DL4N:8,8\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B1110: {\r\n    codeString: \"B710;P4W:4,12\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1111: {\r\n    codeString: \"B430;P4W:9,8\",\r\n    anchorOffsetX: -1.5\r\n  },\r\n  B1112: {\r\n    codeString: \"B710;B548:2,0;B710:8,0\"\r\n  },\r\n  B1113: {\r\n    codeString: \"B433;B548:2,0;B433:8,0\"\r\n  },\r\n  B1114: {\r\n    codeString: \"B1112;B622:5,0\"\r\n  },\r\n  B1115: {\r\n    codeString: \"B1113;B622:5,0\"\r\n  },\r\n  B1116: {\r\n    codeString: \"HL4:0,10;HL4:0,12;HL4:0,14\"\r\n  },\r\n  B1117: {\r\n    codeString: \"B695:0,4\"\r\n  },\r\n  B1118: {\r\n    codeString: \"B423;B281\"\r\n  },\r\n  B1119: {\r\n    codeString: \"B281;QC4SE:0,16\"\r\n  },\r\n  B1120: {\r\n    codeString: \"B616;B500:10,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B1121: {\r\n    codeString: \"AT4S:0,12\"\r\n  },\r\n  B1122: {\r\n    codeString: \"QC4NW:0,12;QC4SE:4,8\"\r\n  },\r\n  B1123: {\r\n    codeString: \"B291;B145:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B1124: {\r\n    codeString: \"B291;B271:2,-4\",\r\n    anchorOffsetY: -4\r\n  },\r\n  B1125: {\r\n    codeString: \"B291;B678:2,4\"\r\n  },\r\n  B1126: {\r\n    codeString: \"DL2S:0,8;DL2N:0,10;DL2S:0,12;DL2N:0,14\"\r\n  },\r\n  B1127: {\r\n    codeString: \"B171;B371:3.5,-4\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B1128: {\r\n    codeString: \"B171;DOT:6,12\"\r\n  },\r\n  B1129: {\r\n    codeString: \"B171;B371:3.5,6\"\r\n  },\r\n  B1130: {\r\n    codeString: \"B392;HL8:0,12\"\r\n  },\r\n  B1131: {\r\n    codeString: \"B392;VL2:0,16;HL8:0,18;VL2:8,16\"\r\n  },\r\n  B1132: {\r\n    codeString: \"B392;VL4:8,8\"\r\n  },\r\n  B1133: {\r\n    codeString: \"B392;VL2:0,16;VL2:8,16\"\r\n  },\r\n  B1134: {\r\n    codeString: \"B392;HL8:0,14\"\r\n  },\r\n  B1135: {\r\n    codeString: \"B392;HL8:8,16;VL4:16,12\"\r\n  },\r\n  B1136: {\r\n    codeString: \"B392;B281:8,0;B392:16,0\"\r\n  },\r\n  B1137: {\r\n    codeString: \"B325:2,0;B483\"\r\n  },\r\n  B1138: {\r\n    codeString: \"B303;HL4:0,8\"\r\n  },\r\n  B1139: {\r\n    codeString: \"B306;B371:1.5,6\"\r\n  },\r\n  B1140: {\r\n    codeString: \"B306;DOT:7,12\"\r\n  },\r\n  B1141: {\r\n    codeString: \"B371:1.5,0;B122\"\r\n  },\r\n  B1142: {\r\n    codeString: \"B376;VL2:3,16;VL2:5,16\"\r\n  },\r\n  B1143: {\r\n    codeString: \"B376;B371:1.5,-4\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B1144: {\r\n    codeString: \"RT8SW:0,8;B281:8,0;B456:16,0\"\r\n  },\r\n  B1145: {\r\n    codeString: \"B171;B271:4,4\"\r\n  },\r\n  B1146: {\r\n    codeString: \"P4S:0,10\"\r\n  },\r\n  B1147: {\r\n    codeString: \"RA2S:0,11\"\r\n  },\r\n  B1148: {\r\n    codeString: \"HL16:0,16;B202:8,0\"\r\n  },\r\n  B1149: {\r\n    codeString: \"B202;P4W:8,7\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1150: {\r\n    codeString: \"B281;B392:8,0\"\r\n  },\r\n  B1151: {\r\n    codeString: \"B10:0,-4;DL4-8N:2,8;B12:6,0\"\r\n  },\r\n  B1152: {\r\n    codeString: \"B11:0,-4;DL4-8N:2,8;B12:6,0\"\r\n  },\r\n  B1153: {\r\n    codeString: \"B12:0,-4;DL4-8N:2,8;B13:6,0\"\r\n  },\r\n  B1154: {\r\n    codeString: \"HL4:0,16\"\r\n  },\r\n  B1155: {\r\n    codeString: \"B859;P4S:2,9\"\r\n  },\r\n  B1156: {\r\n    codeString: \"B636;P3NE:3,10\"\r\n  },\r\n  B1157: {\r\n    codeString: \"B636;P3NW:2,10\"\r\n  },\r\n  B1158: {\r\n    codeString: \"B636;P3SE:3,11\"\r\n  },\r\n  B1159: {\r\n    codeString: \"B636;P3SW:2,11\"\r\n  },\r\n  B1160: {\r\n    codeString: \"B376;P4S:2,5\",\r\n    anchorOffsetY: -3\r\n  },\r\n  B1161: {\r\n    codeString: \"B303;B1154\"\r\n  },\r\n  B1162: {\r\n    codeString: \"HL4:0,12;VL4:4,12;B335:4,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B1163: {\r\n    codeString: \"LARR4W:0,10;LARR4E:4,10\"\r\n  },\r\n  B1218: {\r\n    codeString: \"B335;B428:10,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B1470: {\r\n    codeString: \"B513;B513:6,0\"\r\n  },\r\n  B1525: {\r\n    codeString: \"B428;B335:2,0\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B1999: {\r\n    codeString: \"VL2:2,6;R48:0,8;VL2:2,16\",\r\n    anchorOffsetY: -2\r\n  },\r\n  B2115: {\r\n    codeString: \"VL8:0,8;B11:2,0\"\r\n  },\r\n  B2343: {\r\n    codeString: \"B10;VL8:4,8\"\r\n  },\r\n  B5061: {\r\n    codeString: \"B335;B335:10,0\"\r\n  },\r\n  B5640: {\r\n    codeString: \"B335;B940:10,0\"\r\n  },\r\n  B5836: {\r\n    codeString: \"B428;B109:2,0\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B5837: {\r\n    codeString: \"HC4N:0,8\"\r\n  },\r\n  B5838: {\r\n    codeString: \"B5840:0,-1;B5840:0,3;B5840:4,-1;B5840:4,3\"\r\n  },\r\n  B5839: {\r\n    codeString: \"B171;P4S:6,13\"\r\n  },\r\n  B5840: {\r\n    codeString: \"C2:0,11\"\r\n  },\r\n  B5841: {\r\n    codeString: \"B572;B191\"\r\n  },\r\n  B5842: {\r\n    codeString: \"B629;B366:4,0\"\r\n  },\r\n  B5843: {\r\n    codeString: \"B5844;VL6:3,8\"\r\n  },\r\n  B5844: {\r\n    codeString: \"B106;B314:2,0\"\r\n  },\r\n  B5995: {\r\n    codeString: \"B457;P4S:0,7\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B5996: {\r\n    codeString: \"B99;B904:3,0\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    width: 5,\r\n    name: \"INDICATOR DEFINITE PLURAL\"\r\n  },\r\n  B5997: {\r\n    codeString: \"B97;B904:3,0\",\r\n    isIndicator: true,\r\n    semanticIndicator: 'thing',\r\n    indicatorRole: 'nominal',\r\n    width: 5,\r\n    name: \"INDICATOR DEFINITE THING\"\r\n  },\r\n  B5998: {\r\n    codeString: \"B97;B5996:3,0\",\r\n    isIndicator: true,\r\n    semanticIndicator: 'thing',\r\n    indicatorRole: 'nominal',\r\n    width: 8,\r\n    name: \"INDICATOR DEFINITE PLURAL THING\"\r\n  },\r\n  B5999: {\r\n    codeString: \"B956:0,2\"\r\n  },\r\n  B6000: {\r\n    codeString: \"B314:0,2\"\r\n  },\r\n  B6001: {\r\n    codeString: \"HL4:0,18;VL4:2,14\"\r\n  },\r\n  B6002: {\r\n    codeString: \"B106:0,2\"\r\n  },\r\n  B6003: {\r\n    codeString: \"B657:0,4\",\r\n    anchorOffsetX: -1\r\n  },\r\n  B6013: {\r\n    codeString: \"B696;LARR4E:8,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B6015: {\r\n    codeString: \"B213;LARR4E:8,10\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B6091: { // Temporarily removed from Blissary as its status for inclusion by BCI is unclear. Graphically, it's the opposite of COMPRESSION B1008.\r\n    codeString: \"B145;B651:8,0;B335:12,0\"\r\n  },\r\n  B6106: {\r\n    codeString: \"HW8E:0,8;HL6:0,8;HL6:0,16;HW8W:4,8\"\r\n  },\r\n  B6109: {\r\n    codeString: \"HW8W:0,8;HW8E:2,8\"\r\n  },\r\n  B6168: {\r\n    codeString: \"B303;B651:4,0\"\r\n  },\r\n  B6232: {\r\n    codeString: \"B917;B651:2,0\",\r\n    anchorOffsetX: -2\r\n  },\r\n  B6287: {\r\n    codeString: \"B700;HL8:2,12;HL8:2,16;B700:8,0\"\r\n  },\r\n  B6300: {\r\n    codeString: \"B303;VL2:2,8;VL2:2,14;HL8:2,8;HL8:2,16;VL8:10,8\",\r\n    anchorOffsetX: 1\r\n  },\r\n  B6321: {\r\n    codeString: \"DL1N:0,8;VL4:1,8;DL1N:1,11;B968:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B6393: {\r\n    codeString: \"P4S:0,7;B1116\",\r\n    anchorOffsetY: -1\r\n  },\r\n  B6414: {\r\n    codeString: \"DL8-4N:0,10\"\r\n  },\r\n  B6415: {\r\n    codeString: \"DL8-4S:0,10\"\r\n  },\r\n  B6420: {\r\n    codeString: \"DL4-8N:0,8\"\r\n  },\r\n  B6435: {\r\n    codeString: \"HC8W:0,8;HW8W:2,8;B622:4,0\"\r\n  },\r\n  B6436: {\r\n    codeString: \"HC2N:0,4\",\r\n    isIndicator: true,\r\n    semanticIndicator: 'abstract',\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR ABSTRACT\"\r\n  },\r\n  B6437: {\r\n    codeString: \"B814;B695:6,0\"\r\n  },\r\n  B6438: {\r\n    codeString: \"DL1N:0,8;VL4:1,8;DL1N:1,11;B937:3,0\",\r\n    anchorOffsetX: 1.5\r\n  },\r\n  B6439: {\r\n    codeString: \"P2E:0,4;B910:1.5\",\r\n    isIndicator: true,\r\n    indicatorRole: 'nominal',\r\n    name: \"INDICATOR INDIRECT OBJECT\",\r\n    width: 3.5\r\n  }\r\n}\r\n\r\nexport { glyphData };","/** \r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport * as sc from \"./bliss-shape-creators.js\";\r\nimport { glyphData } from \"./bliss-glyph-data.js\";\r\nimport { alphabetData } from \"../external-font-data/liberation-sans-svg-path-data.js\";\r\n\r\n/**\r\n * Special space glyph codes: TSP and QSP\r\n * These codes have dynamic width calculated by BlissElement.\r\n * DO NOT rename or remove these without updating BlissElement.\r\n */\r\nconst SPACE_GLYPH_CODES = ['TSP', 'QSP'];\r\n\r\nexport function isSpaceGlyph(code) {\r\n  return SPACE_GLYPH_CODES.includes(code);\r\n}\r\n\r\n// Non-shape elements: spacing and anchors\r\nconst nonShapeDefinitions = {\r\n  'ZSA': sc.createZeroSizedAnchor(),\r\n  'TSP': sc.createSpace(6),\r\n  'QSP': sc.createSpace(2),\r\n};\r\n\r\n// Reference glyphs: visual aids for positioning and alignment\r\nconst referenceGlyphDefinitions = {\r\n  'REFSQUARE': { codeString: \"S8:0,8\", glyphCode: 'REFSQUARE', isBlissGlyph: true, defaultOptions: { 'stroke-dasharray': '0 0.999' } },\r\n  'ANCHORRING': { codeString: \"C2:0,4\", glyphCode: 'ANCHORRING', isBlissGlyph: true, isIndicator: true, defaultOptions: { 'stroke-dasharray': '0 0.777' } },\r\n};\r\n\r\n// Shape primitives\r\nconst shapeDefinitions = {\r\n  'DOT': sc.createDot(0.5, 0.333),\r\n  'SDOT': sc.createDot(0.5, 0),\r\n  'COMMA': sc.createComma(0.5, 0.333),\r\n  'H': sc.createHeart(8),\r\n  'E': sc.createEar(8),\r\n  'F': sc.createFiber(8),\r\n  'C8': sc.createCircle(4),\r\n  'C4': sc.createCircle(2),\r\n  'C2': sc.createCircle(1),\r\n  'C1': sc.createCircle(0.5),\r\n  'HC8N': sc.createHalfCircle(4, 'N'),\r\n  'HC4N': sc.createHalfCircle(2, 'N'),\r\n  'HC2N': sc.createHalfCircle(1, 'N'),\r\n  'HC1N': sc.createHalfCircle(0.5, 'N'),\r\n  'HC.5N': sc.createHalfCircle(0.25, 'N'),\r\n  'HC8S': sc.createHalfCircle(4, 'S'),\r\n  'HC4S': sc.createHalfCircle(2, 'S'),\r\n  'HC2S': sc.createHalfCircle(1, 'S'),\r\n  'HC1S': sc.createHalfCircle(0.5, 'S'),\r\n  'HC.5S': sc.createHalfCircle(0.25, 'S'),\r\n  'HC8W': sc.createHalfCircle(4, 'W'),\r\n  'HC4W': sc.createHalfCircle(2, 'W'),\r\n  'HC2W': sc.createHalfCircle(1, 'W'),\r\n  'HC1W': sc.createHalfCircle(0.5, 'W'),\r\n  'HC.5W': sc.createHalfCircle(0.25, 'W'),\r\n  'HC8E': sc.createHalfCircle(4, 'E'),\r\n  'HC4E': sc.createHalfCircle(2, 'E'),\r\n  'HC2E': sc.createHalfCircle(1, 'E'),\r\n  'HC1E': sc.createHalfCircle(0.5, 'E'),\r\n  'HC.5E': sc.createHalfCircle(0.25, 'E'),\r\n  'QC4NW': sc.createQuarterCircle(4, 'NW'),\r\n  'QC2NW': sc.createQuarterCircle(2, 'NW'),\r\n  'QC1NW': sc.createQuarterCircle(1, 'NW'),\r\n  'QC.5NW': sc.createQuarterCircle(0.5, 'NW'),\r\n  'QC4NE': sc.createQuarterCircle(4, 'NE'),\r\n  'QC2NE': sc.createQuarterCircle(2, 'NE'),\r\n  'QC1NE': sc.createQuarterCircle(1, 'NE'),\r\n  'QC.5NE': sc.createQuarterCircle(0.5, 'NE'),\r\n  'QC4SW': sc.createQuarterCircle(4, 'SW'),\r\n  'QC2SW': sc.createQuarterCircle(2, 'SW'),\r\n  'QC1SW': sc.createQuarterCircle(1, 'SW'),\r\n  'QC.5SW': sc.createQuarterCircle(0.5, 'SW'),\r\n  'QC4SE': sc.createQuarterCircle(4, 'SE'),\r\n  'QC2SE': sc.createQuarterCircle(2, 'SE'),\r\n  'QC1SE': sc.createQuarterCircle(1, 'SE'),\r\n  'QC.5SE': sc.createQuarterCircle(0.5, 'SE'),\r\n  'OC8NW': sc.createOpenCircle(4, 'NW'),\r\n  'OC4NW': sc.createOpenCircle(2, 'NW'),\r\n  'OC2NW': sc.createOpenCircle(1, 'NW'),\r\n  'OC1NW': sc.createOpenCircle(0.5, 'NW'),\r\n  'OC8NE': sc.createOpenCircle(4, 'NE'),\r\n  'OC4NE': sc.createOpenCircle(2, 'NE'),\r\n  'OC2NE': sc.createOpenCircle(1, 'NE'),\r\n  'OC1NE': sc.createOpenCircle(0.5, 'NE'),\r\n  'OC8SW': sc.createOpenCircle(4, 'SW'),\r\n  'OC4SW': sc.createOpenCircle(2, 'SW'),\r\n  'OC2SW': sc.createOpenCircle(1, 'SW'),\r\n  'OC1SW': sc.createOpenCircle(0.5, 'SW'),\r\n  'OC8SE': sc.createOpenCircle(4, 'SE'),\r\n  'OC4SE': sc.createOpenCircle(2, 'SE'),\r\n  'OC2SE': sc.createOpenCircle(1, 'SE'),\r\n  'OC1SE': sc.createOpenCircle(0.5, 'SE'),\r\n  'W8N': sc.createWave(8, 'N'),\r\n  'W8S': sc.createWave(8, 'S'),\r\n  'W8W': sc.createWave(8, 'W'),\r\n  'W8E': sc.createWave(8, 'E'),\r\n  'HW8N': sc.createHalfWave(8, 'N'),\r\n  'HW4N': sc.createHalfWave(4, 'N'),\r\n  'HW2N': sc.createHalfWave(2, 'N'),\r\n  'HW8S': sc.createHalfWave(8, 'S'),\r\n  'HW4S': sc.createHalfWave(4, 'S'),\r\n  'HW2S': sc.createHalfWave(2, 'S'),\r\n  'HW8W': sc.createHalfWave(8, 'W'),\r\n  'HW4W': sc.createHalfWave(4, 'W'),\r\n  'HW2W': sc.createHalfWave(2, 'W'),\r\n  'HW8E': sc.createHalfWave(8, 'E'),\r\n  'HW4E': sc.createHalfWave(4, 'E'),\r\n  'HW2E': sc.createHalfWave(2, 'E'),\r\n  'HQW4NW': sc.createHorizontalQuarterWave(4, 'NW'),\r\n  'HQW2NW': sc.createHorizontalQuarterWave(2, 'NW'),\r\n  'HQW1NW': sc.createHorizontalQuarterWave(1, 'NW'),\r\n  'HQW4NE': sc.createHorizontalQuarterWave(4, 'NE'),\r\n  'HQW2NE': sc.createHorizontalQuarterWave(2, 'NE'),\r\n  'HQW1NE': sc.createHorizontalQuarterWave(1, 'NE'),\r\n  'HQW4SW': sc.createHorizontalQuarterWave(4, 'SW'),\r\n  'HQW2SW': sc.createHorizontalQuarterWave(2, 'SW'),\r\n  'HQW1SW': sc.createHorizontalQuarterWave(1, 'SW'),\r\n  'HQW4SE': sc.createHorizontalQuarterWave(4, 'SE'),\r\n  'HQW2SE': sc.createHorizontalQuarterWave(2, 'SE'),\r\n  'HQW1SE': sc.createHorizontalQuarterWave(1, 'SE'),\r\n  'VQW4NW': sc.createVerticalQuarterWave(4, 'NW'),\r\n  'VQW2NW': sc.createVerticalQuarterWave(2, 'NW'),\r\n  'VQW1NW': sc.createVerticalQuarterWave(1, 'NW'),\r\n  'VQW4NE': sc.createVerticalQuarterWave(4, 'NE'),\r\n  'VQW2NE': sc.createVerticalQuarterWave(2, 'NE'),\r\n  'VQW1NE': sc.createVerticalQuarterWave(1, 'NE'),\r\n  'VQW4SW': sc.createVerticalQuarterWave(4, 'SW'),\r\n  'VQW2SW': sc.createVerticalQuarterWave(2, 'SW'),\r\n  'VQW1SW': sc.createVerticalQuarterWave(1, 'SW'),\r\n  'VQW4SE': sc.createVerticalQuarterWave(4, 'SE'),\r\n  'VQW2SE': sc.createVerticalQuarterWave(2, 'SE'),\r\n  'VQW1SE': sc.createVerticalQuarterWave(1, 'SE'),\r\n  'VL12': sc.createVerticalLine(12),\r\n  'VL10': sc.createVerticalLine(10),\r\n  'VL8': sc.createVerticalLine(8),\r\n  'VL6': sc.createVerticalLine(6),\r\n  'VL4': sc.createVerticalLine(4),\r\n  'VL3': sc.createVerticalLine(3),\r\n  'VL2': sc.createVerticalLine(2),\r\n  'VL1.5': sc.createVerticalLine(1.5),\r\n  'VL1.25': sc.createVerticalLine(1.25),\r\n  'VL1': sc.createVerticalLine(1),\r\n  'VL.5': sc.createVerticalLine(0.5),\r\n  'VL.25': sc.createVerticalLine(0.25),\r\n  'HL16': sc.createHorizontalLine(16),\r\n  'HL15': sc.createHorizontalLine(15),\r\n  'HL14': sc.createHorizontalLine(14),\r\n  'HL12': sc.createHorizontalLine(12),\r\n  'HL10': sc.createHorizontalLine(10),\r\n  'HL8': sc.createHorizontalLine(8),\r\n  'HL6': sc.createHorizontalLine(6),\r\n  'HL4': sc.createHorizontalLine(4),\r\n  'HL3': sc.createHorizontalLine(3),\r\n  'HL2': sc.createHorizontalLine(2),\r\n  'HL1.5': sc.createHorizontalLine(1.5),\r\n  'HL1': sc.createHorizontalLine(1),\r\n  'HL.5': sc.createHorizontalLine(0.5),\r\n  'HL.25': sc.createHorizontalLine(0.25),\r\n  'DL12N': sc.createAscendingDiagonalLine(12, 12),\r\n  'DL8N': sc.createAscendingDiagonalLine(8, 8),\r\n  'DL6N': sc.createAscendingDiagonalLine(6, 6),\r\n  'DL5N': sc.createAscendingDiagonalLine(5, 5),\r\n  'DL4N': sc.createAscendingDiagonalLine(4, 4),\r\n  'DL3N': sc.createAscendingDiagonalLine(3, 3),\r\n  'DL2N': sc.createAscendingDiagonalLine(2, 2),\r\n  'DL1.5N': sc.createAscendingDiagonalLine(1.5, 1.5),\r\n  'DL1N': sc.createAscendingDiagonalLine(1, 1),\r\n  \"DL.5N\": sc.createAscendingDiagonalLine(0.5, 0.5),\r\n  'DL2-3N': sc.createAscendingDiagonalLine(2, 3),\r\n  'DL1-1.5N': sc.createAscendingDiagonalLine(1, 1.5),\r\n  'DL3-2N': sc.createAscendingDiagonalLine(3, 2),\r\n  'DL1.5-1N': sc.createAscendingDiagonalLine(1.5, 1),\r\n  'DL4-8N': sc.createAscendingDiagonalLine(4, 8),\r\n  'DL2-4N': sc.createAscendingDiagonalLine(2, 4),\r\n  'DL1-2N': sc.createAscendingDiagonalLine(1, 2),\r\n  'DL.5-1N': sc.createAscendingDiagonalLine(0.5, 1),\r\n  'DL8-4N': sc.createAscendingDiagonalLine(8, 4),\r\n  'DL4-2N': sc.createAscendingDiagonalLine(4, 2),\r\n  'DL2-1N': sc.createAscendingDiagonalLine(2, 1),\r\n  'DL1-.5N': sc.createAscendingDiagonalLine(1, 0.5),\r\n  'DL1-4N': sc.createAscendingDiagonalLine(1, 4),\r\n  'DL.5-2N': sc.createAscendingDiagonalLine(0.5, 2),\r\n  'DL4-1N': sc.createAscendingDiagonalLine(4, 1),\r\n  'DL2-.5N': sc.createAscendingDiagonalLine(2, 0.5),\r\n  'DL12S': sc.createDescendingDiagonalLine(12, 12),\r\n  'DL8S': sc.createDescendingDiagonalLine(8, 8),\r\n  'DL6S': sc.createDescendingDiagonalLine(6, 6),\r\n  'DL5S': sc.createDescendingDiagonalLine(5, 5),\r\n  'DL4S': sc.createDescendingDiagonalLine(4, 4),\r\n  'DL3S': sc.createDescendingDiagonalLine(3, 3),\r\n  'DL2S': sc.createDescendingDiagonalLine(2, 2),\r\n  'DL1.5S': sc.createDescendingDiagonalLine(1.5, 1.5),\r\n  'DL1S': sc.createDescendingDiagonalLine(1, 1),\r\n  'DL.5S': sc.createDescendingDiagonalLine(0.5, 0.5),\r\n  'DL2-3S': sc.createDescendingDiagonalLine(2, 3),\r\n  'DL1-1.5S': sc.createDescendingDiagonalLine(1, 1.5),\r\n  'DL3-2S': sc.createDescendingDiagonalLine(3, 2),\r\n  'DL1.5-1S': sc.createDescendingDiagonalLine(1.5, 1),\r\n  'DL4-8S': sc.createDescendingDiagonalLine(4, 8),\r\n  'DL2-4S': sc.createDescendingDiagonalLine(2, 4),\r\n  'DL1-2S': sc.createDescendingDiagonalLine(1, 2),\r\n  'DL.5-1S': sc.createDescendingDiagonalLine(0.5, 1),\r\n  'DL8-4S': sc.createDescendingDiagonalLine(8, 4),\r\n  'DL4-2S': sc.createDescendingDiagonalLine(4, 2),\r\n  'DL2-1S': sc.createDescendingDiagonalLine(2, 1),\r\n  'DL1-.5S': sc.createDescendingDiagonalLine(1, 0.5),\r\n  'DL1-4S': sc.createDescendingDiagonalLine(1, 4),\r\n  'DL.5-2S': sc.createDescendingDiagonalLine(0.5, 2),\r\n  'DL4-1S': sc.createDescendingDiagonalLine(4, 1),\r\n  'DL2-.5S': sc.createDescendingDiagonalLine(2, 0.5),\r\n  'DLOC8NW': sc.createDiagonalLineOutsideCircle(8, 'NW'),\r\n  'DLOC8NE': sc.createDiagonalLineOutsideCircle(8, 'NE'),\r\n  'DLOC8SW': sc.createDiagonalLineOutsideCircle(8, 'SW'),\r\n  'DLOC8SE': sc.createDiagonalLineOutsideCircle(8, 'SE'),\r\n  'DLOC4NW': sc.createDiagonalLineOutsideCircle(4, 'NW'),\r\n  'DLOC4NE': sc.createDiagonalLineOutsideCircle(4, 'NE'),\r\n  'DLOC4SW': sc.createDiagonalLineOutsideCircle(4, 'SW'),\r\n  'DLOC4SE': sc.createDiagonalLineOutsideCircle(4, 'SE'),\r\n  'DLIC8N': sc.createAscendingDiagonalLineInsideCircle(4),\r\n  'DLIC4N': sc.createAscendingDiagonalLineInsideCircle(2),\r\n  'DLIC8S': sc.createDescendingDiagonalLineInsideCircle(4),\r\n  'DLIC4S': sc.createDescendingDiagonalLineInsideCircle(2),\r\n  'RA8NW': { codeString: \"VL8;HL8\" },\r\n  'RA4NW': { codeString: \"VL4;HL4\" },\r\n  'RA3NW': { codeString: \"VL3;HL3\" },\r\n  'RA2NW': { codeString: \"VL2;HL2\" },\r\n  'RA1.5NW': { codeString: \"VL1.5;HL1.5\" },\r\n  'RA1NW': { codeString: \"VL1;HL1\" },\r\n  'RA8NE': { codeString: \"HL8;VL8:8,0\" },\r\n  'RA4NE': { codeString: \"HL4;VL4:4,0\" },\r\n  'RA3NE': { codeString: \"HL3;VL3:3,0\" },\r\n  'RA2NE': { codeString: \"HL2;VL2:2,0\" },\r\n  'RA1.5NE': { codeString: \"HL1.5;VL1.5:1.5,0\" },\r\n  'RA1NE': { codeString: \"HL1;VL1:1,0\" },\r\n  'RA8SW': { codeString: \"VL8;HL8:0,8\" },\r\n  'RA4SW': { codeString: \"VL4;HL4:0,4\" },\r\n  'RA3SW': { codeString: \"VL3;HL3:0,3\" },\r\n  'RA2SW': { codeString: \"VL2;HL2:0,2\" },\r\n  'RA1.5SW': { codeString: \"VL1.5;HL1.5:0,1.5\" },\r\n  'RA1SW': { codeString: \"VL1;HL1:0,1\" },\r\n  'RA8SE': { codeString: \"HL8:0,8;VL8:8,0\" },\r\n  'RA4SE': { codeString: \"HL4:0,4;VL4:4,0\" },\r\n  'RA3SE': { codeString: \"HL3:0,3;VL3:3,0\" },\r\n  'RA2SE': { codeString: \"HL2:0,2;VL2:2,0\" },\r\n  'RA1.5SE': { codeString: \"HL1.5:0,1.5;VL1.5:1.5,0\" },\r\n  'RA1SE': { codeString: \"HL1:0,1;VL1:1,0\" },\r\n  'RA8N': { codeString: \"DL4N;DL4S:4,0\" },\r\n  'RA4N': { codeString: \"DL2N;DL2S:2,0\" },\r\n  'RA3N': { codeString: \"DL1.5N;DL1.5S:1.5,0\" },\r\n  'RA2N': { codeString: \"DL1N;DL1S:1,0\" },\r\n  'RA1N': { codeString: \"DL.5N;DL.5S:0.5,0\" },\r\n  'RA8S': { codeString: \"DL4S;DL4N:4,0\" },\r\n  'RA4S': { codeString: \"DL2S;DL2N:2,0\" },\r\n  'RA3S': { codeString: \"DL1.5S;DL1.5N:1.5,0\" },\r\n  'RA2S': { codeString: \"DL1S;DL1N:1,0\" },\r\n  'RA1S': { codeString: \"DL.5S;DL.5N:.5,0\" },\r\n  'RA8W': { codeString: \"DL4N;DL4S:0,4\" },\r\n  'RA4W': { codeString: \"DL2N;DL2S:0,2\" },\r\n  'RA3W': { codeString: \"DL1.5N;DL1.5S:0,1.5\" },\r\n  'RA2W': { codeString: \"DL1N;DL1S:0,1\" },\r\n  'RA1W': { codeString: \"DL.5N;DL.5S:0,0.5\" },\r\n  'RA8E': { codeString: \"DL4S;DL4N:0,4\" },\r\n  'RA4E': { codeString: \"DL2S;DL2N:0,2\" },\r\n  'RA3E': { codeString: \"DL1.5S;DL1.5N:0,1.5\" },\r\n  'RA2E': { codeString: \"DL1S;DL1N:0,1\" },\r\n  'RA1E': { codeString: \"DL.5S;DL.5N:0,0.5\" },\r\n  'AA8N': { codeString: \"DL4-8N;DL4-8S:4,0\" },\r\n  'AA4N': { codeString: \"DL2-4N;DL2-4S:2,0\" },\r\n  'AA2N': { codeString: \"DL1-2N;DL1-2S:1,0\" },\r\n  'AA8S': { codeString: \"DL4-8S;DL4-8N:4,0\" },\r\n  'AA4S': { codeString: \"DL2-4S;DL2-4N:2,0\" },\r\n  'AA2S': { codeString: \"DL1-2S;DL1-2N:1,0\" },\r\n  'AA8W': { codeString: \"DL8-4N;DL8-4S:0,4\" },\r\n  'AA4W': { codeString: \"DL4-2N;DL4-2S:0,2\" },\r\n  'AA2W': { codeString: \"DL2-1N;DL2-1S:0,1\" },\r\n  'AA8E': { codeString: \"DL8-4S;DL8-4N:0,4\" },\r\n  'AA4E': { codeString: \"DL4-2S;DL4-2N:0,2\" },\r\n  'AA2E': { codeString: \"DL2-1S;DL2-1N:0,1\" },\r\n  'SC8': { codeString: \"HL8:0,4;VL8:4,0\" },\r\n  'SC4': { codeString: \"HL4:0,2;VL4:2,0\" },\r\n  'SC2': { codeString: \"HL2:0,1;VL2:1,0\" },\r\n  'DC8': { codeString: \"DL8S;DL8N\" },\r\n  'DC4': { codeString: \"DL4S;DL4N\" },\r\n  'DC2': { codeString: \"DL2S;DL2N\" },\r\n  'RT8SW': { codeString: \"VL8;HL8:0,8;DL8S\" },\r\n  'RT4SW': { codeString: \"VL4;HL4:0,4;DL4S\" },\r\n  'RT2SW': { codeString: \"VL2;HL2:0,2;DL2S\" },\r\n  'RT8NW': { codeString: \"VL8;HL8;DL8N\" },\r\n  'RT4NW': { codeString: \"VL4;HL4;DL4N\" },\r\n  'RT2NW': { codeString: \"VL2;HL2;DL2N\" },\r\n  'RT8NE': { codeString: \"HL8;VL8:8,0;DL8S\" },\r\n  'RT4NE': { codeString: \"HL4;VL4:4,0;DL4S\" },\r\n  'RT2NE': { codeString: \"HL2;VL2:2,0;DL2S\" },\r\n  'RT8SE': { codeString: \"HL8:0,8;VL8:8,0;DL8N\" },\r\n  'RT4SE': { codeString: \"HL4:0,4;VL4:4,0;DL4N\" },\r\n  'RT2SE': { codeString: \"HL2:0,2;VL2:2,0;DL2N\" },\r\n  'RT8N': { codeString: \"DL4N;DL4S:4,0;HL8:0,4\" },\r\n  'RT4N': { codeString: \"DL2N;DL2S:2,0;HL4:0,2\" },\r\n  'RT2N': { codeString: \"DL1N;DL1S:1,0;HL2:0,1\" },\r\n  'RT8S': { codeString: \"DL4S;DL4N:4,0;HL8\" },\r\n  'RT4S': { codeString: \"DL2S;DL2N:2,0;HL4\" },\r\n  'RT2S': { codeString: \"DL1S;DL1N:1,0;HL2\" },\r\n  'RT8W': { codeString: \"DL4N;DL4S:0,4;VL8:4,0\" },\r\n  'RT4W': { codeString: \"DL2N;DL2S:0,2;VL4:2,0\" },\r\n  'RT2W': { codeString: \"DL1N;DL1S:0,1;VL2:1,0\" },\r\n  'RT8E': { codeString: \"DL4S;DL4N:0,4;VL8\" },\r\n  'RT4E': { codeString: \"DL2S;DL2N:0,2;VL4\" },\r\n  'RT2E': { codeString: \"DL1S;DL1N:0,1;VL2\" },\r\n  'AT8N': { codeString: \"DL4-8N;DL4-8S:4,0;HL8:0,8\" },\r\n  'AT4N': { codeString: \"DL2-4N;DL2-4S:2,0;HL4:0,4\" },\r\n  'AT2N': { codeString: \"DL1-2N;DL1-2S:1,0;HL2:0,2\" },\r\n  'AT8S': { codeString: \"DL4-8S;DL4-8N:4,0;HL8\" },\r\n  'AT4S': { codeString: \"DL2-4S;DL2-4N:2,0;HL4\" },\r\n  'AT2S': { codeString: \"DL1-2S;DL1-2N:1,0;HL2\" },\r\n  'AT8W': { codeString: \"DL8-4N;DL8-4S:0,4;VL8:8,0\" },\r\n  'AT4W': { codeString: \"DL4-2N;DL4-2S:0,2;VL4:4,0\" },\r\n  'AT2W': { codeString: \"DL2-1N;DL2-1S:0,1;VL2:2,0\" },\r\n  'AT8E': { codeString: \"DL8-4S;DL8-4N:0,4;VL8\" },\r\n  'AT4E': { codeString: \"DL4-2S;DL4-2N:0,2;VL4\" },\r\n  'AT2E': { codeString: \"DL2-1S;DL2-1N:0,1;VL2\" },\r\n  'S8': { codeString: \"HL8;HL8:0,8;VL8;VL8:8,0\" },\r\n  'S4': { codeString: \"HL4;HL4:0,4;VL4;VL4:4,0\" },\r\n  'S2': { codeString: \"HL2;HL2:0,2;VL2;VL2:2,0\" },\r\n  'DS8': { codeString: \"DL4N;DL4S:4,0;DL4S:0,4;DL4N:4,4\" },\r\n  'DS4': { codeString: \"DL2N;DL2S:2,0;DL2S:0,2;DL2N:2,2\" },\r\n  'DS2': { codeString: \"DL1N;DL1S:1,0;DL1S:0,1;DL1N:1,1\" },\r\n  'OS8N': { codeString: \"VL8;HL8:0,8;VL8:8,0\" },\r\n  'OS4N': { codeString: \"VL4;HL4:0,4;VL4:4,0\" },\r\n  'OS2N': { codeString: \"VL2;HL2:0,2;VL2:2,0\" },\r\n  'OS8S': { codeString: \"VL8;HL8;VL8:8,0\" },\r\n  'OS4S': { codeString: \"VL4;HL4;VL4:4,0\" },\r\n  'OS2S': { codeString: \"VL2;HL2;VL2:2,0\" },\r\n  'OS8W': { codeString: \"HL8;HL8:0,8;VL8:8,0\" },\r\n  'OS4W': { codeString: \"HL4;HL4:0,4;VL4:4,0\" },\r\n  'OS2W': { codeString: \"HL2;HL2:0,2;VL2:2,0\" },\r\n  'OS8E': { codeString: \"VL8;HL8;HL8:0,8\" },\r\n  'OS4E': { codeString: \"VL4;HL4;HL4:0,4\" },\r\n  'OS2E': { codeString: \"VL2;HL2;HL2:0,2\" },\r\n  'R84': { codeString: \"HL8;HL8:0,4;VL4;VL4:8,0\" },\r\n  'R42': { codeString: \"HL4;HL4:0,2;VL2;VL2:4,0\" },\r\n  'R48': { codeString: \"HL4;HL4:0,8;VL8;VL8:4,0\" },\r\n  'R24': { codeString: \"HL2;HL2:0,4;VL4;VL4:2,0\" },\r\n  'OR84N': { codeString: \"VL4;HL8:0,4;VL4:8,0\" },\r\n  'OR42N': { codeString: \"VL2;HL4:0,2;VL2:4,0\" },\r\n  'OR84S': { codeString: \"VL4;HL8;VL4:8,0\" },\r\n  'OR42S': { codeString: \"VL2;HL4;VL2:4,0\" },\r\n  'OR84W': { codeString: \"HL8;HL8:0,4;VL4:8,0\" },\r\n  'OR42W': { codeString: \"HL4;HL4:0,2;VL2:4,0\" },\r\n  'OR84E': { codeString: \"VL4;HL8;HL8:0,4\" },\r\n  'OR42E': { codeString: \"VL2;HL4;HL4:0,2\" },\r\n  'OR48N': { codeString: \"VL8;HL4:0,8;VL8:4,0\" },\r\n  'OR24N': { codeString: \"VL4;HL2:0,4;VL4:2,0\" },\r\n  'OR48S': { codeString: \"VL8;HL4;VL8:4,0\" },\r\n  'OR24S': { codeString: \"VL4;HL2;VL4:2,0\" },\r\n  'OR48W': { codeString: \"HL4;HL4:0,8;VL8:4,0\" },\r\n  'OR24W': { codeString: \"HL2;HL2:0,4;VL4:2,0\" },\r\n  'OR48E': { codeString: \"VL8;HL4;HL4:0,8\" },\r\n  'OR24E': { codeString: \"VL4;HL2;HL2:0,4\" },\r\n  'LARR8W': { codeString: \"P4W;HL8:0,2\" },\r\n  'ARR8W': { codeString: \"P3W;HL8:0,1.5\" },\r\n  'LARR4W': { codeString: \"P4W;HL4:0,2\" },\r\n  'ARR4W': { codeString: \"P3W;HL3:0,1.5\" },\r\n  'LARR8E': { codeString: \"HL8:0,2;P4E:6,0\" },\r\n  'ARR8E': { codeString: \"HL8:0,1.5;P3E:6.5,0\" },\r\n  'LARR4E': { codeString: \"HL4:0,2;P4E:2,0\" },\r\n  'ARR4E': { codeString: \"HL4:0,1.5;P3E:2.5,0\" },\r\n  'LARR8N': { codeString: \"P4N;VL8:2,0\" },\r\n  'ARR8N': { codeString: \"P3N;VL8:1.5,0\" },\r\n  'LARR4N': { codeString: \"P4N;VL4:2,0\" },\r\n  'ARR4N': { codeString: \"P3N;VL4:1.5,0\" },\r\n  'LARR8S': { codeString: \"P4S:0,6;VL8:2,0\" },\r\n  'ARR8S': { codeString: \"P3S:0,6.5;VL8:1.5,0\" },\r\n  'LARR4S': { codeString: \"P4S:0,2;VL4:2,0\" },\r\n  'ARR4S': { codeString: \"P3S:0,2.5;VL4:1.5,0\" },\r\n  'LARR8NW': { codeString: \"DL8S;P3NW\" },\r\n  'ARR8NW': { codeString: \"DL8S;P2NW\" },\r\n  'LARR4NW': { codeString: \"DL4S;P3NW\" },\r\n  'ARR4NW': { codeString: \"DL4S;P2NW\" },\r\n  'LARR8NE': { codeString: \"DL8N;P3NE:5,0\" },\r\n  'ARR8NE': { codeString: \"DL8N;P2NE:6,0\" },\r\n  'LARR4NE': { codeString: \"DL4N;P3NE:1,0\" },\r\n  'ARR4NE': { codeString: \"DL4N;P2NE:2,0\" },\r\n  'LARR8SW': { codeString: \"DL8N;P3SW:0,5\" },\r\n  'ARR8SW': { codeString: \"DL8N;P2SW:0,6\" },\r\n  'LARR4SW': { codeString: \"DL4N;P3SW:0,1\" },\r\n  'ARR4SW': { codeString: \"DL4N;P2SW:0,2\" },\r\n  'LARR8SE': { codeString: \"DL8S;P3SE:5,5\" },\r\n  'ARR8SE': { codeString: \"DL8S;P2SE:6,6\" },\r\n  'LARR4SE': { codeString: \"DL4S;P3SE:1,1\" },\r\n  'ARR4SE': { codeString: \"DL4S;P2SE:2,2\" },\r\n  'P4N': { codeString: \"RA4N\" },\r\n  'P3N': { codeString: \"RA3N\" },\r\n  'P2N': { codeString: \"RA2N\" },\r\n  'P4S': { codeString: \"RA4S\" },\r\n  'P3S': { codeString: \"RA3S\" },\r\n  'P2S': { codeString: \"RA2S\" },\r\n  'P4W': { codeString: \"RA4W\" },\r\n  'P3W': { codeString: \"RA3W\" },\r\n  'P2W': { codeString: \"RA2W\" },\r\n  'P4E': { codeString: \"RA4E\" },\r\n  'P3E': { codeString: \"RA3E\" },\r\n  'P2E': { codeString: \"RA2E\" },\r\n  'P3NW': { codeString: \"RA3NW\" },\r\n  'P3NE': { codeString: \"RA3NE\" },\r\n  'P3SW': { codeString: \"RA3SW\" },\r\n  'P3SE': { codeString: \"RA3SE\" },\r\n  'P2NW': { codeString: \"RA2NW\" },\r\n  'P2NE': { codeString: \"RA2NE\" },\r\n  'P2SW': { codeString: \"RA2SW\" },\r\n  'P2SE': { codeString: \"RA2SE\" },\r\n  'P1.5NW': { codeString: \"RA1.5NW\" },\r\n  'P1.5NE': { codeString: \"RA1.5NE\" },\r\n  'P1.5SW': { codeString: \"RA1.5SW\" },\r\n  'P1.5SE': { codeString: \"RA1.5SE\" },\r\n  'LARRC8EC': { codeString: \"C8;P4S:6,2\" },\r\n  'ARRC8EC': { codeString: \"C8;P3S:6.5,2.5\" },\r\n  'LARRC8WC': { codeString: \"P4N:0,4;C8:2,0\" },\r\n  'ARRC8WC': { codeString: \"P3N:0,4;C8:1.5,0\" },\r\n  'LARRC8NC': { codeString: \"C8:0,2;P4E:2,0\" },\r\n  'ARRC8NC': { codeString: \"C8:0,1.5;P3E:2.5,0\" },\r\n  'LARRC8SC': { codeString: \"C8;P4W:4,6\" },\r\n  'ARRC8SC': { codeString: \"C8;P3W:4,6.5\" },\r\n  'LARRC8ECC': { codeString: \"C8;P4N:6,4\" },\r\n  'ARRC8ECC': { codeString: \"C8;P3N:6.5,4\" },\r\n  'LARRC8WCC': { codeString: \"P4S:0,2;C8:2,0\" },\r\n  'ARRC8WCC': { codeString: \"P3S:0,2.5;C8:1.5,0\" },\r\n  'LARRC8NCC': { codeString: \"C8:0,2;P4W:4,0\" },\r\n  'ARRC8NCC': { codeString: \"C8:0,1.5;P3W:4,0\" },\r\n  'LARRC8SCC': { codeString: \"C8;P4E:2,6\" },\r\n  'ARRC8SCC': { codeString: \"C8;P3E:2.5,6.5\" },\r\n  'LARROC8SEC': { codeString: \"OC8SE;P4S:6,2\" },\r\n  'ARROC8SEC': { codeString: \"OC8SE;P3S:6.5,2.5\" },\r\n  'LARROC8NWC': { codeString: \"P4N:0,4;OC8NW:2,0\" },\r\n  'ARROC8NWC': { codeString: \"P3N:0,4;OC8NW:1.5,0\" },\r\n  'LARROC8NEC': { codeString: \"OC8NE:0,2;P4E:2,0\" },\r\n  'ARROC8NEC': { codeString: \"OC8NE:0,1.5;P3E:2.5,0\" },\r\n  'LARROC8SWC': { codeString: \"OC8SW;P4W:4,6\" },\r\n  'ARROC8SWC': { codeString: \"OC8SW;P3W:4,6.5\" },\r\n  'LARROC8SECC': { codeString: \"OC8SE;P4E:2,6\" },\r\n  'ARROC8SECC': { codeString: \"OC8SE;P3E:2.5,6.5\" },\r\n  'LARROC8NWCC': { codeString: \"OC8NW:0,2;P4W:4,0\" },\r\n  'ARROC8NWCC': { codeString: \"OC8NW:0,1.5;P3W:4,0\" },\r\n  'LARROC8NECC': { codeString: \"OC8NE;P4N:6,4\" },\r\n  'ARROC8NECC': { codeString: \"OC8NE;P3N:6.5,4\" },\r\n  'LARROC8SWCC': { codeString: \"P4S:0,2;OC8SW:2,0\" },\r\n  'ARROC8SWCC': { codeString: \"P3S:0,2.5;OC8SW:1.5,0\" },\r\n  'LARRHC8NC': { codeString: \"HC8N;P4S:6,2\" },\r\n  'ARRHC8NC': { codeString: \"HC8N;P3S:6.5,2.5\" },\r\n  'LARRHC8SC': { codeString: \"P4N;HC8S:2,0\" },\r\n  'ARRHC8SC': { codeString: \"P3N;HC8S:1.5,0\" },\r\n  'LARRHC8WC': { codeString: \"HC8W:0,2;P4E:2,0\" },\r\n  'ARRHC8WC': { codeString: \"HC8W:0,1.5;P3E:2.5,0\" },\r\n  'LARRHC8EC': { codeString: \"HC8E;P4W:0,6\" },\r\n  'ARRHC8EC': { codeString: \"HC8E;P3W:0,6.5\" },\r\n  'LARRHC8NCC': { codeString: \"P4S:0,2;HC8N:2,0\" },\r\n  'ARRHC8NCC': { codeString: \"P3S:0,2.5;HC8N:1.5,0\" },\r\n  'LARRHC8SCC': { codeString: \"HC8S;P4N:6,0\" },\r\n  'ARRHC8SCC': { codeString: \"HC8S;P3N:6.5,0\" },\r\n  'LARRHC8WCC': { codeString: \"HC8W;P4E:2,6\" },\r\n  'ARRHC8WCC': { codeString: \"HC8W;P3E:2.5,6.5\" },\r\n  'LARRHC8ECC': { codeString: \"P4W;HC8E:0,2\" },\r\n  'ARRHC8ECC': { codeString: \"P3W;HC8E:0,1.5\" },\r\n  'LARRQC4NWC': { codeString: \"QC4NW:0,2;P4E:2,0\" },\r\n  'ARRQC4NWC': { codeString: \"QC4NW:0,1.5;P3E:2.5,0\" },\r\n  'LARRQC4SWC': { codeString: \"P4N;QC4SW:2,0\" },\r\n  'ARRQC4SWC': { codeString: \"P3N;QC4SW:1.5,0\" },\r\n  'LARRQC4NEC': { codeString: \"QC4NE;P4S:2,2\" },\r\n  'ARRQC4NEC': { codeString: \"QC4NE;P3S:2.5,2.5\" },\r\n  'LARRQC4SEC': { codeString: \"QC4SE;P4W:0,2\" },\r\n  'ARRQC4SEC': { codeString: \"QC4SE;P3W:0,2.5\" },\r\n  'LARRQC4NWCC': { codeString: \"P4S:0,2;QC4NW:2,0\" },\r\n  'ARRQC4NWCC': { codeString: \"P3S:0,2.5;QC4NW:1.5,0\" },\r\n  'LARRQC4SWCC': { codeString: \"QC4SW;P4E:2,2\" },\r\n  'ARRQC4SWCC': { codeString: \"QC4SW;P3E:2.5,2.5\" },\r\n  'LARRQC4NECC': { codeString: \"P4W;QC4NE:0,2\" },\r\n  'ARRQC4NECC': { codeString: \"P3W;QC4NE:0,1.5\" },\r\n  'LARRQC4SECC': { codeString: \"QC4SE;P4N:2,0\" },\r\n  'ARRQC4SECC': { codeString: \"QC4SE;P3N:2.5,0\" }\r\n};\r\n\r\nshapeDefinitions['DOT'].extraPathOptions = {\r\n  baseStrokeWidth: 0.5,\r\n  extraDotWidth: 0.333\r\n};\r\n\r\nshapeDefinitions['SDOT'].extraPathOptions = {\r\n  baseStrokeWidth: 0.5,\r\n  extraDotWidth: 0\r\n};\r\n\r\nshapeDefinitions['COMMA'].extraPathOptions = {\r\n  baseStrokeWidth: 0.5,\r\n  extraDotWidth: 0.333\r\n};\r\n\r\n/**\r\n * External glyph definitions derived from alphabetData in liberation-sans-svg-path-data.js.\r\n *\r\n * Supported character sets:\r\n * - Base Latin (a-z, A-Z) - English\r\n * - Latin Extended - European languages:\r\n *   - Swedish/Finnish: å, ä, ö, Å, Ä, Ö\r\n *   - Norwegian/Danish: å, æ, ø, Å, Æ, Ø\r\n *   - Icelandic: á, é, í, ó, ú, ý, ð, þ, æ, ö, Á, É, Í, Ó, Ú, Ý, Ð, Þ, Æ, Ö\r\n *   - German: ä, ö, ü, ß, Ä, Ö, Ü\r\n *   - French: à, â, ç, è, é, ê, ë, î, ï, ô, ù, û, ü, ÿ, œ, æ, Œ, Æ\r\n *   - Spanish: á, é, í, ó, ú, ü, ñ, Á, É, Í, Ó, Ú, Ü, Ñ\r\n *   - Portuguese: á, â, ã, à, ç, é, ê, í, ó, ô, õ, ú, Á, Â, Ã, À, Ç, É, Ê, Í, Ó, Ô, Õ, Ú\r\n *   - Italian: à, è, é, ì, ò, ù, À, È, É, Ì, Ò, Ù\r\n *   - Dutch: é, ë, ï, ö, ü\r\n *   - Polish: ą, ć, ę, ł, ń, ó, ś, ź, ż, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ź, Ż\r\n *   - Czech/Slovak: á, č, é, í, ó, š, ú, ý, ž (partial)\r\n *   - Hungarian: á, é, í, ó, ö, ő, ú, ü, ű, Á, É, Í, Ó, Ö, Ő, Ú, Ü, Ű\r\n *   - Lithuanian: ą, č, ę, ė, į, š, ų, ū, ž, Ą, Č, Ę, Ė, Į, Š, Ų, Ū, Ž\r\n *   - Latvian: ā, č, ē, ģ, ī, ķ, ļ, ņ, š, ū, ž, Ā, Č, Ē, Ģ, Ī, Ķ, Ļ, Ņ, Š, Ū, Ž\r\n *   - Estonian: ä, ö, ü, õ\r\n *   - Slovenian/Croatian: č, š, ž (partial)\r\n *   - Afrikaans: ê, ë, î, ï, ô, û\r\n * - Cyrillic (Russian): а-я, А-Я, ё, Ё\r\n *\r\n * To add more characters, add them to alphabetData in liberation-sans-svg-path-data.js.\r\n */\r\nconst externalGlyphDefinitions = {};\r\nfor (const [code, data] of Object.entries(alphabetData)) {\r\n  externalGlyphDefinitions[code] = sc.createExternalGlyph(data.char);\r\n}\r\n\r\nfor (const definition of Object.values(shapeDefinitions)) {\r\n  definition.isShape = true;\r\n}\r\n\r\nconst blissElementDefinitions = {\r\n  ...nonShapeDefinitions,\r\n  ...referenceGlyphDefinitions,\r\n  ...shapeDefinitions,\r\n  ...externalGlyphDefinitions,\r\n};\r\n\r\n// Add Bliss glyph definitions (B-codes use Blissary ID:s)\r\nfor (const [code, definition] of Object.entries(glyphData)) {\r\n  definition.glyphCode = code;\r\n  definition.isBlissGlyph = true;\r\n}\r\nObject.assign(blissElementDefinitions, glyphData);\r\n\r\n// Track built-in codes so removeDefinition can prevent deleting them\r\nconst builtInCodes = new Set(Object.keys(blissElementDefinitions));\r\n\r\n// Letter aliases: B-codes that map to external glyph X-codes.\r\n// Registered after builtInCodes so they're treated as aliases, not built-in Bliss glyphs.\r\nconst letterAliases = {\r\n  B29: { codeString: \"Xa\" },  B30: { codeString: \"Xb\" },  B31: { codeString: \"Xc\" },\r\n  B32: { codeString: \"Xd\" },  B33: { codeString: \"Xe\" },  B34: { codeString: \"Xf\" },\r\n  B35: { codeString: \"Xg\" },  B36: { codeString: \"Xh\" },  B37: { codeString: \"Xi\" },\r\n  B38: { codeString: \"Xj\" },  B39: { codeString: \"Xk\" },  B40: { codeString: \"Xl\" },\r\n  B41: { codeString: \"Xm\" },  B42: { codeString: \"Xn\" },  B43: { codeString: \"Xo\" },\r\n  B44: { codeString: \"Xp\" },  B45: { codeString: \"Xq\" },  B46: { codeString: \"Xr\" },\r\n  B47: { codeString: \"Xs\" },  B48: { codeString: \"Xt\" },  B49: { codeString: \"Xu\" },\r\n  B50: { codeString: \"Xv\" },  B51: { codeString: \"Xw\" },  B52: { codeString: \"Xx\" },\r\n  B53: { codeString: \"Xy\" },  B54: { codeString: \"Xz\" },\r\n  B55: { codeString: \"XA\" },  B56: { codeString: \"XB\" },  B57: { codeString: \"XC\" },\r\n  B58: { codeString: \"XD\" },  B59: { codeString: \"XE\" },  B60: { codeString: \"XF\" },\r\n  B61: { codeString: \"XG\" },  B62: { codeString: \"XH\" },  B63: { codeString: \"XI\" },\r\n  B64: { codeString: \"XJ\" },  B65: { codeString: \"XK\" },  B66: { codeString: \"XL\" },\r\n  B67: { codeString: \"XM\" },  B68: { codeString: \"XN\" },  B69: { codeString: \"XO\" },\r\n  B70: { codeString: \"XP\" },  B71: { codeString: \"XQ\" },  B72: { codeString: \"XR\" },\r\n  B73: { codeString: \"XS\" },  B74: { codeString: \"XT\" },  B75: { codeString: \"XU\" },\r\n  B76: { codeString: \"XV\" },  B77: { codeString: \"XW\" },  B78: { codeString: \"XX\" },\r\n  B79: { codeString: \"XY\" },  B80: { codeString: \"XZ\" },\r\n};\r\nObject.assign(blissElementDefinitions, letterAliases);\r\n\r\nexport { blissElementDefinitions, builtInCodes };","/*\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { blissElementDefinitions, isSpaceGlyph } from \"./bliss-element-definitions.js\";\r\nimport { INTERNAL_OPTIONS, isSafeAttributeName, generateKey, MAX_RECURSION_DEPTH } from \"./bliss-constants.js\";\r\nimport { createTextFallbackGlyph } from \"./bliss-shape-creators.js\";\r\n\r\nexport class BlissElement {\r\n  //#region Private Properties\r\n  #key\r\n  #level\r\n  #blissObj\r\n  #extraPathOptions\r\n  #isCharacter\r\n  #isShape\r\n  #isBlissGlyph\r\n  #isExternalGlyph\r\n  #width\r\n  #height\r\n  #leafX\r\n  #leafY\r\n  #leafWidth\r\n  #leafHeight\r\n  #anchorOffsetX\r\n  #anchorOffsetY\r\n  #advanceX\r\n  #children\r\n  #relativeToParentX\r\n  #relativeToParentY\r\n  #codeName\r\n  #char\r\n  #externalGlyphSpacing\r\n  #isSpaceGroup\r\n  //#endregion\r\n  #childStartOffset\r\n  #parentElement;\r\n  #previousElement;\r\n  #classifiedParts; // Cached result of #classifyParts (level 2 only)\r\n\r\n  /**\r\n   * Wraps content with <a> and/or <g> tags based on options.\r\n   * Ensures consistent wrapping behavior across all element levels.\r\n   *\r\n   * @param {string} content - The content to wrap (raw path data or HTML string)\r\n   * @param {Object} options - The options containing anchor and group attributes\r\n   * @returns {string} The wrapped content\r\n   */\r\n  static #wrapWithAnchorAndGroup(content, options) {\r\n    const { anchorAttrs, groupAttrs, hasHref } = BlissElement.#separateAnchorAndGroupOptions(options);\r\n\r\n    // Content that starts with '<' is already wrapped in proper tags\r\n    // Raw path data or fragments need wrapping\r\n    const needsPathWrapper = !content.startsWith('<');\r\n\r\n    if (hasHref) {\r\n      const wrappedContent = needsPathWrapper ? `<path d=\"${content}\"/>` : content;\r\n      if (groupAttrs) {\r\n        return `<a ${anchorAttrs} style=\"cursor: pointer;\"><g ${groupAttrs}>${wrappedContent}</g></a>`;\r\n      }\r\n      return `<a ${anchorAttrs} style=\"cursor: pointer;\">${wrappedContent}</a>`;\r\n    }\r\n\r\n    if (groupAttrs) {\r\n      const wrappedContent = needsPathWrapper ? `<path d=\"${content}\"/>` : content;\r\n      return `<g ${groupAttrs}>${wrappedContent}</g>`;\r\n    }\r\n\r\n    return content;\r\n  }\r\n\r\n  static #separateAnchorAndGroupOptions(options) {\r\n    if (!options || typeof options !== 'object') {\r\n      return { anchorAttrs: '', groupAttrs: '', hasHref: false };\r\n    }\r\n\r\n    const anchorAttrNames = new Set([\r\n      'href',\r\n      'target',\r\n      'rel',\r\n      'download',\r\n      'hreflang',\r\n      'type',\r\n      'referrerpolicy'\r\n    ]);\r\n\r\n    // Use shared INTERNAL_OPTIONS constant\r\n    // Multi-level options (strokeWidth, color, fill, opacity, etc.) are NOT in this set - they should render as attributes.\r\n\r\n    const attrMap = {\r\n      'color': 'stroke',\r\n      'strokeWidth': 'stroke-width'\r\n    };\r\n\r\n    const anchorAttrs = [];\r\n    const groupAttrs = [];\r\n    let hasHref = false;\r\n    let hasPointerEvents = false;\r\n\r\n    const isSafeHref = (value) => {\r\n      const cleaned = String(value).replace(/[\\x00-\\x1f\\x7f]/g, '').trim();\r\n      return /^(https?:|mailto:|tel:|\\/|#)/i.test(cleaned);\r\n    };\r\n\r\n    // Values are already escaped by #processOptions at the input boundary\r\n    for (const [key, value] of Object.entries(options)) {\r\n      if (INTERNAL_OPTIONS.has(key) || !isSafeAttributeName(key)) continue;\r\n\r\n      if (anchorAttrNames.has(key)) {\r\n        if (key === 'href') {\r\n          if (!isSafeHref(value)) continue;\r\n          hasHref = true;\r\n        }\r\n        anchorAttrs.push(`${key}=\"${value}\"`);\r\n      } else {\r\n        const attrName = attrMap[key] || key;\r\n        if (key === 'pointer-events') hasPointerEvents = true;\r\n        groupAttrs.push(`${attrName}=\"${value}\"`);\r\n      }\r\n    }\r\n\r\n    if (hasHref && !hasPointerEvents) {\r\n      groupAttrs.push('pointer-events=\"bounding-box\"');\r\n    }\r\n\r\n    return {\r\n      anchorAttrs: anchorAttrs.join(' '),\r\n      groupAttrs: groupAttrs.join(' '),\r\n      hasHref\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Classifies character parts into glyph parts and indicator parts.\r\n   * Valid pattern: [non-indicators...][indicators...] (no mixing)\r\n   *\r\n   * @param {BlissElement[]} children - Array of child elements to classify\r\n   * @returns {{ glyphParts: BlissElement[], indicatorParts: BlissElement[], isValidPattern: boolean }}\r\n   */\r\n  static #classifyParts(children) {\r\n    if (!children || children.length === 0) {\r\n      return { glyphParts: [], indicatorParts: [], isValidPattern: true };\r\n    }\r\n\r\n    const firstIndicatorIndex = children.findIndex(c => c.isIndicator);\r\n\r\n    // No indicators: all parts are glyph parts\r\n    if (firstIndicatorIndex === -1) {\r\n      return { glyphParts: children, indicatorParts: [], isValidPattern: true };\r\n    }\r\n\r\n    const glyphParts = children.slice(0, firstIndicatorIndex);\r\n    const indicatorParts = children.slice(firstIndicatorIndex);\r\n\r\n    // Validate: no non-indicators after the first indicator\r\n    const isValidPattern = indicatorParts.every(c => c.isIndicator);\r\n\r\n    return { glyphParts, indicatorParts, isValidPattern };\r\n  }\r\n\r\n  #sharedOptions;\r\n\r\n  /**\r\n   * Gets the first character element of the first group (level 2 element).\r\n   * Returns null if the structure doesn't have the expected depth.\r\n   * @returns {BlissElement|null}\r\n   */\r\n  #getFirstCharacterElement() {\r\n    const firstGroup = this.#children?.[0];\r\n    if (!firstGroup) return null;\r\n\r\n    const firstCharacter = firstGroup.#children?.[0];\r\n    if (!firstCharacter || !firstCharacter.#children) return null;\r\n\r\n    return firstCharacter;\r\n  }\r\n\r\n  /**\r\n   * Gets inherited options by walking up the parent chain.\r\n   * Child options take precedence over parent options.\r\n   * @param {string} optionName - The option name to look for\r\n   * @returns {*} The option value, or undefined if not found\r\n   */\r\n  #getInheritedOption(optionName) {\r\n    // Check this element's options first\r\n    if (this.#blissObj.options?.[optionName] !== undefined) {\r\n      return this.#blissObj.options[optionName];\r\n    }\r\n    // Walk up parent chain\r\n    let current = this.#parentElement;\r\n    while (current) {\r\n      if (current.#blissObj.options?.[optionName] !== undefined) {\r\n        return current.#blissObj.options[optionName];\r\n      }\r\n      current = current.#parentElement;\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  /**\r\n   * Positions indicator parts as a centered group above the glyph.\r\n   * First indicator is positioned so the entire group is centered over the glyph anchor.\r\n   * Subsequent indicators are positioned relative to the previous indicator.\r\n   *\r\n   * @param {BlissElement[]} glyphParts - The non-indicator parts (the base glyph)\r\n   * @param {BlissElement[]} indicatorParts - The indicator parts to position\r\n   */\r\n  #positionIndicatorGroup(glyphParts, indicatorParts) {\r\n    if (indicatorParts.length === 0) return;\r\n\r\n    // Calculate base glyph metrics\r\n    // For glyph width, we need the combined width of all glyph parts\r\n    const glyphMinX = glyphParts.length > 0\r\n      ? Math.min(...glyphParts.map(p => p.#relativeToParentX))\r\n      : 0;\r\n    const glyphMaxX = glyphParts.length > 0\r\n      ? Math.max(...glyphParts.map(p => p.#relativeToParentX + p.width))\r\n      : 0;\r\n    const glyphWidth = glyphMaxX - glyphMinX;\r\n    const glyphCenterX = glyphMinX + glyphWidth / 2;\r\n\r\n    // Get anchor offset from first glyph part (or default to 0)\r\n    const baseAnchorOffsetX = glyphParts[0]?.anchorOffset?.x || 0;\r\n    const baseAnchorOffsetY = glyphParts[0]?.anchorOffset?.y || 0;\r\n    const anchorX = glyphCenterX + baseAnchorOffsetX;\r\n\r\n    // Calculate total indicator group width (including gaps)\r\n    const INDICATOR_GAP = 1;\r\n    const totalIndicatorWidth = indicatorParts.reduce((sum, ind) => sum + ind.width, 0)\r\n      + (indicatorParts.length - 1) * INDICATOR_GAP;\r\n\r\n    // Calculate shift to center ANCHORS (not visual edges) over glyph anchor.\r\n    //\r\n    // Each indicator has an anchor point at: position + width/2 + anchorOffsetX\r\n    // We want the midpoint of first and last anchors to align with glyphAnchorX.\r\n    //\r\n    // SINGLE INDICATOR:\r\n    //   anchor = x + width/2 + anchorOffsetX\r\n    //   We want: anchor = glyphAnchorX\r\n    //   So: x = glyphAnchorX - width/2 - anchorOffsetX\r\n    //   Without shift: x = glyphAnchorX - width/2\r\n    //   Therefore: shift = -anchorOffsetX\r\n    //\r\n    // MULTIPLE INDICATORS (derivation for first/last anchor midpoint):\r\n    //   Let P = starting position (first indicator's x)\r\n    //   First anchor:  P + w1/2 + a1\r\n    //   Last anchor:   P + totalWidth - w2/2 + a2  (where totalWidth includes gaps)\r\n    //   Midpoint = (firstAnchor + lastAnchor) / 2\r\n    //            = P + (w1/2 + a1 + totalWidth - w2/2 + a2) / 2\r\n    //   We want midpoint = glyphAnchorX, so:\r\n    //   P = glyphAnchorX - (w1/2 + a1 + totalWidth - w2/2 + a2) / 2\r\n    //     = glyphAnchorX - totalWidth/2 - (w1 - w2)/4 - (a1 + a2)/2\r\n    //   Without shift: P = glyphAnchorX - totalWidth/2\r\n    //   Therefore: shift = -(w1 - w2)/4 - (a1 + a2)/2\r\n    //                    = (w2 - w1)/4 - (a1 + a2)/2\r\n    //\r\n    const firstAnchorOffsetX = indicatorParts[0].anchorOffset?.x || 0;\r\n    const lastAnchorOffsetX = indicatorParts[indicatorParts.length - 1].anchorOffset?.x || 0;\r\n    const anchorShift = indicatorParts.length > 1\r\n      ? (indicatorParts[indicatorParts.length - 1].width - indicatorParts[0].width) / 4\r\n        - firstAnchorOffsetX / 2 - lastAnchorOffsetX / 2\r\n      : -firstAnchorOffsetX;\r\n\r\n    // Position indicators\r\n    let currentX = anchorX - totalIndicatorWidth / 2 + anchorShift;\r\n\r\n    for (const indicator of indicatorParts) {\r\n      // X positioning: only override if no explicit x was provided\r\n      // Position by left edge to maintain visual 1-unit gaps between indicators\r\n      // (indicator's anchorOffsetX is NOT used here - it's for single indicator centering only)\r\n      if (indicator.#blissObj.x === undefined) {\r\n        indicator.#relativeToParentX = currentX;\r\n      } else {\r\n        indicator.#relativeToParentX = indicator.#blissObj.x;\r\n      }\r\n\r\n      // Y positioning: use same logic as before, but reference base glyph\r\n      if (indicator.#blissObj.y !== undefined) {\r\n        indicator.#relativeToParentY = indicator.#blissObj.y;\r\n      } else {\r\n        const defaultIndicatorY = 4;\r\n        const baseDefaultAnchorY = 4;\r\n        const baseAnchorY = baseDefaultAnchorY + baseAnchorOffsetY;\r\n        const indicatorAnchorOffsetY = indicator.#blissObj.anchorOffsetY || 0;\r\n        indicator.#relativeToParentY = baseAnchorY - indicatorAnchorOffsetY - defaultIndicatorY;\r\n      }\r\n\r\n      // Move to next indicator position\r\n      currentX += indicator.width + INDICATOR_GAP;\r\n    }\r\n  }\r\n\r\n  constructor(blissObj = {}, { parentElement = null, previousElement = null, level = 0, sharedOptions = null } = {}) {\r\n    this.#blissObj = blissObj;\r\n    this.#parentElement = parentElement;\r\n    this.#previousElement = previousElement;\r\n    this.#level = level;\r\n    this.#sharedOptions = sharedOptions || { charSpace: 2, wordSpace: 8, externalGlyphSpace: 0.8 };\r\n\r\n    // Assign key: user-provided key takes precedence, otherwise auto-generate\r\n    this.#key = this.#blissObj.key || generateKey();\r\n\r\n    // Duplicate key detection (only when builder provides sharedOptions with key tracking).\r\n    // The `this.#blissObj.key` guard limits warnings to user-assigned keys only;\r\n    // auto-generated 8-char random keys have negligible collision probability (~2.8T combinations).\r\n    if (this.#sharedOptions.keys) {\r\n      if (this.#blissObj.key && this.#sharedOptions.keys.has(this.#key)) {\r\n        this.#sharedOptions.warnings.push({\r\n          code: 'DUPLICATE_KEY',\r\n          message: `Duplicate element key: \"${this.#key}\"`,\r\n          source: this.#key,\r\n        });\r\n      }\r\n      this.#sharedOptions.keys.add(this.#key);\r\n    }\r\n\r\n    this.#codeName = \"\";\r\n    this.#relativeToParentX = 0;\r\n    this.#relativeToParentY = 0;\r\n    this.#children = [];\r\n    this.#externalGlyphSpacing = this.#sharedOptions.externalGlyphSpace - (this.kerningRules?.[previousElement?.char] ?? 0);\r\n    this.#childStartOffset = 0;\r\n\r\n    if (this.#level === 0) {\r\n      // Root level (sequence)\r\n      if (!this.#blissObj.groups) {\r\n        this.#blissObj = { groups: [this.#blissObj] };\r\n      }\r\n\r\n      for (const group of this.#blissObj.groups) {\r\n        const child = new BlissElement(group, { parentElement: this, previousElement: this.#children[this.#children.length - 1], level: this.#level + 1, sharedOptions: this.#sharedOptions });\r\n        this.#children.push(child);\r\n      }\r\n      \r\n      // Calculate indicator overhang for first character\r\n      const firstCharacter = this.#getFirstCharacterElement();\r\n      if (firstCharacter && firstCharacter.#classifiedParts) {\r\n        const { glyphParts, indicatorParts } = firstCharacter.#classifiedParts;\r\n\r\n        // Only calculate overhang if we have both glyph parts and indicator parts\r\n        if (glyphParts.length > 0 && indicatorParts.length > 0 && !firstCharacter.isIndicator) {\r\n          // Find how far the leftmost indicator extends left of x=0 (glyph start)\r\n          const indicatorLeftX = indicatorParts[0].#relativeToParentX;\r\n          if (indicatorLeftX < 0) {\r\n            this.#childStartOffset = -indicatorLeftX;\r\n          }\r\n        }\r\n      }\r\n      this.#relativeToParentX = this.#childStartOffset + (this.#blissObj.x ?? 0);\r\n      this.#relativeToParentY = this.#blissObj.y ?? 0;\r\n\r\n      this.getSvgContent = (x = 0, y = 0) => {\r\n        const childContents = this.#children.map(child =>\r\n          child.getSvgContent(this.#relativeToParentX + x, this.#relativeToParentY + y)\r\n        );\r\n\r\n        const hasTaggedContent = childContents.some(c => c.startsWith('<'));\r\n        const hasRawContent = childContents.some(c => !c.startsWith('<'));\r\n\r\n        const content = hasTaggedContent && hasRawContent\r\n          ? childContents.map(c => c.startsWith('<') ? c : `<path d=\"${c}\"/>`).join('')\r\n          : childContents.join('');\r\n\r\n        // At level 0 (sentence/global), only pass anchor attributes to #wrapWithAnchorAndGroup\r\n        // SVG-level attributes (stroke-width, color, etc.) are handled by the SVG builder\r\n        const anchorAttrNames = new Set(['href', 'target', 'rel', 'download', 'hreflang', 'type', 'referrerpolicy']);\r\n        const filteredOptions = {};\r\n        if (this.#blissObj.options) {\r\n          for (const [key, value] of Object.entries(this.#blissObj.options)) {\r\n            if (anchorAttrNames.has(key)) {\r\n              filteredOptions[key] = value;\r\n            }\r\n          }\r\n        }\r\n\r\n        return BlissElement.#wrapWithAnchorAndGroup(content, filteredOptions);\r\n      };\r\n    } else if (this.#level === 1) {\r\n      // Group level\r\n      if (!this.#blissObj.glyphs) {\r\n        this.#blissObj = { glyphs: [this.#blissObj] };\r\n      }\r\n\r\n      for (const glyph of this.#blissObj.glyphs) {\r\n        const child = new BlissElement(glyph, { parentElement: this, previousElement: this.#children[this.#children.length - 1], level: this.#level + 1, sharedOptions: this.#sharedOptions });\r\n        this.#children.push(child);\r\n      }\r\n\r\n\r\n      // Check if this is a space group (all glyphs are space glyphs: TSP or QSP)\r\n      this.#isSpaceGroup = this.#blissObj.glyphs?.every(g => {\r\n        const code = g.parts?.[0]?.codeName;\r\n        return code && isSpaceGlyph(code);\r\n      }) ?? false;\r\n      const isSpaceGroup = this.#isSpaceGroup;\r\n\r\n      if (this.#previousElement) {\r\n        if (this.#blissObj.x === undefined) {\r\n          // Position based on previous element's advanceX\r\n          this.#relativeToParentX = this.#previousElement.#relativeToParentX + this.#previousElement.#advanceX;\r\n        } else {\r\n          this.#relativeToParentX = this.#previousElement.#relativeToParentX + this.#previousElement.width + this.#blissObj.x;\r\n        }\r\n      } else if (this.#parentElement) {\r\n        this.#relativeToParentX = this.#parentElement.#relativeToParentX + (this.#blissObj.x ?? 0);\r\n      } else {\r\n        this.#relativeToParentX = this.#blissObj.x ?? 0;\r\n      }\r\n\r\n      if (this.#parentElement) {\r\n        this.#relativeToParentY = this.#parentElement.#relativeToParentY + (this.#blissObj.y ?? 0);\r\n      } else {\r\n        this.#relativeToParentY = this.#blissObj.y ?? 0;\r\n      }\r\n\r\n      // Space groups: advanceX is the sum of their dynamically-calculated glyph widths\r\n      // Regular groups: advanceX is baseGroupWidth + charSpace (the charSpace pairs with TSP to make full wordSpace)\r\n      if (isSpaceGroup) {\r\n        // Sum dynamically-calculated widths for all space glyphs\r\n        this.#advanceX = this.#blissObj.glyphs.reduce((sum, g) => {\r\n          const code = g.parts?.[0]?.codeName;\r\n          if (code === 'TSP') {\r\n            return sum + (this.#sharedOptions.wordSpace - this.#sharedOptions.charSpace);\r\n          } else if (code === 'QSP') {\r\n            return sum + (this.#sharedOptions.wordSpace / 2 - this.#sharedOptions.charSpace);\r\n          }\r\n          return sum;\r\n        }, 0);\r\n      } else {\r\n        this.#advanceX = this.baseGroupWidth + this.#sharedOptions.charSpace;\r\n      }\r\n\r\n      this.getSvgContent = (x = 0, y = 0) => {\r\n        const childContents = this.#children.map(child =>\r\n          child.getSvgContent(this.#relativeToParentX + x, this.#relativeToParentY + y)\r\n        );\r\n\r\n        const hasTaggedContent = childContents.some(c => c.startsWith('<'));\r\n        const hasRawContent = childContents.some(c => !c.startsWith('<'));\r\n\r\n        const content = hasTaggedContent && hasRawContent\r\n          ? childContents.map(c => c.startsWith('<') ? c : `<path d=\"${c}\"/>`).join('')\r\n          : childContents.join('');\r\n\r\n        return BlissElement.#wrapWithAnchorAndGroup(content, this.#blissObj.options);\r\n      };\r\n    } else {\r\n      if (this.#level === 2) {\r\n        // Character level\r\n\r\n        // codeName at glyph level: the input code that produces this glyph,\r\n        // when the glyph is actually a glyph. Empty string for composites,\r\n        // bare shape primitives, ad-hoc composites, and multi-char text\r\n        // fallback. The presence of glyphCode IS the \"this is a glyph\" signal:\r\n        // the parser only sets it for registered glyphs (B-codes, X-codes,\r\n        // single-char text fallback, define()d 'glyph'-type aliases). The JSON\r\n        // postParse step (bliss-svg-builder.js) normalizes JSON's codeName\r\n        // field back to glyphCode, so glyph-level codeName never reaches\r\n        // construction. For single-char text fallback the parser stores\r\n        // 'XTXT_<char>' as the internal routing key; surface it publicly as\r\n        // 'X<char>'.\r\n        if (typeof this.#blissObj.glyphCode === 'string') {\r\n          const code = this.#blissObj.glyphCode;\r\n          this.#codeName = code.startsWith('XTXT_') ? 'X' + code.slice(5) : code;\r\n        } else {\r\n          this.#codeName = \"\";\r\n        }\r\n\r\n        this.#char = this.#blissObj.char ?? \"\";\r\n        this.#isBlissGlyph = !!this.#blissObj.isBlissGlyph;\r\n        this.#isExternalGlyph = !!this.#blissObj.isExternalGlyph;\r\n\r\n        if (!this.#blissObj.parts) {\r\n          this.#blissObj = { parts: [this.#blissObj] };\r\n        }\r\n\r\n        const warningCountBefore = this.#sharedOptions?.warnings?.length ?? 0;\r\n\r\n        for (const part of this.#blissObj.parts) {\r\n          const child = new BlissElement(part, { parentElement: this, previousElement: this.#children[this.#children.length - 1], level: this.#level + 1, sharedOptions: this.#sharedOptions });\r\n          this.#children.push(child);\r\n        }\r\n\r\n        // If any part failed (unknown code), replace the entire character\r\n        const hasFailedParts = (this.#sharedOptions?.warnings?.length ?? 0) > warningCountBefore;\r\n        if (hasFailedParts) {\r\n          if (this.#sharedOptions?.errorPlaceholder) {\r\n            // Replace all children with a single placeholder character\r\n            this.#children = [];\r\n            const placeholderParts = structuredClone(this.#sharedOptions.errorPlaceholderParts);\r\n            for (const placeholderPart of placeholderParts) {\r\n              const child = new BlissElement(placeholderPart, {\r\n                parentElement: this,\r\n                previousElement: this.#children[this.#children.length - 1],\r\n                level: this.#level + 1,\r\n                sharedOptions: this.#sharedOptions,\r\n              });\r\n              this.#children.push(child);\r\n            }\r\n          } else {\r\n            // Zero-width invisible character\r\n            this.#children = [];\r\n          }\r\n        }\r\n\r\n        // Classify parts into glyph parts and indicator parts (cache for reuse by getters)\r\n        this.#classifiedParts = BlissElement.#classifyParts(this.#children);\r\n        const { glyphParts, indicatorParts, isValidPattern } = this.#classifiedParts;\r\n\r\n        // Position indicators as a centered group above the glyph\r\n        // Only apply when:\r\n        // - We have BOTH glyph parts AND indicator parts\r\n        // - The pattern is valid (no non-indicators after the first indicator)\r\n        // Invalid patterns (e.g., B291;B99;H) are treated as default combination, not special indicator positioning\r\n        // All-indicator composites (e.g., B98) keep their internal positioning\r\n        const hasGlyphWithIndicators = glyphParts.length > 0 && indicatorParts.length > 0 && isValidPattern;\r\n        if (hasGlyphWithIndicators) {\r\n          this.#positionIndicatorGroup(glyphParts, indicatorParts);\r\n        }\r\n\r\n        // Normalize: shift parts right only if any child extends left of origin (negative x)\r\n        // Skip normalization for characters with indicators above glyph (they have their own positioning)\r\n        if (!hasGlyphWithIndicators && this.#children.length > 0) {\r\n          const minX = Math.min(...this.#children.map(child => child.#relativeToParentX));\r\n          if (minX < 0) {\r\n            for (const child of this.#children) {\r\n              child.#relativeToParentX -= minX;\r\n            }\r\n          }\r\n        }\r\n\r\n        if (!this.#previousElement) {\r\n          this.#relativeToParentX = this.#parentElement.#relativeToParentX + (this.#blissObj.x ?? 0);\r\n        } else {\r\n          if (this.isExternalGlyph && this.#previousElement.isExternalGlyph) {\r\n            this.#previousElement.#advanceX = this.#previousElement.width + this.#externalGlyphSpacing;\r\n          }\r\n\r\n          if (!this.isExternalGlyph && !this.#previousElement.isExternalGlyph &&\r\n              this.#previousElement.kerningRules && this.codeName) {\r\n            const kerningAdjustment = this.#previousElement.kerningRules[this.codeName] ?? 0;\r\n            if (kerningAdjustment !== 0) {\r\n              this.#previousElement.#advanceX = this.#previousElement.width + this.#sharedOptions.charSpace + kerningAdjustment;\r\n            }\r\n          }\r\n\r\n          if (typeof this.#blissObj.options?.relativeKerning === \"number\") {\r\n            this.#previousElement.#advanceX += this.#blissObj.options.relativeKerning;\r\n          } else if (typeof this.#blissObj.options?.absoluteKerning === \"number\") {\r\n            this.#previousElement.#advanceX = this.#previousElement.width + this.#blissObj.options.absoluteKerning;\r\n          }\r\n\r\n          if (this.#blissObj.x === undefined) {\r\n            this.#relativeToParentX = this.#previousElement.#relativeToParentX + this.#previousElement.#advanceX;\r\n          } else {\r\n            this.#relativeToParentX = this.#previousElement.#relativeToParentX + this.#previousElement.width + this.#blissObj.x;\r\n          }\r\n        }\r\n\r\n        this.#relativeToParentY = this.#blissObj.y ?? 0;\r\n\r\n        if (hasFailedParts && !this.#sharedOptions?.errorPlaceholder) {\r\n          // Invisible failed character takes zero space\r\n          this.#advanceX = 0;\r\n          this.getSvgContent = () => '';\r\n        } else {\r\n          // Dynamic advanceX calculation for space glyphs (TSP, QSP)\r\n          const code = this.#blissObj.parts?.[0]?.codeName;\r\n          if (code && isSpaceGlyph(code)) {\r\n            if (code === 'TSP') {\r\n              this.#advanceX = this.#sharedOptions.wordSpace - this.#sharedOptions.charSpace;\r\n            } else if (code === 'QSP') {\r\n              this.#advanceX = this.#sharedOptions.wordSpace / 2 - this.#sharedOptions.charSpace;\r\n            }\r\n          } else {\r\n            this.#advanceX = this.baseGlyphWidth + this.#sharedOptions.charSpace;\r\n          }\r\n\r\n          this.getSvgContent = (x = 0, y = 0) => {\r\n            const childContents = this.#children.map(child =>\r\n              child.getSvgContent(this.#relativeToParentX + x, this.#relativeToParentY + y)\r\n            );\r\n\r\n            const hasTaggedContent = childContents.some(c => c.startsWith('<'));\r\n            const hasRawContent = childContents.some(c => !c.startsWith('<'));\r\n\r\n            const content = hasTaggedContent && hasRawContent\r\n              ? childContents.map(c => c.startsWith('<') ? c : `<path d=\"${c}\"/>`).join('')\r\n              : childContents.join('');\r\n\r\n            return BlissElement.#wrapWithAnchorAndGroup(content, this.#blissObj.options);\r\n          };\r\n        }\r\n      } else {\r\n        // Part level (level >= 3)\r\n        const elementDefinition = this.#blissObj.codeName?.startsWith('XTXT_')\r\n          ? (() => { const g = createTextFallbackGlyph(this.#blissObj.codeName.slice(5)); g.isShape = true; return g; })()\r\n          : blissElementDefinitions[this.#blissObj.codeName];\r\n        const isPredefinedElement = !!elementDefinition && !!elementDefinition.getPath;\r\n        const isCompositeElement = !!this.#blissObj.parts && this.#blissObj.parts.length > 0;\r\n  \r\n        this.#relativeToParentX = this.#blissObj.x ?? 0;\r\n        this.#relativeToParentY = this.#blissObj.y ?? 0;\r\n\r\n        if (!isPredefinedElement && !isCompositeElement) {\r\n          // When constructed directly (no builder), throw to preserve existing behaviour\r\n          if (!this.#sharedOptions?.warnings) {\r\n            const failedCode = this.#blissObj.codeName || this.#blissObj.error || 'unknown';\r\n            throw new Error(`Unable to create Bliss element: ${failedCode}`);\r\n          }\r\n\r\n          if (this.#blissObj.errorCode === 'WORD_AS_PART') {\r\n            this.#sharedOptions.warnings.push({\r\n              code: 'WORD_AS_PART',\r\n              message: this.#blissObj.error,\r\n              source: this.#blissObj.codeName || 'unknown',\r\n            });\r\n          } else {\r\n            const failedCode = this.#blissObj.codeName || 'unknown';\r\n            this.#sharedOptions.warnings.push({\r\n              code: 'UNKNOWN_CODE',\r\n              message: `Unknown or invalid code: \"${failedCode}\"`,\r\n              source: failedCode,\r\n            });\r\n          }\r\n\r\n          // Render as zero-width invisible. Character level (level 2) handles\r\n          // placeholder display for the entire character when any part fails.\r\n          this.#leafWidth = 0;\r\n          this.#leafHeight = 0;\r\n          this.getSvgContent = () => '';\r\n        } else if (isPredefinedElement) {\r\n          this.#handlePredefinedElement(elementDefinition);\r\n\r\n          // For predefined (leaf) elements with explicit coordinates, use them directly\r\n          if (this.#blissObj.y !== undefined) {\r\n            this.#relativeToParentY = this.#blissObj.y;\r\n          }\r\n        } else if (isCompositeElement) {\r\n          // Surface 'XTXT_<chars>' (internal text-fallback routing key) as\r\n          // 'X<chars>' publicly. Internal lookup uses #blissObj.codeName.\r\n          const raw = this.#blissObj.codeName || \"\";\r\n          this.#codeName = raw.startsWith('XTXT_') ? 'X' + raw.slice(5) : raw;\r\n          this.#handleCompositeElement(this.#blissObj.parts);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  get parentElement() {\r\n    return this.#parentElement;\r\n  }\r\n\r\n  get previousElement() {\r\n    return this.#previousElement;\r\n  }\r\n\r\n  get advanceX() {\r\n    return this.#advanceX || 0;\r\n  }\r\n\r\n  get children() {\r\n    return this.#children;\r\n  }\r\n\r\n  get codeName() {\r\n    return this.#codeName || \"\";\r\n  }\r\n\r\n  get anchorOffset() {\r\n    return {\r\n      x: this.#anchorOffsetX || 0,\r\n      y: this.#anchorOffsetY || 0\r\n    }\r\n  }\r\n\r\n  get width() {\r\n    if (this.#leafWidth !== undefined) return this.#leafWidth;\r\n    if (!this.#children || this.#children.length === 0) return 0;\r\n\r\n    const minRelativeX = Math.min(...this.#children.map(child => child.#relativeToParentX));\r\n\r\n    let maxRelativeXPlusWidth;\r\n    if (this.#level === 1) {\r\n      maxRelativeXPlusWidth = Math.max(...this.#children.map(child =>\r\n        child.#relativeToParentX + child.rightExtendedGlyphWidth));\r\n    } else {\r\n      maxRelativeXPlusWidth = Math.max(...this.#children.map(child =>\r\n        child.#relativeToParentX + child.width));\r\n    }\r\n\r\n    let width;\r\n    if (this.#level === 0) {\r\n      width = maxRelativeXPlusWidth - minRelativeX + this.#childStartOffset;\r\n    } else {\r\n      // When minRelativeX > 0, the left boundary is still the element's origin (0),\r\n      // not the leftmost child. Only subtract negative offsets (e.g., indicator overhang).\r\n      width = maxRelativeXPlusWidth - Math.min(0, minRelativeX);\r\n    }\r\n\r\n    return width;\r\n  }\r\n\r\n  get rightExtendedGlyphWidth() {\r\n    if (this.#level !== 2) throw new Error('rightExtendedGlyphWidth can only be called on glyph elements (level 2)');\r\n\r\n    const parts = this.#children;\r\n    if (parts.length === 0) return 0;\r\n\r\n    // Use cached classification (computed once in constructor)\r\n    const { glyphParts } = this.#classifiedParts;\r\n\r\n    // If no glyph parts (all indicators), use all parts for spacing\r\n    const spacingParts = glyphParts.length > 0 ? glyphParts : parts;\r\n\r\n    const minRelativeX = Math.min(...spacingParts.map(part => part.#relativeToParentX));\r\n    const maxRelativeXPlusWidth = Math.max(...parts.map(part => part.#relativeToParentX + part.width));\r\n    // When minRelativeX > 0, the left boundary is still the element's origin (0).\r\n    // Only subtract negative offsets (e.g., indicator overhang).\r\n    const rightExtendedGlyphWidth = maxRelativeXPlusWidth - Math.min(0, minRelativeX);\r\n\r\n    return rightExtendedGlyphWidth;\r\n  }\r\n\r\n  get baseGlyphWidth() {\r\n    if (this.#level !== 2) throw new Error('baseGlyphWidth can only be called on glyph elements (level 2)');\r\n\r\n    const parts = this.#children;\r\n    if (parts.length === 0) return 0;\r\n\r\n    // Use cached classification (computed once in constructor)\r\n    const { glyphParts } = this.#classifiedParts;\r\n\r\n    // If no glyph parts (all indicators), use all parts for width\r\n    const spacingParts = glyphParts.length > 0 ? glyphParts : parts;\r\n\r\n    const minRelativeX = Math.min(...spacingParts.map(part => part.#relativeToParentX));\r\n    const maxRelativeXPlusWidth = Math.max(...spacingParts.map(part => part.#relativeToParentX + part.width));\r\n    // When minRelativeX > 0, the left boundary is still the element's origin (0).\r\n    // Only subtract negative offsets (e.g., indicator overhang).\r\n    const baseGlyphWidth = maxRelativeXPlusWidth - Math.min(0, minRelativeX);\r\n\r\n    return baseGlyphWidth;\r\n  }\r\n\r\n  get baseGroupWidth() {\r\n    if (this.#level !== 1) throw new Error('baseGroupWidth can only be called on group elements (level 1)');\r\n\r\n    const group = this;\r\n    const glyphs = group.#children;\r\n    if (glyphs.length === 0) return 0;\r\n\r\n    const firstGlyph = glyphs[0];\r\n    const lastGlyph = glyphs[glyphs.length - 1];\r\n    const lastGlyphBaseWidth = lastGlyph.baseGlyphWidth;\r\n    const baseGroupWidth = lastGlyph.#relativeToParentX + lastGlyphBaseWidth - firstGlyph.#relativeToParentX;\r\n\r\n    return baseGroupWidth;\r\n  }\r\n\r\n  get baseWidth() {\r\n    if (this.#level === 0) {\r\n      const groups = this.#children;\r\n      if (groups.length === 0) return 0;\r\n\r\n      const firstGroup = groups[0];\r\n      const lastGroup = groups[groups.length - 1];\r\n      const lastGroupBaseWidth = lastGroup.baseGroupWidth;\r\n      const baseWidth = lastGroup.#relativeToParentX + lastGroupBaseWidth - firstGroup.#relativeToParentX;\r\n      return baseWidth;\r\n    }\r\n\r\n    if (this.#level === 1) return this.baseGroupWidth;\r\n    if (this.#level === 2) return this.baseGlyphWidth;\r\n\r\n    return this.width;\r\n  }\r\n\r\n  get height() {\r\n    if (this.#leafHeight !== undefined) return this.#leafHeight;\r\n    if (this.#height !== undefined) {\r\n      return this.#height;\r\n    }\r\n    if (this.#level === 2) {\r\n      return 20;\r\n    }\r\n    if (this.#children && this.#children.length > 0) {\r\n      return Math.max(...this.#children.map(child => child.#relativeToParentY + child.height));\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  get baseX() {\r\n    if (this.#leafX !== undefined) return this.#leafX;\r\n    if (!this.#children || this.#children.length === 0) return 0;\r\n\r\n    return this.#relativeToParentX;\r\n  }\r\n\r\n  get x() {\r\n    if (this.#leafX !== undefined) return this.#leafX;\r\n    if (!this.#children || this.#children.length === 0) return 0;\r\n\r\n    const x = Math.min(\r\n      this.#relativeToParentX,\r\n      ...this.#children.map(child => this.#relativeToParentX + child.x)\r\n    );\r\n\r\n    return x;\r\n  }\r\n\r\n  get y() {\r\n    if (this.#level <= 1) return 0;\r\n    if (this.#leafY !== undefined) return this.#leafY;\r\n    if (!this.#children || this.#children.length === 0) return 0;\r\n\r\n    return Math.min(\r\n      this.#relativeToParentY,\r\n      ...this.#children.map(child => this.#relativeToParentY + child.y)\r\n    );\r\n  }\r\n\r\n  get isCharacter() {\r\n    return this.#isCharacter;\r\n  }\r\n\r\n  get char() {\r\n    return this.#char ?? \"\";\r\n  }\r\n\r\n  get kerningRules() {\r\n    return this.#blissObj.kerningRules || {};\r\n  }\r\n\r\n  get isIndicator() {\r\n    return this.#blissObj.isIndicator || false;\r\n  }\r\n\r\n  get isShape() {\r\n    return this.#isShape;\r\n  }\r\n\r\n  get isBlissGlyph() {\r\n    return this.#isBlissGlyph;\r\n  }\r\n\r\n  get isExternalGlyph() {\r\n    return this.#isExternalGlyph;\r\n  }\r\n\r\n  get isRoot() {\r\n    return this.#level === 0;\r\n  }\r\n\r\n  get isGroup() {\r\n    return this.#level === 1;\r\n  }\r\n\r\n  get isGlyph() {\r\n    return this.#level === 2;\r\n  }\r\n\r\n  get isPart() {\r\n    return this.#level >= 3;\r\n  }\r\n\r\n  get key() {\r\n    return this.#key;\r\n  }\r\n\r\n  /**\r\n   * Returns a frozen snapshot of this element's data.\r\n   * Snapshots are plain objects safe to expose publicly — no live references.\r\n   *\r\n   * @param {number} [parentOffsetX=0] - Accumulated x offset from ancestors\r\n   * @param {number} [parentOffsetY=0] - Accumulated y offset from ancestors\r\n   * @param {number} [index=0] - Index within parent's children\r\n   * @returns {Object} Frozen ElementSnapshot\r\n   */\r\n  snapshot(parentOffsetX = 0, parentOffsetY = 0, index = 0) {\r\n    const absX = parentOffsetX + this.#relativeToParentX;\r\n    const absY = parentOffsetY + this.#relativeToParentY;\r\n\r\n    let childSnapshots = (this.#children || []).map((child, i) =>\r\n      child.snapshot(absX, absY, i)\r\n    );\r\n\r\n    // For group elements (level 1): resolve isHeadGlyph so every word has exactly one.\r\n    // The parser only marks head glyphs in non-default cases (optimization for toString).\r\n    // The public API should always have exactly one isHeadGlyph per word.\r\n    if (this.#level === 1 && childSnapshots.length > 0) {\r\n      const hasExplicitHead = childSnapshots.some(c => c.isHeadGlyph);\r\n      if (!hasExplicitHead) {\r\n        // Default: first glyph is the head glyph\r\n        childSnapshots[0] = Object.freeze({ ...childSnapshots[0], isHeadGlyph: true });\r\n      }\r\n    }\r\n\r\n    const children = Object.freeze(childSnapshots);\r\n\r\n    return Object.freeze({\r\n      key: this.#key,\r\n      codeName: this.#codeName || '',\r\n      char: this.#char ?? '',\r\n      x: absX,\r\n      y: absY,\r\n      offsetX: this.#relativeToParentX,\r\n      offsetY: this.#relativeToParentY,\r\n      width: this.width,\r\n      height: this.height,\r\n      advanceX: this.#advanceX || 0,\r\n      baseWidth: this.baseWidth,\r\n      level: this.#level,\r\n      isRoot: this.#level === 0,\r\n      isGroup: this.#level === 1,\r\n      isGlyph: this.#level === 2,\r\n      isPart: this.#level >= 3,\r\n      bounds: Object.freeze(this.#calculateBounds(parentOffsetX, parentOffsetY)),\r\n      isIndicator: this.isIndicator,\r\n      isShape: !!this.#isShape,\r\n      isBlissGlyph: !!this.#isBlissGlyph,\r\n      isExternalGlyph: !!this.#isExternalGlyph,\r\n      isHeadGlyph: !!this.#blissObj.isHeadGlyph,\r\n      isSpaceGroup: !!this.#isSpaceGroup,\r\n      index,\r\n      parentKey: this.#parentElement ? this.#parentElement.#key : null,\r\n      children\r\n    });\r\n  }\r\n\r\n  get effectiveBounds() {\r\n    // Accumulate offsets from all ancestors\r\n    let offsetX = 0;\r\n    let offsetY = 0;\r\n    let current = this.#parentElement;\r\n    while (current) {\r\n      offsetX += current.#relativeToParentX;\r\n      offsetY += current.#relativeToParentY;\r\n      current = current.#parentElement;\r\n    }\r\n    return this.#calculateBounds(offsetX, offsetY);\r\n  }\r\n\r\n  #calculateBounds(offsetX, offsetY) {\r\n    const absX = offsetX + this.#relativeToParentX;\r\n    const absY = offsetY + this.#relativeToParentY;\r\n\r\n    if (this.#leafHeight !== undefined && this.#leafWidth !== undefined) {\r\n      const leafY = this.#leafY || 0;\r\n      const leafX = this.#leafX || 0;\r\n      const minX = absX + leafX;\r\n      const maxX = absX + leafX + this.#leafWidth;\r\n      const minY = absY + leafY;\r\n      const maxY = absY + leafY + this.#leafHeight;\r\n      return {\r\n        minX,\r\n        maxX,\r\n        minY,\r\n        maxY,\r\n        width: maxX - minX,\r\n        height: maxY - minY\r\n      };\r\n    }\r\n\r\n    if (!this.#children || this.#children.length === 0) {\r\n      return {\r\n        minX: absX,\r\n        maxX: absX,\r\n        minY: absY,\r\n        maxY: absY,\r\n        width: 0,\r\n        height: 0\r\n      };\r\n    }\r\n\r\n    const childBounds = this.#children.map(child =>\r\n      child.#calculateBounds(absX, absY)\r\n    );\r\n\r\n    const minX = Math.min(...childBounds.map(b => b.minX));\r\n    const maxX = Math.max(...childBounds.map(b => b.maxX));\r\n    const minY = Math.min(...childBounds.map(b => b.minY));\r\n    const maxY = Math.max(...childBounds.map(b => b.maxY));\r\n\r\n    return {\r\n      minX,\r\n      maxX,\r\n      minY,\r\n      maxY,\r\n      width: maxX - minX,\r\n      height: maxY - minY\r\n    };\r\n  }\r\n\r\n  toString() {\r\n    const obj = this.toJSON();\r\n\r\n    function traverse(obj, level = 1) {\r\n      if (!obj.elements) {\r\n          let str =  obj.codeName;\r\n          if (obj.x !== 0 || obj.y !== 0) {\r\n            str = `${str}:${obj.x},${obj.y}`;\r\n          }\r\n          return str;\r\n      }\r\n      \r\n      const delimiterMap = {\r\n          1: '//',\r\n          2: '/',\r\n          3: ';',\r\n      };\r\n\r\n      const results = obj.elements.map(subObj => traverse(subObj, level + 1)).join(delimiterMap[level]);\r\n  \r\n      return results;\r\n    }\r\n\r\n    return traverse(obj);\r\n  }\r\n\r\n  toJSON() {\r\n    let obj = {};\r\n\r\n    // B-code glyphs with a known code are emitted as leaf nodes (normalized)\r\n    // Shapes, external glyphs, and other named elements are also leaves\r\n    // Only unnamed composites (no codeName) recurse into children\r\n    if (this.#codeName) {\r\n        const element = {};\r\n        element.codeName = this.codeName;\r\n        element.width = this.width;\r\n        element.x = this.#relativeToParentX;\r\n        element.y = this.#relativeToParentY;\r\n        obj = element;\r\n    } else if (this.#children) {\r\n      obj.elements = []\r\n      for (const child of this.#children) {\r\n        obj.elements.push(child.toJSON());\r\n      }\r\n    }\r\n\r\n    return obj;\r\n  }\r\n\r\n\r\n  #handlePredefinedElement(definition) {\r\n    if (typeof definition?.getPath !== 'function') throw new Error('An element is only predefined if has a proper getPath function.');\r\n\r\n    // Surface 'XTXT_<chars>' (internal text-fallback routing key) as\r\n    // 'X<chars>' publicly. Internal lookup uses #blissObj.codeName.\r\n    const raw = this.#blissObj.codeName;\r\n    this.#codeName = (typeof raw === 'string' && raw.startsWith('XTXT_'))\r\n      ? 'X' + raw.slice(5)\r\n      : raw;\r\n    this.#extraPathOptions = definition.extraPathOptions || {}; //default: empty object\r\n    this.#isCharacter = !!definition.isCharacter;               //default: false\r\n    this.#isShape = !!definition.isShape;                      //default: false\r\n    this.#leafWidth = definition.width;\r\n    this.#leafHeight = definition.height;\r\n    this.#leafX = definition.x;\r\n    this.#leafY = definition.y;\r\n    \r\n    this.getSvgContent = (x = 0, y = 0) => {\r\n      // Build path options with inheritance: extraPathOptions < inherited < element-level\r\n      // Use #getInheritedOption for options which already handle the inheritance chain\r\n      const inheritedColor = this.#getInheritedOption('color');\r\n      const inheritedStrokeWidth = this.#getInheritedOption('strokeWidth');\r\n      const inheritedDotExtraWidth = this.#getInheritedOption('dotExtraWidth');\r\n\r\n      const pathOptions = {\r\n        ...this.#extraPathOptions,\r\n        ...(inheritedColor !== undefined && { color: inheritedColor }),\r\n        ...(inheritedStrokeWidth !== undefined && { baseStrokeWidth: inheritedStrokeWidth }),\r\n        ...(inheritedDotExtraWidth !== undefined && { extraDotWidth: inheritedDotExtraWidth })\r\n      };\r\n      const pathData = definition.getPath(\r\n        this.#relativeToParentX + x,\r\n        this.#relativeToParentY + y,\r\n        pathOptions\r\n      );\r\n\r\n      return BlissElement.#wrapWithAnchorAndGroup(pathData, this.#blissObj.options);\r\n    };\r\n  }\r\n\r\n  #handleCompositeElement(parts) {\r\n    if (this.#level > MAX_RECURSION_DEPTH) throw new Error('Maximum element nesting depth exceeded');\r\n    this.#children = [];\r\n\r\n    for (const part of parts) {\r\n      const child = new BlissElement(part, {\r\n        parentElement: this,\r\n        previousElement: this.#children[this.#children.length - 1],\r\n        level: this.#level + 1,\r\n        sharedOptions: this.#sharedOptions,\r\n      });\r\n      this.#children.push(child);\r\n    }\r\n\r\n    // Check if this is an indicator at level 3 that will be positioned by #positionIndicatorGroup\r\n    // If so, skip normalization here - let level 2 handle the positioning\r\n    const isIndicatorAtLevel3 = this.#level === 3 && this.isIndicator;\r\n\r\n    // Normalize: shift all child parts so the leftmost part starts at x=0\r\n    // Skip normalization for indicators that will be positioned by the parent's #positionIndicatorGroup\r\n    if (!isIndicatorAtLevel3 && this.#children.length > 0) {\r\n      const minX = Math.min(...this.#children.map(child => child.#relativeToParentX));\r\n      if (minX !== 0) {\r\n        for (const child of this.#children) {\r\n          child.#relativeToParentX -= minX;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Note: Indicator positioning (X and Y) is now handled at level 2 by #positionIndicatorGroup\r\n    // This method no longer needs to calculate indicator positions\r\n\r\n    this.#anchorOffsetX = this.#blissObj.anchorOffsetX || 0;\r\n    this.#anchorOffsetY = this.#blissObj.anchorOffsetY || 0;\r\n\r\n    this.getSvgContent = (x = 0, y = 0) => {\r\n      const childContents = this.#children.map(child =>\r\n        child.getSvgContent(this.#relativeToParentX + x, this.#relativeToParentY + y)\r\n      );\r\n\r\n      const hasTaggedContent = childContents.some(c => c.startsWith('<'));\r\n      const hasRawContent = childContents.some(c => !c.startsWith('<'));\r\n\r\n      const content = hasTaggedContent && hasRawContent\r\n        ? childContents.map(c => c.startsWith('<') ? c : `<path d=\"${c}\"/>`).join('')\r\n        : childContents.join('');\r\n\r\n      return BlissElement.#wrapWithAnchorAndGroup(content, this.#blissObj.options);\r\n    };\r\n  }\r\n}\r\n\r\n","/*\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\n/**\r\n * Bliss Head Glyph Exclusions\r\n *\r\n * Characters and sequences to skip when finding the head glyph (the character\r\n * that receives grammatical indicators).\r\n *\r\n * Priority hierarchy for head glyph selection (highest to lowest):\r\n * 1. Non-exclusions - always head if present\r\n * 2. Regular exclusions - head if no non-exclusions available\r\n * 3. Low-priority exclusions (B401, B699) - head only if alone or with same/lower priority\r\n * 4. Absolute never-head (B233) - can NEVER be head (structural marker like quotation marks)\r\n *\r\n * When prefix modifiers are used, it's recommended to mark the head glyph\r\n * explicitly with ^ to avoid ambiguity.\r\n *\r\n * Examples:\r\n * 'B486/B1108^' (narrowness)\r\n * 'B486/B1108;B86^' (narrow)\r\n */\r\n\r\n/**\r\n * Absolute never-head codes.\r\n * These can NEVER be head glyphs, even as a fallback.\r\n * They are purely structural markers (like quotation marks).\r\n */\r\nexport const absoluteNeverHead = [\r\n  'B233', // combine marker (structural, like quotation mark)\r\n];\r\n\r\n/**\r\n * Low-priority exclusions.\r\n * These are skipped as prefixes like regular exclusions, but can only be head\r\n * when alone or together with other low-priority codes (no regular exclusions present).\r\n */\r\nexport const lowPriorityExclusions = [\r\n  'B401', // exclamatory - when alone or with other B401s, can take indicator\r\n  'B699', // interrogative - when alone or with other B699s, can take indicator\r\n];\r\n\r\n/**\r\n * Conditional exceptions.\r\n * Format: [excludedCode, notExcludedWhenFollowedBy]\r\n * The excludedCode is NOT treated as an exclusion when immediately followed by\r\n * the specified code.\r\n */\r\nexport const conditionalExceptions = [\r\n  ['B10', 'B4'], // B10 (one) is NOT excluded when followed by B4\r\n];\r\n\r\n/**\r\n * Main exclusion list.\r\n * Characters and sequences to skip when finding the head glyph.\r\n * Includes all categories (regular, low-priority, and never-head).\r\n */\r\nexport const blissHeadGlyphExclusions = [\r\n  // Structural markers (absolute never-head)\r\n  'B233', // combine marker\r\n\r\n  // Pragmatic lexical markers (low-priority)\r\n  'B401', // exclamatory when used as a prefix, otherwise a specifier\r\n  'B699', // interrogative when used as a prefix, otherwise a specifier\r\n\r\n  // Scalar degree operators\r\n  'B937', // more (comparative)\r\n  'B968', // most (superlative)\r\n  'B6438', // less (comparative)\r\n  'B6321', // least (superlative)\r\n\r\n  // Identity-affecting operators\r\n  'B449/B401', // not (logical negation)\r\n  'B486', // opposite to (antonymy)\r\n\r\n  // Concept-transforming operators\r\n  'B1060/B578/B608/B292', // rhymes with\r\n  'B1060/B578/B303', // looks similar to\r\n  'B1060/B578/B608', // sounds similar to\r\n  'B1060/B578/B374', // feels similar to\r\n  'B1060/B578/B473', // smells similar to\r\n  'B1060/B578/B642', // tastes similar to\r\n  'B1060/B578', // similar to\r\n  'B578/B303', // looks like\r\n  'B578/B608', // sounds like\r\n  'B578/B374', // feels like\r\n  'B578/B473', // smells like\r\n  'B578/B642', // tastes like\r\n  'B348', // generalization of\r\n  'B444', // metaphor for\r\n\r\n  // Relational operators\r\n  'B449', // without (privative negation)\r\n  'B578', // same as\r\n  'B502/B167', // part of Blissymbol\r\n  'B502', // part of\r\n  'B102', // about\r\n  'B104', // across\r\n  'B109', // after\r\n  'B111', // against\r\n  'B120/B120', // along with\r\n  'B162/B368', // among\r\n  'B134', // around\r\n  'B135', // at\r\n  'B158', // before\r\n  'B162', // between\r\n  'B195', // by\r\n  'B482', // on\r\n  'B491', // out of (forward)\r\n  'B492', // out of (downward)\r\n  'B977', // out of (upward)\r\n  'B976', // out of (backward)\r\n  'B402', // into (forward)\r\n  'B1124', // into (downward)\r\n  'B1125', // into (upward)\r\n  'B1123', // into (backward)\r\n  'B490', // outside\r\n  'B398', // inside\r\n  'B493', // over, above\r\n  'B676', // under, below\r\n  'B1102', // under (ground level)\r\n  'B331', // instead of\r\n  'B332', // for the purpose of\r\n  'B337', // from\r\n  'B657', // to, toward\r\n  'B653', // through\r\n  'B677', // until\r\n  'B160', // belongs to\r\n\r\n  // Determiners\r\n  'B100', // a, an (indefinite)\r\n  'B647', // the (definite)\r\n\r\n  // Quantifiers\r\n  'B368/B368/B368', // many/much x3 (city)\r\n  'B368/B368', // many/much x2 (ocean, town)\r\n  'B368', // many/much (lake, village)\r\n  // pending: few (not yet in bliss-glyph-data.js)\r\n  'B117', // all\r\n  'B11/B117', // both\r\n  'B10/B117', // each/every\r\n  'B286', // either\r\n  'B449/B286', // neither\r\n  'B951', // half\r\n  'B962', // quarter\r\n  'B1151', // one third\r\n  'B1152', // two thirds\r\n  'B1153', // three quarters\r\n  'B559/B11', // several\r\n  'B9', // zero\r\n  'B10', // one (note: NOT excluded when followed by B4 - see conditionalExceptions)\r\n  'B11', // two\r\n  'B12', // three\r\n  'B13', // four\r\n  'B14', // five\r\n  'B15', // six\r\n  'B16', // seven\r\n  'B17', // eight\r\n  'B18', // nine\r\n];\r\n","/**\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { SEMANTIC_INDICATOR_ROOTS } from './bliss-constants.js';\r\n\r\n/**\r\n * Extract the bare B-code from a code string that may include\r\n * option prefixes (e.g. '[color=red]>B81') and position suffixes (':0,4').\r\n */\r\nexport function getBareCode(str) {\r\n  const partLevelMatch = str.match(/^(\\[.*?\\])>(.+)$/);\r\n  if (partLevelMatch) return partLevelMatch[2].split(':')[0].split(';')[0];\r\n  const optionsMatch = str.match(/^(\\[.*?\\])(?!>)/);\r\n  const code = optionsMatch ? str.slice(optionsMatch[1].length) : str;\r\n  return code.split(':')[0].split(';')[0];\r\n}\r\n\r\n/**\r\n * Get semantic indicator root from a list of indicator codes.\r\n * Returns the root B-code (e.g. 'B97') or null.\r\n */\r\nexport function getSemanticRoot(indicatorCodes, definitions) {\r\n  for (const ind of indicatorCodes) {\r\n    const bareInd = getBareCode(ind);\r\n    const indDef = definitions[bareInd];\r\n    if (indDef?.semanticIndicator) {\r\n      return SEMANTIC_INDICATOR_ROOTS[indDef.semanticIndicator];\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Check if any indicator in the list carries a semanticIndicator flag.\r\n */\r\nexport function hasSemantic(indicatorCodes, definitions) {\r\n  return indicatorCodes.some(ind => definitions[getBareCode(ind)]?.semanticIndicator);\r\n}\r\n\r\n/**\r\n * Filter codes to only include real indicators (isIndicator: true).\r\n * Non-indicator codes passed in indicator position are silently dropped.\r\n */\r\nexport function filterToIndicators(codes, definitions) {\r\n  return codes.filter(code => definitions[getBareCode(code)]?.isIndicator === true);\r\n}\r\n\r\n/**\r\n * Determine whether auto-preserved semantic root goes before or after new indicators.\r\n * Default: semantic first (nominal). If ALL non-semantic new indicators are verbal or\r\n * adjectival, semantic goes last (the word is being used as a verb/adjective).\r\n */\r\nexport function semanticGoesLast(newIndicatorCodes, definitions) {\r\n  const nonSemantic = newIndicatorCodes.filter(ind =>\r\n    !definitions[getBareCode(ind)]?.semanticIndicator);\r\n  return nonSemantic.length > 0 &&\r\n    nonSemantic.every(ind => {\r\n      const role = definitions[getBareCode(ind)]?.indicatorRole;\r\n      return role === 'verbal' || role === 'adjectival';\r\n    });\r\n}\r\n\r\n/**\r\n * Build the indicator list with semantic root in the correct position.\r\n * Returns an array (not a joined string) to preserve position coordinates\r\n * on individual codes (e.g. 'B86:0,4').\r\n */\r\nexport function buildWithSemantic(semanticRoot, newInds, definitions) {\r\n  return semanticGoesLast(newInds, definitions)\r\n    ? [...newInds, semanticRoot]\r\n    : [semanticRoot, ...newInds];\r\n}\r\n","/*\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { blissElementDefinitions, builtInCodes } from \"./bliss-element-definitions.js\";\r\nimport { hasPathData, createTextFallbackGlyph } from \"./bliss-shape-creators.js\";\r\nimport {\r\n  blissHeadGlyphExclusions,\r\n  absoluteNeverHead,\r\n  lowPriorityExclusions,\r\n  conditionalExceptions\r\n} from \"./bliss-head-glyph-exclusions.js\";\r\nimport {\r\n  getSemanticRoot,\r\n  hasSemantic,\r\n  filterToIndicators,\r\n  buildWithSemantic,\r\n  getBareCode\r\n} from \"./indicator-utils.js\";\r\nimport { MAX_RECURSION_DEPTH } from \"./bliss-constants.js\";\r\n\r\nexport class BlissParser {\r\n  static parse(codeStr, options) {\r\n      const result = this.fromString(codeStr);\r\n\r\n      if (options) {\r\n        result.options = {...result.options, ...options};\r\n      }\r\n\r\n      return result;\r\n  }\r\n\r\n  static #extractPositionFromOptions(obj) {\r\n    if (obj.options) {\r\n      if (obj.options.x !== undefined && obj.x === undefined) {\r\n        obj.x = Number(obj.options.x);\r\n      }\r\n      if (obj.options.y !== undefined && obj.y === undefined) {\r\n        obj.y = Number(obj.options.y);\r\n      }\r\n    }\r\n  }\r\n\r\n  static #parseOptions(optionsString) {\r\n    if (!optionsString) return;\r\n\r\n    const bracketMatch = optionsString.match(/\\[([^\\]]*)\\]/);\r\n    // Stryker disable next-line all: internal invariant, unreachable from public API\r\n    if (!bracketMatch) {\r\n      throw new Error(`#parseOptions: expected bracketed input, got: ${optionsString}`);\r\n    }\r\n    const extractedContent = bracketMatch[1];\r\n    if (!extractedContent) return;\r\n\r\n    const parsedObject = Object.create(null);\r\n\r\n    const regex = /([\\w-]+)(?:\\s*=\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|[^;]*))?/g;\r\n    let match;\r\n\r\n    while ((match = regex.exec(extractedContent)) !== null) {\r\n      const key = match[1].trim();\r\n\r\n      if (match[2] === undefined) {\r\n        // Bare key (e.g., [grid]) — treat as boolean true\r\n        parsedObject[key] = true;\r\n      } else {\r\n        let value = match[2].trim();\r\n\r\n        // Remove quotes and handle escapes for both double and single quotes\r\n        if (value.startsWith('\"') && value.endsWith('\"')) {\r\n          value = value.slice(1, -1).replace(/\\\\\"/g, '\"');\r\n        } else if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\r\n          value = value.slice(1, -1).replace(/\\\\'/g, \"'\");\r\n        }\r\n\r\n        parsedObject[key] = value;\r\n      }\r\n    }\r\n\r\n    return parsedObject;\r\n  }\r\n\r\n  static parsePartString(str, restoreFunction = (s) => s) {\r\n    const part = {};\r\n\r\n    let optionsString, codeString;\r\n    const match = str.match(/^(\\[.*?\\])>(.*)$/);\r\n    if (match) {\r\n      optionsString = match[1];\r\n      codeString = match[2];\r\n      part.options = this.#parseOptions(restoreFunction(optionsString));\r\n    } else {\r\n      codeString = str;\r\n    }\r\n\r\n    if (codeString) {\r\n      const matched = codeString.match(/^([a-zA-Z0-9\\u00C0-\\u017F\\u0370-\\u03FF\\u0400-\\u04FF\\-._]+)(?::(\\-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))?(?:,(\\-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))?)?)?$/);\r\n\r\n      if (matched) {\r\n        let [, code, x, y] = matched;\r\n        part.codeName = code;\r\n        x !== undefined && (part.x = Number(x));\r\n        y !== undefined && (part.y = Number(y));\r\n      } else {\r\n        part.error = `Invalid format: ${codeString}`;\r\n      }\r\n    }\r\n\r\n    return part;\r\n  }\r\n  static fromString(inputString) {\r\n    if (typeof inputString === 'string' && inputString.length > 10_000) {\r\n      throw new Error('Input string exceeds maximum length of 10,000 characters');\r\n    }\r\n    inputString = inputString.trim();\r\n    const result = {};\r\n    const parseWarnings = [];\r\n\r\n    // Parse a Blissymbolics string and convert it to an internal representation (BlissComposition)\r\n    //Ex. \r\n    //inputString = \"[stroke-width=0.4;stroke-width=0.3]||[stroke-width=0.2]|H:3,4;E:2,4{hej}/C8:0,8;[color=green]E:0,11{hopp}/AA8N:0,2\"\r\n    //inputString = \"[stroke-width=0.4;stroke-width=0.3]||[stroke-width=0.2]|H:3,4;E:2,4/C8:0,8;[color=green]E:0,11/AA8N:0,2{hej hopp}\"\r\n\r\n    let placeholderMap = {};\r\n    let placeholderCount = 0;\r\n\r\n    // Preserve content in both {...} and [...] to protect spaces\r\n    // {...} uses greedy match since it's always at the end and can contain any characters\r\n    // [...] uses non-greedy match since it can appear multiple times\r\n    inputString = inputString.replace(/\\{(.*)\\}|\\[([^\\]]*)\\]/g, (match, textContent, optionContent) => {\r\n      let placeholder = `PLACEHOLDER_${placeholderCount++}`;\r\n      if (textContent !== undefined) {\r\n        placeholderMap[placeholder] = { content: textContent, openBracket: '{', closeBracket: '}' };\r\n        return '{' + placeholder + '}';\r\n      } else {\r\n        placeholderMap[placeholder] = { content: optionContent, openBracket: '[', closeBracket: ']' };\r\n        return '[' + placeholder + ']';\r\n      }\r\n    });\r\n\r\n    // Remove all spaces in input string (but not in preserved content)\r\n    inputString = inputString.replace(/\\s/g, '');\r\n\r\n    // Helper function to restore placeholders in a string\r\n    const restorePlaceholders = (str) => {\r\n      if (!str) return str; // Handle undefined/null/empty (matches #parseOptions behavior)\r\n      return str.replace(/(\\{|\\[)PLACEHOLDER_(\\d+)(\\}|\\])/g, (match, open, num, close) => {\r\n        const placeholder = placeholderMap[`PLACEHOLDER_${num}`];\r\n        if (placeholder) {\r\n          const { content, openBracket, closeBracket } = placeholder;\r\n          return openBracket + content + closeBracket;\r\n        }\r\n        return match;\r\n      });\r\n    };\r\n\r\n    // Extract global options\r\n    let [_, globalOptionsString, globalCodeString] = inputString.match(/^\\s*(?:([^|]*)\\s*\\|\\|)?(.*)$/);\r\n    if (globalOptionsString && globalOptionsString.match(/^\\[.*\\]$/)) {\r\n      result.options = this.#parseOptions(restorePlaceholders(globalOptionsString)) || {};\r\n    } else {\r\n      if (globalOptionsString && globalOptionsString.length > 0) {\r\n        const restored = restorePlaceholders(globalOptionsString);\r\n        parseWarnings.push({\r\n          code: 'INVALID_GLOBAL_OPTIONS',\r\n          message: `Invalid global options syntax: \"${restored}||\" - expected [options]|| format. Ignoring.`,\r\n          source: restored,\r\n        });\r\n      }\r\n      result.options = {};\r\n    }\r\n\r\n    // Step 1: Replace // patterns with /SP/ (space placeholder)\r\n    // Each // adds one SP, /// adds two SPs, etc.\r\n    const normalized = globalCodeString.replace(/\\/{2,}/g, match =>\r\n      '/' + 'SP/'.repeat(match.length - 1)\r\n    );\r\n\r\n    // Step 2: Split on / and group consecutive items by type (space vs non-space)\r\n    const glyphCodes = normalized.split('/').filter(s => s !== '');\r\n    const isSpaceCode = code => code === 'SP' || code === 'TSP' || code === 'QSP';\r\n\r\n    const groupedCodes = []; // Array of { codes: [...], isSpace: boolean }\r\n    for (const code of glyphCodes) {\r\n      const isSpace = isSpaceCode(code);\r\n      const lastGroup = groupedCodes[groupedCodes.length - 1];\r\n      if (lastGroup && lastGroup.isSpace === isSpace) {\r\n        lastGroup.codes.push(code);\r\n      } else {\r\n        groupedCodes.push({ codes: [code], isSpace });\r\n      }\r\n    }\r\n\r\n    // Step 3: Build parsed groups, staging spaces for TSP/QSP resolution\r\n    const parsedGroups = [];\r\n    for (let gi = 0; gi < groupedCodes.length; gi++) {\r\n      const { codes, isSpace } = groupedCodes[gi];\r\n\r\n      if (isSpace) {\r\n        // Keep explicit spaces and mark implicit SP for the later TSP/QSP pass.\r\n        // See Step 4 below for SP -> TSP/QSP resolution.\r\n        const spaceGlyphs = codes.map(code => {\r\n          const fromSP = code === 'SP';\r\n          return { parts: [{ codeName: fromSP ? 'TSP' : code, _fromSP: fromSP }] };\r\n        });\r\n        parsedGroups.push({ glyphs: spaceGlyphs, _isSpaceGroup: true, _spaceIndex: gi });\r\n        continue;\r\n      }\r\n\r\n      // Non-space group: parse normally\r\n      const tpgs = codes.join('/');\r\n\r\n      let group = { glyphs: [] };\r\n\r\n      let [_, twoPartGroupString, textKey] = tpgs.match(/(.*?)(?:\\{(.*?(?<!\\\\))\\})?$/);\r\n\r\n      if (textKey) {\r\n        group.text = placeholderMap[textKey]?.content ?? textKey;\r\n      }\r\n\r\n      let groupCodeString;\r\n      if (twoPartGroupString.includes('|')) {\r\n        const [beforePipe, afterPipe] = twoPartGroupString.split(\"|\", 2);\r\n        if (beforePipe.match(/^\\[.*\\]$/)) {\r\n          group.options = this.#parseOptions(restorePlaceholders(beforePipe));\r\n          groupCodeString = afterPipe;\r\n        } else if (beforePipe.length > 0) {\r\n          const restoredBeforePipe = restorePlaceholders(beforePipe);\r\n          parseWarnings.push({\r\n            code: 'INVALID_GROUP_OPTIONS',\r\n            message: `Invalid group options syntax: \"${restoredBeforePipe}|\" - expected [options]| format. Ignoring.`,\r\n            source: restoredBeforePipe\r\n          });\r\n          groupCodeString = afterPipe;\r\n        } else {\r\n          groupCodeString = afterPipe;\r\n        }\r\n      } else {\r\n        groupCodeString = twoPartGroupString;\r\n      }\r\n\r\n      function processXCodes(codeString) {\r\n        // First, expand multi-char X-codes (like Xhello -> Xh/Xe/Xl/Xl/Xo or XTXT_héllo)\r\n        // Match Latin, Latin Extended, and Cyrillic letters\r\n        let expanded = codeString.replace(/X([a-zA-Z\\u00C0-\\u017F\\u0370-\\u03FF\\u0400-\\u04FF]{2,})/g, (match, chars, offset) => {\r\n          // Skip expansion when adjacent to ; — word expansion would break composition\r\n          const before = offset > 0 && codeString[offset - 1] === ';';\r\n          const after = offset + match.length < codeString.length && codeString[offset + match.length] === ';';\r\n          if (before || after) return match;\r\n\r\n          const allHavePath = [...chars].every(char => hasPathData(char));\r\n          if (allHavePath) {\r\n            return [...chars].map(char => `X${char}`).join('/');\r\n          } else {\r\n            return `XTXT_${chars}`;\r\n          }\r\n        });\r\n\r\n        // Then, process sequences of single-char X-codes (like Xh/Xé/Xl -> XTXT_hél if any needs fallback)\r\n        const parts = expanded.split('/');\r\n        const result = [];\r\n        let currentXSequence = [];\r\n\r\n        const flushXSequence = () => {\r\n          if (currentXSequence.length === 0) return;\r\n\r\n          if (currentXSequence.length === 1) {\r\n            const char = currentXSequence[0].slice(1);\r\n            if (hasPathData(char)) {\r\n              result.push(currentXSequence[0]);\r\n            } else {\r\n              result.push(`XTXT_${char}`);\r\n            }\r\n          } else {\r\n            const chars = currentXSequence.map(code => code.slice(1)).join('');\r\n            const allHavePath = [...chars].every(char => hasPathData(char));\r\n\r\n            if (allHavePath) {\r\n              currentXSequence.forEach(code => result.push(code));\r\n            } else {\r\n              result.push(`XTXT_${chars}`);\r\n            }\r\n          }\r\n          currentXSequence = [];\r\n        };\r\n\r\n        for (const part of parts) {\r\n          // Match single-char X-codes: Latin, Latin Extended, and Cyrillic letters\r\n          if (/^X[a-zA-Z\\u00C0-\\u017F\\u0370-\\u03FF\\u0400-\\u04FF]$/.test(part)) {\r\n            currentXSequence.push(part);\r\n          } else {\r\n            flushXSequence();\r\n            result.push(part);\r\n          }\r\n        }\r\n        flushXSequence();\r\n\r\n        return result.join('/');\r\n      }\r\n\r\n      function replaceWithDefinition(str, definitions) {\r\n        const wordCode = str;\r\n        let headGlyphFound = false;\r\n\r\n        // Helper: Find head glyph index (explicit marker or fallback skipping modifiers)\r\n        // Defined at top level for use in both ;; handling and expand()\r\n        const findHeadGlyphIndex = (parts) => {\r\n          // Check for explicit marker first\r\n          const explicitIndex = parts.findIndex(p => p.isHeadGlyph);\r\n          if (explicitIndex !== -1) return explicitIndex;\r\n\r\n          const getCode = (i) => parts[i].glyphCode || parts[i].part.split(';')[0];\r\n\r\n          // Check if exclusion applies (handles conditional exceptions like B10/B4)\r\n          const isExcluded = (code, index) => {\r\n            for (const [excl, notWhenFollowedBy] of conditionalExceptions) {\r\n              if (code === excl && index + 1 < parts.length && getCode(index + 1) === notWhenFollowedBy) {\r\n                return false;\r\n              }\r\n            }\r\n            return true;\r\n          };\r\n\r\n          // Skip modifier patterns from start\r\n          let startIndex = 0;\r\n          let foundMatch = true;\r\n          while (foundMatch && startIndex < parts.length) {\r\n            foundMatch = false;\r\n            for (const pattern of blissHeadGlyphExclusions) {\r\n              const codes = pattern.split('/');\r\n              if (startIndex + codes.length <= parts.length) {\r\n                let matches = true;\r\n                for (let i = 0; i < codes.length; i++) {\r\n                  const code = getCode(startIndex + i);\r\n                  if (code !== codes[i] || (codes.length === 1 && !isExcluded(code, startIndex + i))) {\r\n                    matches = false;\r\n                    break;\r\n                  }\r\n                }\r\n                if (matches) {\r\n                  startIndex += codes.length;\r\n                  foundMatch = true;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          if (startIndex < parts.length) return startIndex;\r\n\r\n          // All exclusions: find best head by priority (regular > low-priority > never-head)\r\n          let best = 0;\r\n          let bestPriority = absoluteNeverHead.includes(getCode(0)) ? 0 : lowPriorityExclusions.includes(getCode(0)) ? 1 : 2;\r\n          for (let i = 1; i < parts.length; i++) {\r\n            const code = getCode(i);\r\n            const priority = absoluteNeverHead.includes(code) ? 0 : lowPriorityExclusions.includes(code) ? 1 : 2;\r\n            if (priority > bestPriority || (priority === bestPriority && priority > 0)) {\r\n              best = i;\r\n              bestPriority = priority;\r\n            }\r\n          }\r\n          return best;\r\n        };\r\n\r\n        // Helper to get base code from expanded glyph, stripping only indicator parts.\r\n        // Non-indicator parts (glyph composition like B291;B303) are preserved.\r\n        // Defined at top level for use in both ;; handling and expand()\r\n        const getBaseCode = (glyph) => {\r\n          // Use glyphCode only if it's a simple code (no / or ; which indicate codeStrings/words)\r\n          // This preserves composite glyphs like B502 = 'DOT:2,10;HL4:0,12;DOT:2,14'\r\n          const isSimpleGlyphCode = glyph.glyphCode &&\r\n            !glyph.glyphCode.includes('/') &&\r\n            !glyph.glyphCode.includes(';');\r\n          if (isSimpleGlyphCode) return glyph.glyphCode;\r\n          const parts = glyph.part.split(';');\r\n          const nonIndicatorParts = parts.filter((p, i) => {\r\n            if (i === 0) return true;\r\n            const bareCode = p.split(':')[0];\r\n            return !definitions[bareCode]?.isIndicator;\r\n          });\r\n          return nonIndicatorParts.join(';');\r\n        };\r\n\r\n        // Extract only indicator codes from a glyph's part string (after the first ;)\r\n        const getIndicatorParts = (glyph) => {\r\n          return glyph.part.split(';').slice(1).filter(p => {\r\n            const bareCode = p.split(':')[0];\r\n            return definitions[bareCode]?.isIndicator === true;\r\n          });\r\n        };\r\n\r\n        // After ;; modifies a glyph's .part, update its identity (isBlissGlyph/glyphCode).\r\n        // If the new part is a bare known glyph, restore identity; otherwise clear it.\r\n        const updateGlyphIdentity = (expandedPart) => {\r\n          const bareCode = expandedPart.part.split(';')[0].split(':')[0];\r\n          const def = definitions[bareCode];\r\n          if (!expandedPart.part.includes(';') && def?.isBlissGlyph) {\r\n            expandedPart.isBlissGlyph = true;\r\n            if (def.glyphCode) expandedPart.glyphCode = def.glyphCode;\r\n          } else {\r\n            delete expandedPart.isBlissGlyph;\r\n            delete expandedPart.glyphCode;\r\n          }\r\n        };\r\n\r\n        // Helper: resolve codeString through aliases to check if it's a word\r\n        const resolveToFinalCodeString = (code, visited = new Set()) => {\r\n          if (visited.has(code)) return null;\r\n          visited.add(code);\r\n          const def = definitions[code];\r\n          if (!def?.codeString) return null;\r\n          if (!definitions[def.codeString]) return def.codeString;\r\n          return resolveToFinalCodeString(def.codeString, visited);\r\n        };\r\n\r\n        // Detect ;; for word-level indicators on inline multi-character expressions\r\n        // Pattern: baseCode;;indicators where indicators go on head glyph\r\n        // This enables word-level indicators without pre-defining words\r\n        const wordLevelMatch = str.match(/^(.+);;(.*)$/);\r\n        if (wordLevelMatch) {\r\n          const [_, baseCode, rawIndicators] = wordLevelMatch;\r\n          const forceStrip = rawIndicators.startsWith('!');\r\n          const indicators = forceStrip ? rawIndicators.slice(1) : rawIndicators;\r\n\r\n          // Process baseCode using the normal flow (splits on / and expands each part)\r\n          // This recursive call handles everything: definitions, ^markers, options, etc.\r\n          const expandedParts = baseCode.split('/').flatMap(strPart => expand(strPart, definitions));\r\n\r\n          if (expandedParts.length > 1) {\r\n            // Multiple glyphs: Apply indicators to head glyph\r\n            const targetIndex = findHeadGlyphIndex(expandedParts);\r\n            const existingInds = getIndicatorParts(expandedParts[targetIndex]);\r\n            const semanticRoot = !forceStrip ? getSemanticRoot(existingInds, definitions) : null;\r\n            const bareCode = getBaseCode(expandedParts[targetIndex]);\r\n\r\n            if (indicators) {\r\n              const newInds = filterToIndicators(indicators.split(';'), definitions);\r\n              if (newInds.length > 0) {\r\n                if (semanticRoot && !hasSemantic(newInds, definitions)) {\r\n                  expandedParts[targetIndex].part = bareCode + ';' + buildWithSemantic(semanticRoot, newInds, definitions).join(';');\r\n                } else {\r\n                  expandedParts[targetIndex].part = bareCode + ';' + newInds.join(';');\r\n                }\r\n              } else {\r\n                // All provided codes were non-indicators, treat as empty ;;\r\n                expandedParts[targetIndex].part = semanticRoot\r\n                  ? bareCode + ';' + semanticRoot\r\n                  : bareCode;\r\n              }\r\n            } else {\r\n              // Empty ;; or ;;! — preserve semantic root unless force-stripped\r\n              expandedParts[targetIndex].part = semanticRoot\r\n                ? bareCode + ';' + semanticRoot\r\n                : bareCode;\r\n            }\r\n\r\n            // ;; modified the indicator — update glyph identity to match the new part\r\n            updateGlyphIdentity(expandedParts[targetIndex]);\r\n\r\n            // Mark as head glyph if not default (index > 0) and not already marked\r\n            if (targetIndex > 0 && !expandedParts.some(p => p.isHeadGlyph)) {\r\n              expandedParts[targetIndex].isHeadGlyph = true;\r\n            }\r\n          } else if (expandedParts.length === 1) {\r\n            // Single glyph: ;; behaves like ; (attach or strip indicator on the single glyph)\r\n            const existingInds = getIndicatorParts(expandedParts[0]);\r\n            const semanticRoot = !forceStrip ? getSemanticRoot(existingInds, definitions) : null;\r\n            const baseCode = getBaseCode(expandedParts[0]);\r\n\r\n            if (indicators) {\r\n              const newInds = filterToIndicators(indicators.split(';'), definitions);\r\n              if (newInds.length > 0) {\r\n                if (semanticRoot && !hasSemantic(newInds, definitions)) {\r\n                  expandedParts[0].part = baseCode + ';' + buildWithSemantic(semanticRoot, newInds, definitions).join(';');\r\n                } else {\r\n                  expandedParts[0].part = baseCode + ';' + newInds.join(';');\r\n                }\r\n              } else {\r\n                expandedParts[0].part = semanticRoot\r\n                  ? baseCode + ';' + semanticRoot\r\n                  : baseCode;\r\n              }\r\n            } else {\r\n              expandedParts[0].part = semanticRoot\r\n                ? baseCode + ';' + semanticRoot\r\n                : baseCode;\r\n            }\r\n\r\n            // ;; modified the indicator — update glyph identity to match the new part\r\n            updateGlyphIdentity(expandedParts[0]);\r\n          }\r\n\r\n          return expandedParts;\r\n        }\r\n\r\n        // isTopLevel: true for user input, false for internal codeString expansion\r\n        // Indicator replacement only applies at top level (user input)\r\n        function expand(str, definitions, isTopLevel = true, depth = 0) {\r\n          if (depth > MAX_RECURSION_DEPTH) throw new Error('Maximum recursion depth exceeded');\r\n          let isHeadGlyph = false;\r\n          if (str.endsWith('^')) {\r\n            if (!headGlyphFound) {\r\n              isHeadGlyph = true;\r\n              headGlyphFound = true;\r\n            } else {\r\n              parseWarnings.push({ code: 'MULTIPLE_HEAD_MARKERS', message: `Multiple head markers (^) found in word: ${wordCode}. Using first marked glyph.`, source: wordCode });\r\n            }\r\n            str = str.slice(0, -1);\r\n          }\r\n\r\n          // Handle part-level options with > (like [x=2]>B291 or [color=red]>XW)\r\n          const partLevelMatch = str.match(/^(\\[.*?\\])>(.+)$/);\r\n          if (partLevelMatch) {\r\n            const codeForKerning = partLevelMatch[2].split(':')[0];\r\n            const definition = definitions[codeForKerning] || {};\r\n            return [{\r\n              part: str,\r\n              ...(isHeadGlyph && { isHeadGlyph }),\r\n              ...(definition.isExternalGlyph && { isExternalGlyph: definition.isExternalGlyph }),\r\n              ...(definition.char && { char: definition.char }),\r\n              ...(definition.kerningRules && { kerningRules: definition.kerningRules }),\r\n            }];\r\n          }\r\n\r\n          // Strip leading glyph-level bracket options\r\n          const optionsMatch = str.match(/^(\\[.*?\\])(?!>)/);\r\n          const optionsPrefix = optionsMatch ? optionsMatch[1] : '';\r\n          const codeForLookup = optionsPrefix ? str.slice(optionsPrefix.length) : str;\r\n\r\n          const [potentialBaseCodeRaw, ...rawIndicators] = codeForLookup.split(';');\r\n          // Detect force-strip modifier (! prefix on first indicator)\r\n          const forceStrip = rawIndicators.length > 0 && rawIndicators[0]?.startsWith('!');\r\n          if (forceStrip) rawIndicators[0] = rawIndicators[0].slice(1);\r\n          const filteredIndicators = rawIndicators.filter(ind => ind !== '');\r\n          const hasInputIndicators = rawIndicators.length > 0;\r\n\r\n          // Strip position modifier (e.g. \":2,0\" or \":-1.5,3\") from base code\r\n          // so definition lookup works for codes like \"WORD:2,0\"\r\n          const posMatch = potentialBaseCodeRaw.match(\r\n            /^(.+?)(:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:,-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))?)$/\r\n          );\r\n          const potentialBaseCode = posMatch ? posMatch[1] : potentialBaseCodeRaw;\r\n          const positionSuffix = posMatch ? posMatch[2] : '';\r\n\r\n          const resolvedCodeString = resolveToFinalCodeString(potentialBaseCode);\r\n          const isWordDefinition = resolvedCodeString?.includes('/') ?? false;\r\n\r\n          // Check if input indicators are real indicators (for replacement)\r\n          const inputIndicatorsAreReal = filteredIndicators.length > 0 &&\r\n            filteredIndicators.every(ind => definitions[getBareCode(ind)]?.isIndicator === true);\r\n\r\n          // Check if base code supports indicator replacement\r\n          const baseCodeDef = definitions[potentialBaseCode];\r\n          const baseCodeStringParts = baseCodeDef?.codeString?.split(';') || [];\r\n          const baseCodeExistingIndicators = baseCodeStringParts.slice(1).map(p => p.split(':')[0]);\r\n          const baseCodeSupportsReplacement = baseCodeExistingIndicators.length > 0 &&\r\n            baseCodeExistingIndicators.every(ind => definitions[ind]?.isIndicator === true);\r\n\r\n          // Don't apply indicator replacement to compound indicators (like B928 = B92;B87)\r\n          // These are indicators composed of multiple indicator parts, not characters with replaceable indicators\r\n          const baseIsCompoundIndicator = baseCodeDef?.isIndicator === true;\r\n\r\n          // Indicator replacement: only for top-level, non-words, with matching indicator types\r\n          // Skip if the base code itself is an indicator (compound indicators should keep their structure)\r\n          const canModifyIndicators = isTopLevel && !isWordDefinition && baseCodeSupportsReplacement && !baseIsCompoundIndicator;\r\n          const shouldReplace = canModifyIndicators && inputIndicatorsAreReal;\r\n          const shouldRemove = canModifyIndicators && hasInputIndicators && filteredIndicators.length === 0;\r\n          // Bare empty strip: trailing ; with no indicator, on any code (even without a known indicator in its definition).\r\n          // The user has no way to know if a B-code has a baked-in indicator, so empty ; must never warn.\r\n          const isBareEmptyStrip = !shouldRemove && hasInputIndicators && filteredIndicators.length === 0;\r\n\r\n          // Use base code lookup for words, or when replacing/removing indicators\r\n          const useBaseCodeLookup = isWordDefinition || shouldReplace || shouldRemove || isBareEmptyStrip;\r\n          const definition = useBaseCodeLookup\r\n            ? (definitions[potentialBaseCode] || {})\r\n            : codeForLookup.startsWith('XTXT_')\r\n              ? (() => { const g = createTextFallbackGlyph(codeForLookup.slice(5)); g.isShape = true; return g; })()\r\n              : (definitions[codeForLookup] || {});\r\n\r\n          // If we have a codeString, recursively expand it\r\n          if (definition.codeString) {\r\n            let codeStringToExpand = definition.codeString;\r\n\r\n            // Modify codeString for indicator replacement/removal\r\n            if (shouldReplace || shouldRemove) {\r\n              const codeStringParts = definition.codeString.split(';');\r\n              const existingIndicatorCodes = codeStringParts.slice(1).map(p => p.split(':')[0]);\r\n              const semanticRoot = !forceStrip ? getSemanticRoot(existingIndicatorCodes, definitions) : null;\r\n\r\n              codeStringToExpand = codeStringParts[0];\r\n              if (filteredIndicators.length > 0) {\r\n                if (semanticRoot && !hasSemantic(filteredIndicators, definitions)) {\r\n                  codeStringToExpand += ';' + buildWithSemantic(semanticRoot, filteredIndicators, definitions).join(';');\r\n                } else {\r\n                  codeStringToExpand += ';' + filteredIndicators.join(';');\r\n                }\r\n              } else if (semanticRoot) {\r\n                // shouldRemove but preserve semantic root\r\n                codeStringToExpand += ';' + semanticRoot;\r\n              }\r\n            }\r\n\r\n            // Built-in single-character codes: skip expansion, let parseParts handle it.\r\n            // This eliminates the flatten-then-unflatten pattern where expand() substitutes\r\n            // a B-code's codeString (e.g. B291 → \"S8:0,8\") only for a later wrapping patch\r\n            // to reconstruct the nesting. Word codes (codeString with /) must still be\r\n            // expanded here because word decomposition produces multiple glyphs.\r\n            // Indicator modification (shouldReplace/shouldRemove) must still expand because\r\n            // the codeString is being modified, not just passed through.\r\n            if (builtInCodes.has(potentialBaseCode)\r\n                && !codeStringToExpand.includes('/')\r\n                && !shouldReplace && !shouldRemove) {\r\n              return [{\r\n                part: isBareEmptyStrip\r\n                  ? optionsPrefix + potentialBaseCode + positionSuffix\r\n                  : str.replace(/;$/, ''),\r\n                ...(definition.shrinksPrecedingWordSpace === true && { shrinksPrecedingWordSpace: true }),\r\n                ...(definition.isIndicator === true && { isIndicator: true }),\r\n                ...(definition.isExternalGlyph && { isExternalGlyph: definition.isExternalGlyph }),\r\n                ...(definition.char && { char: definition.char }),\r\n                ...(definition.kerningRules && { kerningRules: definition.kerningRules }),\r\n                ...(definition.glyphCode && { glyphCode: definition.glyphCode }),\r\n                ...(definition.isBlissGlyph && { isBlissGlyph: definition.isBlissGlyph }),\r\n                ...(isHeadGlyph && { isHeadGlyph }),\r\n                ...(definition.defaultOptions && { defaultOptions: definition.defaultOptions }),\r\n              }];\r\n            }\r\n\r\n            // Handle // in codeString: split into word segments with break markers\r\n            if (codeStringToExpand.includes('//')) {\r\n              const wordSegments = codeStringToExpand.split('//');\r\n              const allParts = [];\r\n              for (let i = 0; i < wordSegments.length; i++) {\r\n                if (i > 0) allParts.push({ part: '', _wordBreak: true });\r\n                const segmentParts = wordSegments[i].split('/')\r\n                  .flatMap(s => expand(s, definitions, false, depth + 1));\r\n                allParts.push(...segmentParts);\r\n              }\r\n              // Apply position suffix to first non-break part\r\n              if (positionSuffix && allParts.length > 0) {\r\n                const firstReal = allParts.find(p => !p._wordBreak);\r\n                if (firstReal) {\r\n                  const semiParts = firstReal.part.split(';');\r\n                  if (!/:-?[\\d.]/.test(semiParts[0])) {\r\n                    semiParts[0] += positionSuffix;\r\n                  }\r\n                  firstReal.part = semiParts.join(';');\r\n                }\r\n              }\r\n              if (isHeadGlyph && allParts.length > 0) {\r\n                allParts[0].isHeadGlyph = true;\r\n              }\r\n              if (optionsPrefix && allParts.length > 0) {\r\n                allParts[0].part = optionsPrefix + allParts[0].part;\r\n              }\r\n              return allParts;\r\n            }\r\n\r\n            // First expand to get all parts (including nested expansions)\r\n            const rawExpandedParts = codeStringToExpand.split('/')\r\n              .flatMap(subStr => expand(subStr, definitions, false, depth + 1));\r\n\r\n            // Check if final expansion has multiple glyphs (word vs single-character composite)\r\n            // This covers nested aliases like TestAlias → TestWord1 → H/C\r\n            const isMultiGlyphWord = rawExpandedParts.length > 1;\r\n\r\n            const expandedParts = rawExpandedParts.map(expandedSubPart => {\r\n                // Apply properties from the definition, falling back to existing values\r\n                const isIndicator = definition.isIndicator ?? expandedSubPart.isIndicator;\r\n                const isExternalGlyph = expandedSubPart.isExternalGlyph;\r\n                const kerningRules = definition.kerningRules ?? expandedSubPart.kerningRules;\r\n                const char = expandedSubPart.char;\r\n                const shrinksPrecedingWordSpace = definition.shrinksPrecedingWordSpace;\r\n                // For multi-glyph words, each part keeps its own glyphCode.\r\n                // For single-character composites: outer definition's glyphCode wins\r\n                // (preserves custom glyph identity, e.g., LOVE wrapping B431).\r\n                const glyphCode = isMultiGlyphWord\r\n                  ? expandedSubPart.glyphCode\r\n                  : (definition.glyphCode ?? expandedSubPart.glyphCode);\r\n                const isBlissGlyph = expandedSubPart.isBlissGlyph ?? definition.isBlissGlyph;\r\n                return {\r\n                  part: expandedSubPart.part,\r\n                  ...(shrinksPrecedingWordSpace === true && { shrinksPrecedingWordSpace }),\r\n                  ...(isIndicator === true && { isIndicator }),\r\n                  ...(isExternalGlyph && { isExternalGlyph }),\r\n                  ...(char && { char }),\r\n                  ...(kerningRules && { kerningRules }),\r\n                  ...(glyphCode && { glyphCode }),\r\n                  ...(isBlissGlyph && { isBlissGlyph }),\r\n                  ...(expandedSubPart.isHeadGlyph && { isHeadGlyph: expandedSubPart.isHeadGlyph }),\r\n                  ...(expandedSubPart.defaultOptions && { defaultOptions: expandedSubPart.defaultOptions })\r\n                };\r\n              });\r\n\r\n            // Handle WORD;INDICATORS syntax (only for multi-glyph words, not single characters)\r\n            // Single characters with indicators are handled by parseParts later\r\n            // Use expandedParts.length to detect words (covers aliases like TestAlias → TestWord1 → H^/C)\r\n            if (expandedParts.length > 1 && filteredIndicators.length > 0) {\r\n              // It's a word (multiple glyphs) - strip and replace indicators on head glyph\r\n              // Only use codes that are real indicators\r\n              const validInds = filterToIndicators(filteredIndicators, definitions);\r\n              if (validInds.length > 0) {\r\n                const targetIndex = findHeadGlyphIndex(expandedParts);\r\n                const existingInds = getIndicatorParts(expandedParts[targetIndex]);\r\n                const semanticRoot = !forceStrip ? getSemanticRoot(existingInds, definitions) : null;\r\n                const baseCode = getBaseCode(expandedParts[targetIndex]);\r\n\r\n                // Reattach with new indicators, preserving semantic root when appropriate\r\n                if (semanticRoot && !hasSemantic(validInds, definitions)) {\r\n                  expandedParts[targetIndex].part = baseCode + ';' + buildWithSemantic(semanticRoot, validInds, definitions).join(';');\r\n                } else {\r\n                  expandedParts[targetIndex].part = baseCode + ';' + validInds.join(';');\r\n                }\r\n              }\r\n              // If no valid indicators, don't modify the head glyph at all\r\n            }\r\n\r\n            // Handle WORD; (empty indicators) - strip from head glyph of multi-glyph words\r\n            // Single-char cases are handled by: shouldRemove (if definition has real indicators)\r\n            // or isBareEmptyStrip (if no real indicator in definition, via base case return)\r\n            if (expandedParts.length > 1 && rawIndicators.length > 0 && filteredIndicators.length === 0) {\r\n              const targetIndex = findHeadGlyphIndex(expandedParts);\r\n              const existingInds = getIndicatorParts(expandedParts[targetIndex]);\r\n              const semanticRoot = !forceStrip ? getSemanticRoot(existingInds, definitions) : null;\r\n              const baseCode = getBaseCode(expandedParts[targetIndex]);\r\n\r\n              expandedParts[targetIndex].part = semanticRoot\r\n                ? baseCode + ';' + semanticRoot\r\n                : baseCode;\r\n            }\r\n\r\n            // Apply isHeadGlyph to the first expanded part only (explicit ^ marker)\r\n            if (isHeadGlyph && expandedParts.length > 0) {\r\n              expandedParts[0].isHeadGlyph = true;\r\n            }\r\n\r\n            // For words without explicit marker: set isHeadGlyph only if fallback finds non-default (index > 0)\r\n            // This keeps data clean for toString() - only mark when deviating from default\r\n            if (!isHeadGlyph && expandedParts.length > 1 && !expandedParts.some(p => p.isHeadGlyph)) {\r\n              const fallbackIndex = findHeadGlyphIndex(expandedParts);\r\n              if (fallbackIndex > 0) {\r\n                expandedParts[fallbackIndex].isHeadGlyph = true;\r\n              }\r\n            }\r\n\r\n            // Apply position suffix from outer code (e.g. WORD:2,0) to first glyph's first part\r\n            if (positionSuffix && expandedParts.length > 0) {\r\n              const firstPart = expandedParts[0].part;\r\n              const semiParts = firstPart.split(';');\r\n              // Only add position if the first sub-part doesn't already have coordinates\r\n              if (!/:-?[\\d.]/.test(semiParts[0])) {\r\n                semiParts[0] += positionSuffix;\r\n              }\r\n              expandedParts[0].part = semiParts.join(';');\r\n            }\r\n\r\n            // Carry defaultOptions from the definition as data on the first expanded part\r\n            if (definition.defaultOptions && expandedParts.length > 0) {\r\n              expandedParts[0].defaultOptions = definition.defaultOptions;\r\n            }\r\n\r\n            // Prepend options to the first expanded part\r\n            if (optionsPrefix && expandedParts.length > 0) {\r\n              expandedParts[0].part = optionsPrefix + expandedParts[0].part;\r\n            }\r\n            return expandedParts;\r\n          }\r\n\r\n          // Base case - create object with properties from definition\r\n          const isIndicator = definition.isIndicator;\r\n          const isExternalGlyph = definition.isExternalGlyph;\r\n          const kerningRules = definition.kerningRules;\r\n          const char = definition.char;\r\n          const glyphCode = definition.glyphCode;\r\n          const isBlissGlyph = definition.isBlissGlyph;\r\n          const shrinksPrecedingWordSpace = definition.shrinksPrecedingWordSpace;\r\n          return [{\r\n            part: isBareEmptyStrip ? optionsPrefix + potentialBaseCode + positionSuffix : str.replace(/;$/, ''),\r\n            ...(shrinksPrecedingWordSpace === true && { shrinksPrecedingWordSpace }),\r\n            ...(isIndicator === true && { isIndicator }),\r\n            ...(isExternalGlyph && { isExternalGlyph }),\r\n            ...(char && { char }),\r\n            ...(kerningRules && { kerningRules }),\r\n            ...(glyphCode && { glyphCode }),\r\n            ...(isBlissGlyph && { isBlissGlyph }),\r\n            ...(isHeadGlyph && { isHeadGlyph })\r\n          }];\r\n        }\r\n\r\n        const expandedParts = str.split('/').flatMap(strPart => expand(strPart, definitions));\r\n\r\n        // Run head glyph detection on top-level multi-glyph words\r\n        if (expandedParts.length > 1 && !expandedParts.some(p => p.isHeadGlyph)) {\r\n          const fallbackIndex = findHeadGlyphIndex(expandedParts);\r\n          if (fallbackIndex > 0) {\r\n            expandedParts[fallbackIndex].isHeadGlyph = true;\r\n          }\r\n        }\r\n\r\n        return expandedParts;\r\n      }\r\n\r\n      const processedGroupCodeString = processXCodes(groupCodeString);\r\n      const expandedGlyphParts = replaceWithDefinition(processedGroupCodeString, blissElementDefinitions);\r\n\r\n      let pendingRelativeKerning;\r\n      let pendingAbsoluteKerning;\r\n\r\n      for (let { part, shrinksPrecedingWordSpace, isIndicator, isExternalGlyph, char, kerningRules, glyphCode, isBlissGlyph, isHeadGlyph, defaultOptions, _wordBreak } of expandedGlyphParts) {\r\n        // Word break marker from // in bare alias codeString:\r\n        // push current group, add a default space group, start a new group\r\n        if (_wordBreak) {\r\n          if (group.glyphs.length > 0) {\r\n            this.#extractPositionFromOptions(group);\r\n            parsedGroups.push(group);\r\n          }\r\n          parsedGroups.push({ glyphs: [{ parts: [{ codeName: 'SP', _fromSP: true }] }], _isSpaceGroup: true, _spaceIndex: parsedGroups.length });\r\n          group = { glyphs: [] };\r\n          continue;\r\n        }\r\n        if (part === \"\") continue;\r\n\r\n        const glyphObj = {\r\n          parts: [],\r\n          ...(shrinksPrecedingWordSpace === true && { shrinksPrecedingWordSpace }),\r\n          ...(typeof isIndicator === \"boolean\" && { isIndicator }),\r\n          ...(typeof isExternalGlyph === \"boolean\" && { isExternalGlyph }),\r\n          ...(typeof char === \"string\" && { char }),\r\n          ...((kerningRules !== null && kerningRules?.constructor === Object) && { kerningRules }),\r\n          ...(typeof glyphCode === \"string\" && { glyphCode }),\r\n          ...(isBlissGlyph === true && { isBlissGlyph }),\r\n          ...(isHeadGlyph === true && { isHeadGlyph })\r\n        };\r\n\r\n        const kerningMatch = part.match(/^(RK|AK)(?::([+-]?\\d+(?:\\.\\d+)?))?$/);\r\n        if (kerningMatch) {\r\n          const [_, kerningType, kerningValue = 0] = kerningMatch;\r\n          if (kerningType === \"RK\") pendingRelativeKerning = Number(kerningValue);\r\n          if (kerningType === \"AK\") pendingAbsoluteKerning = Number(kerningValue);\r\n          continue;\r\n        }\r\n\r\n        if (pendingRelativeKerning !== undefined) {\r\n          (glyphObj.options ??= {}).relativeKerning = pendingRelativeKerning;\r\n          pendingRelativeKerning = undefined;\r\n        }\r\n\r\n        if (pendingAbsoluteKerning !== undefined) {\r\n          (glyphObj.options ??= {}).absoluteKerning = pendingAbsoluteKerning;\r\n          pendingAbsoluteKerning = undefined;\r\n        }\r\n\r\n        // Merge defaultOptions carried from expand() (standalone/composition case)\r\n        if (defaultOptions) {\r\n          glyphObj.options = { ...defaultOptions, ...(glyphObj.options || {}) };\r\n        }\r\n\r\n        let glyphCodeString = part;\r\n        const glyphMatch = part.match(/^(\\[.*?\\])(?!>)(.*)/);\r\n        if (glyphMatch) {\r\n          const parsedOptions = this.#parseOptions(restorePlaceholders(glyphMatch[1]));\r\n          glyphObj.options = { ...glyphObj.options, ...parsedOptions };\r\n          glyphCodeString = glyphMatch[2];\r\n        }\r\n\r\n        const parseParts = (partsString, depth = 0) => {\r\n          if (depth > MAX_RECURSION_DEPTH) throw new Error('Maximum recursion depth exceeded');\r\n          const parts = [];\r\n\r\n          // Split on ; (brackets are already replaced with placeholders at this point)\r\n          const twoPartPartStrings = partsString.split(';');\r\n          for (const twoPartPartString of twoPartPartStrings) {\r\n            const part = this.parsePartString(twoPartPartString, restorePlaceholders);\r\n\r\n            const definition = part.codeName?.startsWith('XTXT_')\r\n              ? (() => { const g = createTextFallbackGlyph(part.codeName.slice(5)); g.isShape = true; return g; })()\r\n              : (blissElementDefinitions[part.codeName] || {});\r\n            const codeString = definition.codeString;\r\n\r\n            if (codeString) {\r\n              if (codeString.includes('/')) {\r\n                // Word codeString at part level — cannot be expanded here.\r\n                // Keep original codeName; post-parse decomposition resolves it.\r\n              } else if (codeString.includes(';') || codeString.includes(':') || blissElementDefinitions[codeString]?.codeString ) {\r\n                part.parts = parseParts(definition.codeString, depth + 1);\r\n                // Keep part.codeName to preserve identifier alongside expansion\r\n              } else {\r\n                part.codeName = definition.codeString;\r\n              }\r\n            }\r\n\r\n            // Detect unexpanded multi-char X-codes (word text used as ; part)\r\n            if (/^X[a-zA-Z\\u00C0-\\u017F\\u0370-\\u03FF\\u0400-\\u04FF]{2,}$/.test(part.codeName)) {\r\n              part.error = `Multi-character text \"${part.codeName.slice(1)}\" is a word and cannot be composed with ;`;\r\n              part.errorCode = 'WORD_AS_PART';\r\n            }\r\n\r\n            BlissParser.#applyDefinitionMetadata(part, definition);\r\n\r\n            this.#extractPositionFromOptions(part);\r\n            parts.push(part);\r\n          }\r\n          return parts;\r\n        };\r\n\r\n        glyphObj.parts = parseParts(glyphCodeString);\r\n\r\n        this.#extractPositionFromOptions(glyphObj);\r\n        group.glyphs.push(glyphObj);\r\n      }\r\n\r\n      this.#extractPositionFromOptions(group);\r\n      parsedGroups.push(group);\r\n    }\r\n\r\n    // Step 4: Resolve SP→QSP for space groups before punctuation\r\n    // For implicit spaces (_fromSP): change code to QSP\r\n    // For explicit spaces: compare against default and flag _differsFromDefault\r\n    for (let i = 0; i < parsedGroups.length; i++) {\r\n      const group = parsedGroups[i];\r\n      if (group._isSpaceGroup) {\r\n        // Determine default space code for this position\r\n        const nextGroup = parsedGroups[i + 1];\r\n        const isPunctuation = nextGroup && !nextGroup._isSpaceGroup &&\r\n          (nextGroup.glyphs?.every(g => g.shrinksPrecedingWordSpace === true) ?? false);\r\n        const defaultCode = isPunctuation ? 'QSP' : 'TSP';\r\n\r\n        for (const glyph of group.glyphs) {\r\n          const part = glyph.parts[0];\r\n          if (part._fromSP) {\r\n            // Implicit space: resolve to default\r\n            part.codeName = defaultCode;\r\n          } else {\r\n            // Explicit space: flag if it differs from default\r\n            if (part.codeName !== defaultCode) {\r\n              part._differsFromDefault = true;\r\n            }\r\n          }\r\n          delete part._fromSP;\r\n        }\r\n      }\r\n      // Clean up internal markers\r\n      delete group._isSpaceGroup;\r\n      delete group._spaceIndex;\r\n    }\r\n\r\n    result.groups = parsedGroups;\r\n\r\n    if (parseWarnings.length) result._parseWarnings = parseWarnings;\r\n    this.#extractPositionFromOptions(result);\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Walk a blissObj structure and expand any PARTs that have a codeName\r\n   * but no sub-parts. This supports toJSON round-trips where nested\r\n   * parts were stripped.\r\n   *\r\n   * @param {Object} blissObj - Raw parsed structure with groups/glyphs/parts\r\n   * @returns {Object} The same object, mutated with expanded parts\r\n   */\r\n  static expandParts(blissObj) {\r\n    if (!blissObj?.groups) return blissObj;\r\n    for (const group of blissObj.groups) {\r\n      if (!group.glyphs) continue;\r\n      for (const glyph of group.glyphs) {\r\n        if (!glyph.parts) continue;\r\n        for (const part of glyph.parts) {\r\n          BlissParser.#expandPartRecursive(part);\r\n        }\r\n      }\r\n    }\r\n    return blissObj;\r\n  }\r\n\r\n  /**\r\n   * Copy definition metadata (defaultOptions, indicator, anchor offsets)\r\n   * onto a part object. Shared by parseParts, #expandPartRecursive, and\r\n   * #parseCodeStringToParts to keep the logic in one place.\r\n   */\r\n  static #applyDefinitionMetadata(part, definition) {\r\n    if (definition.defaultOptions) {\r\n      part.options = { ...definition.defaultOptions, ...(part.options || {}) };\r\n    }\r\n    if (definition.isIndicator) {\r\n      part.isIndicator = true;\r\n      part.width = definition.width ?? 2;\r\n    } else if (definition.anchorOffsetY !== undefined) {\r\n      part.anchorOffsetY = definition.anchorOffsetY;\r\n    }\r\n    if (definition.anchorOffsetX !== undefined) {\r\n      part.anchorOffsetX = definition.anchorOffsetX;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Recursively expand a single part from its definition's codeString.\r\n   * Only expands if the part has a codeName, a matching definition with\r\n   * codeString, and no existing sub-parts.\r\n   */\r\n  static #expandPartRecursive(part) {\r\n    if (!part.codeName || part.parts?.length > 0) return;\r\n\r\n    const definition = blissElementDefinitions[part.codeName];\r\n    if (!definition?.codeString) return;\r\n\r\n    const codeString = definition.codeString;\r\n\r\n    // Skip word-level codeStrings (contain /) — handled by word-as-part decomposition\r\n    if (codeString.includes('/')) return;\r\n\r\n    if (codeString.includes(';') || codeString.includes(':') || blissElementDefinitions[codeString]?.codeString) {\r\n      part.parts = BlissParser.#parseCodeStringToParts(codeString);\r\n    } else {\r\n      part.codeName = codeString;\r\n    }\r\n\r\n    BlissParser.#applyDefinitionMetadata(part, definition);\r\n  }\r\n\r\n  /**\r\n   * Parse a codeString like \"HL8;HL8:0,8;VL8;VL8:8,0\" into an array\r\n   * of part objects, recursively expanding nested definitions.\r\n   */\r\n  static #parseCodeStringToParts(codeString, depth = 0) {\r\n    if (depth > MAX_RECURSION_DEPTH) throw new Error('Maximum recursion depth exceeded');\r\n    const segments = codeString.split(';');\r\n    const parts = [];\r\n\r\n    for (const segment of segments) {\r\n      const part = BlissParser.parsePartString(segment);\r\n\r\n      const definition = blissElementDefinitions[part.codeName] || {};\r\n      const innerCodeString = definition.codeString;\r\n\r\n      if (innerCodeString) {\r\n        if (innerCodeString.includes('/')) {\r\n          // Word codeString — skip expansion at part level\r\n        } else if (innerCodeString.includes(';') || innerCodeString.includes(':') || blissElementDefinitions[innerCodeString]?.codeString) {\r\n          part.parts = BlissParser.#parseCodeStringToParts(innerCodeString, depth + 1);\r\n        } else {\r\n          part.codeName = innerCodeString;\r\n        }\r\n      }\r\n\r\n      BlissParser.#applyDefinitionMetadata(part, definition);\r\n      parts.push(part);\r\n    }\r\n\r\n    return parts;\r\n  }\r\n\r\n}\r\n","/**\r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { camelToKebab } from \"./bliss-constants.js\";\r\nimport {\r\n  getSemanticRoot,\r\n  hasSemantic,\r\n  filterToIndicators,\r\n  buildWithSemantic\r\n} from \"./indicator-utils.js\";\r\n\r\n/**\r\n * A lightweight handle that references a node in `#rawBlissObj` by identity.\r\n * Survives `#rebuild()` because it holds a direct reference to the raw node,\r\n * and resolves its current index dynamically when needed.\r\n *\r\n * Handles survive mutations to other parts of the tree. A handle only\r\n * becomes invalid when its own node is removed from the tree. Relocated\r\n * nodes (e.g. glyphs absorbed by mergeWithNext) are found via a full\r\n * tree scan and the handle's parent reference is updated automatically.\r\n */\r\nexport class ElementHandle {\r\n  #ctx;\r\n  #level;\r\n  #nodeRef;\r\n  #parentRef;\r\n  #generation;\r\n\r\n  constructor(ctx, level, nodeRef, parentRef) {\r\n    this.#ctx = ctx;\r\n    this.#level = level;\r\n    this.#nodeRef = nodeRef;\r\n    this.#parentRef = parentRef;\r\n    this.#generation = ctx.getGeneration();\r\n  }\r\n\r\n  #assertReachable() {\r\n    // Fast path: no mutations since last check\r\n    if (this.#generation === this.#ctx.getGeneration()) return;\r\n\r\n    // Parent-based lookup (fast)\r\n    const idx = this.#resolveIndex();\r\n    if (idx !== null && idx !== -1) {\r\n      this.#generation = this.#ctx.getGeneration();\r\n      return;\r\n    }\r\n\r\n    // Full tree scan (node may have moved to a different parent)\r\n    if (this.#relocate()) {\r\n      this.#generation = this.#ctx.getGeneration();\r\n      return;\r\n    }\r\n\r\n    throw new Error(\r\n      'ElementHandle references an element that has been removed.'\r\n    );\r\n  }\r\n\r\n  // Full tree scan: find this node anywhere in the raw tree.\r\n  // Updates #parentRef if the node moved to a different parent.\r\n  // Returns true if found, false if the node is gone.\r\n  #relocate() {\r\n    const raw = this.#ctx.getRaw();\r\n    const groups = raw.groups || [];\r\n\r\n    if (this.#level === 1) {\r\n      return groups.indexOf(this.#nodeRef) >= 0;\r\n    }\r\n\r\n    if (this.#level === 2) {\r\n      for (const group of groups) {\r\n        const gi = (group.glyphs || []).indexOf(this.#nodeRef);\r\n        if (gi >= 0) {\r\n          this.#parentRef = group;\r\n          return true;\r\n        }\r\n      }\r\n      return false;\r\n    }\r\n\r\n    if (this.#level === 3) {\r\n      for (const group of groups) {\r\n        for (const glyph of (group.glyphs || [])) {\r\n          const pi = (glyph.parts || []).indexOf(this.#nodeRef);\r\n          if (pi >= 0) {\r\n            this.#parentRef = { group, glyph };\r\n            return true;\r\n          }\r\n        }\r\n      }\r\n      return false;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  // Update this handle's generation after a mutation it initiated,\r\n  // so chaining (e.g. handle.setOptions(...).addPart(...)) keeps working.\r\n  #syncGeneration() {\r\n    this.#generation = this.#ctx.getGeneration();\r\n  }\r\n\r\n  get level() {\r\n    return this.#level;\r\n  }\r\n\r\n  get isGroup() {\r\n    return this.#level === 1;\r\n  }\r\n\r\n  get isGlyph() {\r\n    return this.#level === 2;\r\n  }\r\n\r\n  get isPart() {\r\n    return this.#level >= 3;\r\n  }\r\n\r\n  get codeName() {\r\n    this.#assertReachable();\r\n    const node = this.#nodeRef;\r\n    if (!node) return '';\r\n\r\n    // Glyph level: the input code that produces this glyph, when it is\r\n    // actually a glyph. Empty string for composites, bare shape primitives,\r\n    // and multi-char text fallback. The presence of glyphCode IS the\r\n    // \"this is a glyph\" signal (set by the parser for B-codes, X-codes,\r\n    // single-char text fallback, and define()d 'glyph'-type aliases).\r\n    // For single-char text fallback the internal routing key 'XTXT_<char>'\r\n    // is surfaced publicly as 'X<char>'. Mirrors the rule in BlissElement.\r\n    if (this.#level === 2) {\r\n      if (typeof node.glyphCode === 'string') {\r\n        return node.glyphCode.startsWith('XTXT_')\r\n          ? 'X' + node.glyphCode.slice(5)\r\n          : node.glyphCode;\r\n      }\r\n      return '';\r\n    }\r\n\r\n    // Part level: structural lookup key. Group level: groups have no\r\n    // codeName field on their data object, so this returns ''.\r\n    // For text-fallback parts the internal routing key 'XTXT_<chars>' is\r\n    // surfaced publicly as 'X<chars>'.\r\n    const code = node.codeName ?? '';\r\n    return code.startsWith('XTXT_') ? 'X' + code.slice(5) : code;\r\n  }\r\n\r\n  get char() {\r\n    this.#assertReachable();\r\n    return this.#nodeRef?.char ?? '';\r\n  }\r\n\r\n  get isIndicator() {\r\n    this.#assertReachable();\r\n    if (this.#level !== 3) return false;\r\n    return this.#nodeRef?.isIndicator === true;\r\n  }\r\n\r\n  // --- Dimensions (read-only, from snapshot) ---\r\n\r\n  #findSnapshot() {\r\n    this.#assertReachable();\r\n    const idx = this.#resolveIndex();\r\n    if (idx === null || idx === -1) {\r\n      throw new Error('Snapshot not found: handle index could not be resolved.');\r\n    }\r\n    const snap = this.#ctx.getSnapshot();\r\n\r\n    if (this.#level === 1) {\r\n      const groupSnap = snap.children[idx];\r\n      if (!groupSnap) throw new Error('Snapshot not found for group handle.');\r\n      return groupSnap;\r\n    }\r\n\r\n    if (this.#level === 2) {\r\n      const groupSnap = snap.children[idx.groupIndex];\r\n      if (!groupSnap) throw new Error('Snapshot not found for group in glyph handle.');\r\n      const glyphs = groupSnap.children.filter(c => c.isGlyph);\r\n      const glyphSnap = glyphs[idx.glyphIndex];\r\n      if (!glyphSnap) throw new Error('Snapshot not found for glyph handle.');\r\n      return glyphSnap;\r\n    }\r\n\r\n    if (this.#level === 3) {\r\n      const groupSnap = snap.children[idx.groupIndex];\r\n      if (!groupSnap) throw new Error('Snapshot not found for group in part handle.');\r\n      const glyphs = groupSnap.children.filter(c => c.isGlyph);\r\n      const glyphSnap = glyphs[idx.glyphIndex];\r\n      if (!glyphSnap) throw new Error('Snapshot not found for glyph in part handle.');\r\n      return glyphSnap.children[idx.partIndex];\r\n    }\r\n\r\n    throw new Error(`Unsupported handle level: ${this.#level}`);\r\n  }\r\n\r\n  get x() { return this.#findSnapshot().x; }\r\n  get y() { return this.#findSnapshot().y; }\r\n  get offsetX() { return this.#findSnapshot().offsetX; }\r\n  get offsetY() { return this.#findSnapshot().offsetY; }\r\n  get width() { return this.#findSnapshot().width; }\r\n  get height() { return this.#findSnapshot().height; }\r\n  get bounds() { return this.#findSnapshot().bounds; }\r\n  get advanceX() { return this.#findSnapshot().advanceX; }\r\n  get baseWidth() { return this.#findSnapshot().baseWidth; }\r\n\r\n  // --- Identity (read-only, from snapshot) ---\r\n\r\n  get key() { return this.#findSnapshot().key; }\r\n\r\n  // --- Content flags (read-only, from snapshot) ---\r\n\r\n  get isShape() { return this.#findSnapshot().isShape; }\r\n  get isBlissGlyph() { return this.#findSnapshot().isBlissGlyph; }\r\n  get isExternalGlyph() { return this.#findSnapshot().isExternalGlyph; }\r\n  get isHeadGlyph() { return this.#findSnapshot().isHeadGlyph; }\r\n  get isSpaceGroup() { return this.#findSnapshot().isSpaceGroup; }\r\n\r\n  measure() {\r\n    const snap = this.#findSnapshot();\r\n    return Object.freeze({\r\n      x: snap.x,\r\n      y: snap.y,\r\n      offsetX: snap.offsetX,\r\n      offsetY: snap.offsetY,\r\n      width: snap.width,\r\n      height: snap.height,\r\n      bounds: snap.bounds,\r\n      advanceX: snap.advanceX,\r\n      baseWidth: snap.baseWidth,\r\n    });\r\n  }\r\n\r\n  // Resolve the current index of this node within its parent array\r\n  #resolveIndex() {\r\n    if (this.#level === 1) {\r\n      const groups = this.#ctx.getRaw().groups;\r\n      return groups.indexOf(this.#nodeRef);\r\n    }\r\n    if (this.#level === 2) {\r\n      const groupIndex = this.#ctx.getRaw().groups.indexOf(this.#parentRef);\r\n      if (groupIndex < 0) return null;\r\n      const glyphIndex = this.#parentRef.glyphs?.indexOf(this.#nodeRef) ?? -1;\r\n      if (glyphIndex < 0) return null;\r\n      return { groupIndex, glyphIndex };\r\n    }\r\n    if (this.#level === 3) {\r\n      const raw = this.#ctx.getRaw();\r\n      const groupIndex = raw.groups.indexOf(this.#parentRef.group);\r\n      if (groupIndex < 0) return null;\r\n      const glyphIndex = this.#parentRef.group.glyphs?.indexOf(this.#parentRef.glyph) ?? -1;\r\n      if (glyphIndex < 0) return null;\r\n      const partIndex = this.#parentRef.glyph.parts?.indexOf(this.#nodeRef) ?? -1;\r\n      if (partIndex < 0) return null;\r\n      return { groupIndex, glyphIndex, partIndex };\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // Parse a DSL code string and extract glyphs from a single group.\r\n  // Accepts multi-glyph codes (e.g. \"H/C8\" or word definitions).\r\n  // Rejects multi-group input (e.g. \"H//C8\").\r\n  #parseGlyphs(code) {\r\n    const parsed = this.#ctx.parse(code);\r\n    if (!parsed.groups || parsed.groups.length !== 1) {\r\n      throw new Error(`Expected glyphs within a single group, but code \"${code}\" produced ${parsed.groups?.length ?? 0} groups`);\r\n    }\r\n    const group = parsed.groups[0];\r\n    if (!group.glyphs || group.glyphs.length === 0) {\r\n      throw new Error(`Code \"${code}\" produced no glyphs`);\r\n    }\r\n    return group.glyphs;\r\n  }\r\n\r\n  // Parse a DSL code string and extract exactly one glyph.\r\n  // Used by replace() which must swap a single glyph.\r\n  #parseGlyph(code) {\r\n    const glyphs = this.#parseGlyphs(code);\r\n    if (glyphs.length !== 1) {\r\n      throw new Error(`Expected a single glyph, but code \"${code}\" produced ${glyphs.length} glyphs`);\r\n    }\r\n    return glyphs[0];\r\n  }\r\n\r\n  // Parse a DSL code string in part context.\r\n  // For single-glyph codes: embeds in helper glyph for proper part-level expansion.\r\n  // For multi-glyph codes (words): returns an error part (words cannot be parts).\r\n  #parseParts(code) {\r\n    // Check if the code parses to multiple glyphs (word) vs single glyph (part)\r\n    const rawParsed = this.#ctx.parse(code);\r\n    if (!rawParsed.groups || rawParsed.groups.length !== 1) {\r\n      throw new Error(`Expected parts within a single group, but code \"${code}\" produced ${rawParsed.groups?.length ?? 0} groups`);\r\n    }\r\n    const rawGroup = rawParsed.groups[0];\r\n    if (!rawGroup.glyphs || rawGroup.glyphs.length === 0) {\r\n      throw new Error(`Code \"${code}\" produced no glyphs`);\r\n    }\r\n\r\n    if (rawGroup.glyphs.length === 1) {\r\n      // Single glyph — use helper approach for proper part-level expansion\r\n      const parsed = this.#ctx.parse(`H;${code}`);\r\n      const glyph = parsed.groups?.[0]?.glyphs?.[0];\r\n      if (glyph?.parts?.length >= 2) {\r\n        return glyph.parts.slice(1);\r\n      }\r\n      // Fallback: return the single glyph's parts directly\r\n      return rawGroup.glyphs[0].parts || [];\r\n    }\r\n\r\n    // Multi-glyph code is a word — words cannot be composed with ;\r\n    return [{ codeName: code, error: `\"${code}\" is a word and cannot be composed with ;`, errorCode: 'WORD_AS_PART' }];\r\n  }\r\n\r\n  // Parse a single part (strict). Used by replace() which must swap exactly one part.\r\n  #parsePart(code) {\r\n    const parts = this.#parseParts(code);\r\n    if (parts.length !== 1) {\r\n      throw new Error(`Expected a single part, but code \"${code}\" produced ${parts.length} parts`);\r\n    }\r\n    return parts[0];\r\n  }\r\n\r\n  // Apply defaults/overrides merge to a node's options.\r\n  // Accepts { defaults, overrides } or flat options (treated as overrides).\r\n  #applyDefaultsOverrides(node, opts) {\r\n    if (!opts) return;\r\n    let defaults, overrides;\r\n    if ('defaults' in opts || 'overrides' in opts) {\r\n      ({ defaults, overrides } = opts);\r\n    } else {\r\n      overrides = opts;\r\n    }\r\n    if (!defaults && !overrides) return;\r\n    const rawDefaults = defaults ? this.#ctx.toRaw(defaults) : {};\r\n    const rawOverrides = overrides ? this.#ctx.toRaw(overrides) : {};\r\n    node.options = { ...rawDefaults, ...(node.options ?? {}), ...rawOverrides };\r\n  }\r\n\r\n  // --- Navigation ---\r\n\r\n  /**\r\n   * Returns the head glyph handle within this group.\r\n   * Uses the composition snapshot to determine which glyph is the head.\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  headGlyph() {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return null;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs?.length) return null;\r\n\r\n    const groupIndex = this.#ctx.getRaw().groups.indexOf(this.#nodeRef);\r\n    if (groupIndex < 0) return null;\r\n\r\n    // Find the head glyph via the snapshot tree\r\n    const snap = this.#ctx.getSnapshot();\r\n    const groupSnap = snap.children[groupIndex];\r\n    if (!groupSnap) return null;\r\n\r\n    const glyphs = groupSnap.children.filter(c => c.isGlyph);\r\n    const headIndex = glyphs.findIndex(g => g.isHeadGlyph);\r\n    const index = headIndex >= 0 ? headIndex : 0;\r\n\r\n    if (index >= group.glyphs.length) return null;\r\n    return new ElementHandle(this.#ctx, 2, group.glyphs[index], group);\r\n  }\r\n\r\n  glyph(index) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return null;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs?.length) return null;\r\n    if (index < 0) index = group.glyphs.length + index;\r\n    if (index < 0 || index >= group.glyphs.length) return null;\r\n    return new ElementHandle(this.#ctx, 2, group.glyphs[index], group);\r\n  }\r\n\r\n  part(index) {\r\n    this.#assertReachable();\r\n    if (this.#level === 2) {\r\n      const glyph = this.#nodeRef;\r\n      if (!glyph?.parts?.length) return null;\r\n      if (index < 0) index = glyph.parts.length + index;\r\n      if (index < 0 || index >= glyph.parts.length) return null;\r\n      return new ElementHandle(this.#ctx, 3, glyph.parts[index], {\r\n        group: this.#parentRef,\r\n        glyph\r\n      });\r\n    }\r\n    if (this.#level === 3) {\r\n      const part = this.#nodeRef;\r\n      if (!part?.parts?.length) return null;\r\n      if (index < 0) index = part.parts.length + index;\r\n      if (index < 0 || index >= part.parts.length) return null;\r\n      return new ElementHandle(this.#ctx, 3, part.parts[index], this.#parentRef);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // --- Mutation: add/insert ---\r\n\r\n  addGlyph(code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group) return this;\r\n    return this.insertGlyph(group.glyphs?.length ?? 0, code, opts);\r\n  }\r\n\r\n  insertGlyph(index, code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group) return this;\r\n    const newGlyphs = this.#parseGlyphs(code);\r\n    for (const g of newGlyphs) {\r\n      this.#applyDefaultsOverrides(g, opts);\r\n    }\r\n    if (!group.glyphs) group.glyphs = [];\r\n    group.glyphs.splice(index, 0, ...newGlyphs);\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  addPart(code, opts) {\r\n    this.#assertReachable();\r\n    // Group level: delegate to last glyph\r\n    if (this.#level === 1) {\r\n      const group = this.#nodeRef;\r\n      if (!group?.glyphs?.length) return this;\r\n      const lastGlyph = group.glyphs[group.glyphs.length - 1];\r\n      const glyphHandle = new ElementHandle(this.#ctx, 2, lastGlyph, group);\r\n      glyphHandle.addPart(code, opts);\r\n      this.#syncGeneration();\r\n      return this;\r\n    }\r\n    if (this.#level !== 2) return this;\r\n    const glyph = this.#nodeRef;\r\n    if (!glyph) return this;\r\n    return this.insertPart(glyph.parts?.length ?? 0, code, opts);\r\n  }\r\n\r\n  insertPart(index, code, opts) {\r\n    this.#assertReachable();\r\n    // Group level: delegate to last glyph\r\n    if (this.#level === 1) {\r\n      const group = this.#nodeRef;\r\n      if (!group?.glyphs?.length) return this;\r\n      const lastGlyph = group.glyphs[group.glyphs.length - 1];\r\n      const glyphHandle = new ElementHandle(this.#ctx, 2, lastGlyph, group);\r\n      glyphHandle.insertPart(index, code, opts);\r\n      this.#syncGeneration();\r\n      return this;\r\n    }\r\n    if (this.#level !== 2) return this;\r\n    const glyph = this.#nodeRef;\r\n    if (!glyph) return this;\r\n    const newParts = this.#parseParts(code);\r\n    for (const p of newParts) {\r\n      this.#applyDefaultsOverrides(p, opts);\r\n    }\r\n    if (!glyph.parts) glyph.parts = [];\r\n    glyph.parts.splice(index, 0, ...newParts);\r\n    // Adding parts changes the glyph's composition, so clear its identity\r\n    // so toString() serializes the individual parts instead of the old code.\r\n    delete glyph.isBlissGlyph;\r\n    delete glyph.codeName;\r\n    delete glyph.glyphCode;\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  // --- Mutation: detach (plain splice, no cascade) ---\r\n\r\n  /**\r\n   * Removes this node from the tree without cascading deletions to its parent.\r\n   * Terminal mutation: returns undefined (not chainable), since the handle's\r\n   * node is no longer reachable after detach.\r\n   * @returns {undefined}\r\n   */\r\n  detach() {\r\n    this.#assertReachable();\r\n\r\n    if (this.#level === 3) {\r\n      const glyph = this.#parentRef.glyph;\r\n      if (!glyph?.parts) return undefined;\r\n      const partIndex = glyph.parts.indexOf(this.#nodeRef);\r\n      if (partIndex < 0) return undefined;\r\n      glyph.parts.splice(partIndex, 1);\r\n      this.#ctx.rebuild();\r\n      return undefined;\r\n    }\r\n\r\n    if (this.#level === 2) {\r\n      const group = this.#parentRef;\r\n      if (!group?.glyphs) return undefined;\r\n      const glyphIndex = group.glyphs.indexOf(this.#nodeRef);\r\n      if (glyphIndex < 0) return undefined;\r\n      group.glyphs.splice(glyphIndex, 1);\r\n      this.#ctx.rebuild();\r\n      return undefined;\r\n    }\r\n\r\n    if (this.#level === 1) {\r\n      const groups = this.#ctx.getRaw().groups;\r\n      const groupIndex = groups.indexOf(this.#nodeRef);\r\n      if (groupIndex < 0) return undefined;\r\n      groups.splice(groupIndex, 1);\r\n      this.#ctx.rebuild();\r\n      return undefined;\r\n    }\r\n\r\n    return undefined;\r\n  }\r\n\r\n  // --- Mutation: remove ---\r\n\r\n  /**\r\n   * Removes this node and cascades cleanup upward (e.g. removing the last\r\n   * part also removes its glyph; removing the last glyph also removes its\r\n   * group and surrounding spaces). Terminal mutation: returns undefined\r\n   * (not chainable), since the handle's node is no longer reachable.\r\n   * @returns {undefined}\r\n   */\r\n  remove() {\r\n    this.#assertReachable();\r\n    const raw = this.#ctx.getRaw();\r\n    const groups = raw.groups;\r\n\r\n    if (this.#level === 3) {\r\n      const idx = this.#resolveIndex();\r\n      if (!idx) return undefined;\r\n      const glyph = this.#parentRef.glyph;\r\n      if (!glyph?.parts) return undefined;\r\n      const partIndex = glyph.parts.indexOf(this.#nodeRef);\r\n      if (partIndex < 0) return undefined;\r\n      glyph.parts.splice(partIndex, 1);\r\n      // Cascade: last part → remove glyph\r\n      if (glyph.parts.length === 0) {\r\n        return this.#removeGlyphFromGroup(groups, this.#parentRef.group, glyph);\r\n      }\r\n      this.#ctx.rebuild();\r\n      return undefined;\r\n    }\r\n\r\n    if (this.#level === 2) {\r\n      const group = this.#parentRef;\r\n      return this.#removeGlyphFromGroup(groups, group, this.#nodeRef);\r\n    }\r\n\r\n    if (this.#level === 1) {\r\n      const groupIndex = groups.indexOf(this.#nodeRef);\r\n      if (groupIndex < 0) return undefined;\r\n      this.#ctx.removeGlyphGroup(raw, groupIndex);\r\n      this.#ctx.rebuild();\r\n      return undefined;\r\n    }\r\n\r\n    return undefined;\r\n  }\r\n\r\n  removeGlyph(index) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs?.length) return this;\r\n    if (index < 0) index = group.glyphs.length + index;\r\n    if (index < 0 || index >= group.glyphs.length) return this;\r\n    group.glyphs.splice(index, 1);\r\n    if (group.glyphs.length === 0) {\r\n      const raw = this.#ctx.getRaw();\r\n      const groupIndex = raw.groups.indexOf(group);\r\n      if (groupIndex >= 0) {\r\n        this.#ctx.removeGlyphGroup(raw, groupIndex);\r\n      }\r\n    }\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  removePart(index) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 2) return this;\r\n    const glyph = this.#nodeRef;\r\n    if (!glyph?.parts?.length) return this;\r\n    if (index < 0) index = glyph.parts.length + index;\r\n    if (index < 0 || index >= glyph.parts.length) return this;\r\n    glyph.parts.splice(index, 1);\r\n    if (glyph.parts.length === 0) {\r\n      this.#removeGlyphFromGroup(\r\n        this.#ctx.getRaw().groups, this.#parentRef, glyph\r\n      );\r\n      this.#syncGeneration();\r\n      return this;\r\n    }\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  #removeGlyphFromGroup(groups, group, glyph) {\r\n    const raw = this.#ctx.getRaw();\r\n    if (!group?.glyphs) return undefined;\r\n    const glyphIndex = group.glyphs.indexOf(glyph);\r\n    if (glyphIndex < 0) return undefined;\r\n    group.glyphs.splice(glyphIndex, 1);\r\n    // Cascade: last glyph → remove group + space\r\n    if (group.glyphs.length === 0) {\r\n      const groupIndex = groups.indexOf(group);\r\n      if (groupIndex >= 0) {\r\n        this.#ctx.removeGlyphGroup(raw, groupIndex);\r\n      }\r\n    }\r\n    this.#ctx.rebuild();\r\n    return undefined;\r\n  }\r\n\r\n  // --- Mutation: parent-centric replace ---\r\n\r\n  replaceGlyph(index, code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs?.length) return this;\r\n    if (index < 0) index = group.glyphs.length + index;\r\n    if (index < 0 || index >= group.glyphs.length) return this;\r\n    const newGlyph = this.#parseGlyph(code);\r\n    this.#applyDefaultsOverrides(newGlyph, opts);\r\n    group.glyphs[index] = newGlyph;\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  replacePart(index, code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 2) return this;\r\n    const glyph = this.#nodeRef;\r\n    if (!glyph?.parts?.length) return this;\r\n    if (index < 0) index = glyph.parts.length + index;\r\n    if (index < 0 || index >= glyph.parts.length) return this;\r\n    const newPart = this.#parsePart(code);\r\n    this.#applyDefaultsOverrides(newPart, opts);\r\n    glyph.parts[index] = newPart;\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  // --- Mutation: self-centric replace ---\r\n\r\n  replace(code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level === 2) {\r\n      const group = this.#parentRef;\r\n      if (!group?.glyphs) return this;\r\n      const glyphIndex = group.glyphs.indexOf(this.#nodeRef);\r\n      if (glyphIndex < 0) return this;\r\n      const newGlyph = this.#parseGlyph(code);\r\n      this.#applyDefaultsOverrides(newGlyph, opts);\r\n      group.glyphs[glyphIndex] = newGlyph;\r\n      this.#nodeRef = newGlyph;\r\n      this.#ctx.rebuild();\r\n      this.#syncGeneration();\r\n      return this;\r\n    }\r\n\r\n    if (this.#level === 3) {\r\n      const glyph = this.#parentRef.glyph;\r\n      if (!glyph?.parts) return this;\r\n      const partIndex = glyph.parts.indexOf(this.#nodeRef);\r\n      if (partIndex < 0) return this;\r\n      const newPart = this.#parsePart(code);\r\n      this.#applyDefaultsOverrides(newPart, opts);\r\n      glyph.parts[partIndex] = newPart;\r\n      this.#nodeRef = newPart;\r\n      this.#ctx.rebuild();\r\n      this.#syncGeneration();\r\n      return this;\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  // --- Mutation: indicators ---\r\n\r\n  applyIndicators(code, opts) {\r\n    this.#assertReachable();\r\n    if (code === undefined || code === null || code === '') {\r\n      throw new Error('applyIndicators() requires a code argument. Use clearIndicators() to remove indicators.');\r\n    }\r\n    return this.#applyOrClearIndicators(code, opts);\r\n  }\r\n\r\n  clearIndicators(opts) {\r\n    this.#assertReachable();\r\n    return this.#applyOrClearIndicators(null, opts);\r\n  }\r\n\r\n  applyHeadIndicators(code, opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const head = this.headGlyph();\r\n    if (!head) return this;\r\n    head.applyIndicators(code, opts);\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  clearHeadIndicators(opts) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const head = this.headGlyph();\r\n    if (!head) return this;\r\n    head.clearIndicators(opts);\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  #applyOrClearIndicators(code, opts) {\r\n    if (this.#level !== 2) return this;\r\n    const glyph = this.#nodeRef;\r\n    if (!glyph?.parts?.length) return this;\r\n\r\n    const definitions = this.#ctx.getDefinitions();\r\n    const stripSemantic = opts?.stripSemantic === true;\r\n\r\n    // Classify parts: separate base parts from trailing indicator parts\r\n    const firstIndicatorIndex = glyph.parts.findIndex(p => p.isIndicator === true);\r\n\r\n    let baseParts, indicatorParts;\r\n    if (firstIndicatorIndex === -1) {\r\n      baseParts = glyph.parts;\r\n      indicatorParts = [];\r\n    } else {\r\n      baseParts = glyph.parts.slice(0, firstIndicatorIndex);\r\n      indicatorParts = glyph.parts.slice(firstIndicatorIndex);\r\n    }\r\n\r\n    // Must have base parts (indicators without a base are just normal combined parts)\r\n    if (baseParts.length === 0) return this;\r\n\r\n    // Validate pattern: no non-indicators after the first indicator\r\n    const isValidPattern = indicatorParts.every(p => p.isIndicator === true);\r\n    if (!isValidPattern) return this;\r\n\r\n    // Extract existing indicator codes for semantic analysis\r\n    const existingIndCodes = indicatorParts.map(p => p.codeName);\r\n    const semanticRoot = !stripSemantic ? getSemanticRoot(existingIndCodes, definitions) : null;\r\n\r\n    // Determine new indicator codes\r\n    let newIndicatorParts = [];\r\n    if (code !== null) {\r\n      const requestedCodes = code.split(';').map(s => s.trim()).filter(Boolean);\r\n      const validCodes = filterToIndicators(requestedCodes, definitions);\r\n\r\n      if (validCodes.length > 0) {\r\n        // Build final indicator list with semantic preservation\r\n        let finalCodes;\r\n        if (semanticRoot && !hasSemantic(validCodes, definitions)) {\r\n          finalCodes = buildWithSemantic(semanticRoot, validCodes, definitions);\r\n        } else {\r\n          finalCodes = validCodes;\r\n        }\r\n\r\n        // Parse each indicator code to create proper part nodes with metadata\r\n        for (const indCode of finalCodes) {\r\n          const parsed = this.#ctx.parse(indCode);\r\n          const partNode = parsed.groups?.[0]?.glyphs?.[0]?.parts?.[0];\r\n          if (partNode) {\r\n            newIndicatorParts.push(partNode);\r\n          }\r\n        }\r\n      } else {\r\n        // All provided codes were non-indicators — preserve semantic if present\r\n        if (semanticRoot) {\r\n          const parsed = this.#ctx.parse(semanticRoot);\r\n          const partNode = parsed.groups?.[0]?.glyphs?.[0]?.parts?.[0];\r\n          if (partNode) newIndicatorParts.push(partNode);\r\n        }\r\n      }\r\n    } else {\r\n      // clearIndicators: no new codes, just preserve semantic if applicable\r\n      if (semanticRoot) {\r\n        const parsed = this.#ctx.parse(semanticRoot);\r\n        const partNode = parsed.groups?.[0]?.glyphs?.[0]?.parts?.[0];\r\n        if (partNode) newIndicatorParts.push(partNode);\r\n      }\r\n    }\r\n\r\n    // Reassemble glyph parts\r\n    glyph.parts = [...baseParts, ...newIndicatorParts];\r\n\r\n    // Update glyph identity\r\n    this.#updateGlyphIdentityAfterIndicatorChange(glyph, definitions);\r\n\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  #updateGlyphIdentityAfterIndicatorChange(glyph, definitions) {\r\n    const hasIndicators = glyph.parts.some(p => p.isIndicator === true);\r\n    if (!hasIndicators && glyph.parts.length === 1) {\r\n      const baseCode = glyph.parts[0].codeName;\r\n      const def = definitions[baseCode];\r\n      if (def?.isBlissGlyph) {\r\n        glyph.isBlissGlyph = true;\r\n        glyph.codeName = baseCode;\r\n        if (def.glyphCode) glyph.glyphCode = def.glyphCode;\r\n      } else {\r\n        delete glyph.isBlissGlyph;\r\n        delete glyph.codeName;\r\n        delete glyph.glyphCode;\r\n      }\r\n    } else {\r\n      delete glyph.isBlissGlyph;\r\n      delete glyph.codeName;\r\n      delete glyph.glyphCode;\r\n    }\r\n  }\r\n\r\n  // --- Mutation: word structure ---\r\n\r\n  /**\r\n   * Splits this word group into two at the glyph boundary, inserting\r\n   * a space group between. Only valid on group-level handles.\r\n   * @param {number} glyphIndex - Split point (1 to glyphs.length - 1)\r\n   * @returns {this}\r\n   */\r\n  splitAt(glyphIndex) {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs) return this;\r\n    const len = group.glyphs.length;\r\n    if (glyphIndex <= 0 || glyphIndex >= len) {\r\n      throw new Error(`splitAt(${glyphIndex}) is out of range: must be between 1 and ${len - 1} (inclusive) for a group with ${len} glyphs`);\r\n    }\r\n\r\n    // Resolve raw index before any destructive mutation\r\n    const groups = this.#ctx.getRaw().groups;\r\n    const rawIndex = groups.indexOf(this.#nodeRef);\r\n    if (rawIndex < 0) return this;\r\n\r\n    // Splice trailing glyphs from the original group (mutate in-place)\r\n    const rightGlyphs = group.glyphs.splice(glyphIndex);\r\n\r\n    // Build right-half group with copied options\r\n    const rightGroup = { glyphs: rightGlyphs };\r\n    if (group.options) {\r\n      rightGroup.options = { ...group.options };\r\n    }\r\n\r\n    const spaceGroup = this.#ctx.makeSpaceGroup();\r\n\r\n    // Insert [space, rightGroup] after the original group\r\n    groups.splice(rawIndex + 1, 0, spaceGroup, rightGroup);\r\n\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Merges this word group with the next non-space group, removing any\r\n   * space groups between them. Only valid on group-level handles.\r\n   * No-op if no next word group exists or if this is a space group.\r\n   * The absorbed group's options are discarded; only this group's\r\n   * options apply to the merged result.\r\n   * @returns {this}\r\n   */\r\n  mergeWithNext() {\r\n    this.#assertReachable();\r\n    if (this.#level !== 1) return this;\r\n    const group = this.#nodeRef;\r\n    if (!group?.glyphs) return this;\r\n\r\n    const groups = this.#ctx.getRaw().groups;\r\n    const rawIndex = groups.indexOf(this.#nodeRef);\r\n    if (rawIndex < 0) return this;\r\n\r\n    // No-op for space groups\r\n    if (this.#ctx.isRawSpaceGroup(group)) return this;\r\n\r\n    // Scan right to find the next non-space group\r\n    let nextWordIndex = -1;\r\n    for (let i = rawIndex + 1; i < groups.length; i++) {\r\n      if (!this.#ctx.isRawSpaceGroup(groups[i])) {\r\n        nextWordIndex = i;\r\n        break;\r\n      }\r\n    }\r\n    if (nextWordIndex < 0) return this;\r\n\r\n    // No-op if the next group has no glyphs to absorb\r\n    const nextGroup = groups[nextWordIndex];\r\n    if (!nextGroup.glyphs?.length) return this;\r\n\r\n    // Absorb the next word group's glyphs\r\n    group.glyphs.push(...nextGroup.glyphs);\r\n\r\n    // Remove everything from rawIndex+1 through nextWordIndex (spaces + absorbed word)\r\n    groups.splice(rawIndex + 1, nextWordIndex - rawIndex);\r\n\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  // --- Mutation: options ---\r\n\r\n  setOptions(opts) {\r\n    this.#assertReachable();\r\n    const node = this.#nodeRef;\r\n    if (!node) return this;\r\n    this.#applyDefaultsOverrides(node, opts);\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n\r\n  removeOptions(...keys) {\r\n    this.#assertReachable();\r\n    const node = this.#nodeRef;\r\n    if (!node?.options) return this;\r\n    for (const key of keys) {\r\n      const kebab = camelToKebab(key);\r\n      delete node.options[kebab];\r\n      delete node.options[key];\r\n    }\r\n    // Clean up empty options object\r\n    if (Object.keys(node.options).length === 0) {\r\n      delete node.options;\r\n    }\r\n    this.#ctx.rebuild();\r\n    this.#syncGeneration();\r\n    return this;\r\n  }\r\n}\r\n","/** \r\n * This Source Code Form is subject to the terms of the Mozilla Public\r\n * License, v. 2.0. If a copy of the MPL was not distributed with this\r\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\r\n */\r\n\r\nimport { blissElementDefinitions, builtInCodes } from \"./bliss-element-definitions.js\";\r\nimport { BlissElement } from \"./bliss-element.js\";\r\nimport { BlissParser } from \"./bliss-parser.js\";\r\nimport { INTERNAL_OPTIONS, KNOWN_OPTION_KEYS, escapeHtml, isSafeAttributeName, camelToKebab, generateKey, LIB_VERSION } from \"./bliss-constants.js\";\r\nimport { ElementHandle } from \"./element-handle.js\";\r\n\r\n// Pre-parsed error placeholder (REFSQUARE + question mark). Parsed once at module\r\n// load so BlissElement can clone it without importing BlissParser itself.\r\nconst ERROR_PLACEHOLDER_PARTS = BlissParser.parse('REFSQUARE;B699:3').groups[0].glyphs[0].parts;\r\n\r\n// Note: BlissSVGBuilder.LIB_VERSION is attached at the public entry point\r\n// (src/index.js), not declared here. Code that imports the class directly\r\n// from this file (e.g. internal tests) will see LIB_VERSION as undefined.\r\n// External consumers always go through src/index.js, where the static is set.\r\nclass BlissSVGBuilder {\r\n  #processedOptions;\r\n  #sharedOptions;\r\n  #mutationCtx;\r\n  #warnings = [];\r\n  #generation = 0;\r\n\r\n  // Processes raw options (kebab-case) into internal options (camelCase).\r\n  // Bulk options expanded here (not in output): 'margin', 'crop', 'grid-color', 'grid-stroke-width'.\r\n  // @param {boolean} addBuilderDefaults - If true, adds defaults for builder-level options (grid, etc.)\r\n  #processOptions(rawOptions = {}, addBuilderDefaults = false) {\r\n    const options = {};\r\n\r\n    // stroke-width: Number, clamped 0.1-1.5\r\n    if ('stroke-width' in rawOptions && !isNaN(rawOptions['stroke-width'])) {\r\n      let strokeWidth = Number(rawOptions['stroke-width']);\r\n      if (strokeWidth < 0.1) {\r\n        strokeWidth = 0.1;\r\n      } else if (strokeWidth > 1.5) {\r\n        strokeWidth = 1.5;\r\n      }\r\n      options.strokeWidth = strokeWidth;\r\n    }\r\n\r\n    // dot-extra-width: Number, clamped 0-1\r\n    if ('dot-extra-width' in rawOptions && !isNaN(rawOptions['dot-extra-width'])) {\r\n      let dotExtraWidth = Number(rawOptions['dot-extra-width']);\r\n      if (dotExtraWidth < 0) {\r\n        dotExtraWidth = 0;\r\n      } else if (dotExtraWidth > 1) {\r\n        dotExtraWidth = 1;\r\n      }\r\n      options.dotExtraWidth = dotExtraWidth;\r\n    }\r\n\r\n    // char-space: Number, clamped 0-10\r\n    if ('char-space' in rawOptions && !isNaN(rawOptions['char-space'])) {\r\n      let charSpace = Number(rawOptions['char-space']);\r\n      if (charSpace < 0) {\r\n        charSpace = 0;\r\n      } else if (charSpace > 10) {\r\n        charSpace = 10;\r\n      }\r\n      options.charSpace = charSpace;\r\n    }\r\n\r\n    // word-space: Number, clamped 0-20\r\n    if ('word-space' in rawOptions && !isNaN(rawOptions['word-space'])) {\r\n      let wordSpace = Number(rawOptions['word-space']);\r\n      if (wordSpace < 0) {\r\n        wordSpace = 0;\r\n      } else if (wordSpace > 20) {\r\n        wordSpace = 20;\r\n      }\r\n      options.wordSpace = wordSpace;\r\n    }\r\n\r\n    // external-glyph-space: Number, clamped 0-3\r\n    if ('external-glyph-space' in rawOptions && !isNaN(rawOptions['external-glyph-space'])) {\r\n      let externalGlyphSpace = Number(rawOptions['external-glyph-space']);\r\n      if (externalGlyphSpace < 0) {\r\n        externalGlyphSpace = 0;\r\n      } else if (externalGlyphSpace > 3) {\r\n        externalGlyphSpace = 3;\r\n      }\r\n      options.externalGlyphSpace = externalGlyphSpace;\r\n    }\r\n\r\n    // margin: Sets ALL 4 margins\r\n    if ('margin' in rawOptions && !isNaN(rawOptions['margin'])) {\r\n      const m = Number(rawOptions['margin']);\r\n      options.marginTop = m;\r\n      options.marginBottom = m;\r\n      options.marginLeft = m;\r\n      options.marginRight = m;\r\n    }\r\n\r\n    // Individual margins (override the above if present)\r\n    if ('margin-top' in rawOptions && !isNaN(rawOptions['margin-top'])) {\r\n      options.marginTop = Number(rawOptions['margin-top']);\r\n    }\r\n    if ('margin-bottom' in rawOptions && !isNaN(rawOptions['margin-bottom'])) {\r\n      options.marginBottom = Number(rawOptions['margin-bottom']);\r\n    }\r\n    if ('margin-left' in rawOptions && !isNaN(rawOptions['margin-left'])) {\r\n      options.marginLeft = Number(rawOptions['margin-left']);\r\n    }\r\n    if ('margin-right' in rawOptions && !isNaN(rawOptions['margin-right'])) {\r\n      options.marginRight = Number(rawOptions['margin-right']);\r\n    }\r\n\r\n    // min-width: Number, clamped to 0 minimum (negative values become 0)\r\n    if ('min-width' in rawOptions && !isNaN(rawOptions['min-width'])) {\r\n      let minWidth = Number(rawOptions['min-width']);\r\n      if (minWidth < 0) {\r\n        minWidth = 0;\r\n      }\r\n      options.minWidth = minWidth;\r\n    }\r\n\r\n    // Boolean options: [option] = true, absence = false\r\n    if (rawOptions.center === true) {\r\n      options.center = true;\r\n    }\r\n    if (rawOptions.grid === true) {\r\n      options.grid = true;\r\n    }\r\n    if (rawOptions['error-placeholder'] === true) {\r\n      options.errorPlaceholder = true;\r\n    }\r\n\r\n    // Grid colors - hierarchy: bulk → category → specific\r\n    // Only process if builder defaults requested or if grid options present\r\n    if (addBuilderDefaults || Object.keys(rawOptions).some(k => k.startsWith('grid-'))) {\r\n      // Start with defaults\r\n      let skyColor = \"#858585\";\r\n      let earthColor = \"#858585\";\r\n      let majorColor = \"#c7c7c7\";  // major grid (non-semantic)\r\n      let mediumColor = \"#ebebeb\";\r\n      let minorColor = \"#ebebeb\";\r\n\r\n      // Apply bulk option (sets all grid colors)\r\n      if ('grid-color' in rawOptions) {\r\n        const gc = rawOptions['grid-color'];\r\n        skyColor = earthColor = majorColor = mediumColor = minorColor = gc;\r\n      }\r\n\r\n      // Apply category option for major grids (overrides bulk for major lines)\r\n      if ('grid-major-color' in rawOptions) {\r\n        const gmc = rawOptions['grid-major-color'];\r\n        skyColor = earthColor = majorColor = gmc;\r\n      }\r\n\r\n      // Apply category option for medium grid (overrides bulk)\r\n      if ('grid-medium-color' in rawOptions) {\r\n        mediumColor = rawOptions['grid-medium-color'];\r\n      }\r\n\r\n      // Apply category option for minor grid (overrides bulk)\r\n      if ('grid-minor-color' in rawOptions) {\r\n        minorColor = rawOptions['grid-minor-color'];\r\n      }\r\n\r\n      // Apply specific options (most specific, override everything)\r\n      if ('grid-sky-color' in rawOptions) {\r\n        skyColor = rawOptions['grid-sky-color'];\r\n      }\r\n\r\n      if ('grid-earth-color' in rawOptions) {\r\n        earthColor = rawOptions['grid-earth-color'];\r\n      }\r\n\r\n      // Assign to options object (escaped for safe SVG output)\r\n      options.gridSkyColor = escapeHtml(skyColor);\r\n      options.gridEarthColor = escapeHtml(earthColor);\r\n      options.gridMajorColor = escapeHtml(majorColor);\r\n      options.gridMediumColor = escapeHtml(mediumColor);\r\n      options.gridMinorColor = escapeHtml(minorColor);\r\n    }\r\n\r\n    // Grid stroke widths - same hierarchy pattern\r\n    // Only process if builder defaults requested or if grid options present\r\n    if (addBuilderDefaults || Object.keys(rawOptions).some(k => k.startsWith('grid-'))) {\r\n      // Start with defaults\r\n      let skyWidth = 0.166;\r\n      let earthWidth = 0.166;\r\n      let majorWidth = 0.166;  // major grid (non-semantic)\r\n      let mediumWidth = 0.166;\r\n      let minorWidth = 0.166;\r\n\r\n      // Apply bulk option (sets all grid widths)\r\n      if ('grid-stroke-width' in rawOptions) {\r\n        const gsw = Number(rawOptions['grid-stroke-width']);\r\n        skyWidth = earthWidth = majorWidth = mediumWidth = minorWidth = gsw;\r\n      }\r\n\r\n      // Apply category option for major grids (overrides bulk for major lines)\r\n      if ('grid-major-stroke-width' in rawOptions) {\r\n        const gmsw = Number(rawOptions['grid-major-stroke-width']);\r\n        skyWidth = earthWidth = majorWidth = gmsw;\r\n      }\r\n\r\n      // Apply category option for medium grid (overrides bulk)\r\n      if ('grid-medium-stroke-width' in rawOptions) {\r\n        mediumWidth = Number(rawOptions['grid-medium-stroke-width']);\r\n      }\r\n\r\n      // Apply category option for minor grid (overrides bulk)\r\n      if ('grid-minor-stroke-width' in rawOptions) {\r\n        minorWidth = Number(rawOptions['grid-minor-stroke-width']);\r\n      }\r\n\r\n      // Apply specific options (most specific, override everything)\r\n      if ('grid-sky-stroke-width' in rawOptions) {\r\n        skyWidth = Number(rawOptions['grid-sky-stroke-width']);\r\n      }\r\n\r\n      if ('grid-earth-stroke-width' in rawOptions) {\r\n        earthWidth = Number(rawOptions['grid-earth-stroke-width']);\r\n      }\r\n\r\n      // Assign to options object\r\n      options.gridSkyStrokeWidth = skyWidth;\r\n      options.gridEarthStrokeWidth = earthWidth;\r\n      options.gridMajorStrokeWidth = majorWidth;\r\n      options.gridMediumStrokeWidth = mediumWidth;\r\n      options.gridMinorStrokeWidth = minorWidth;\r\n    }\r\n\r\n    // crop: Sets ALL 4 crop values (number or 'auto')\r\n    if ('crop' in rawOptions) {\r\n      const c = rawOptions['crop'];\r\n      if (c === 'auto') {\r\n        options.cropTop = 'auto';\r\n        options.cropBottom = 'auto';\r\n        options.cropLeft = 'auto';\r\n        options.cropRight = 'auto';\r\n      } else if (c === 'auto-vertical') {\r\n        options.autoVertical = true;\r\n      } else if (c === 'compact') {\r\n        options.cropCompact = true;\r\n      } else if (!isNaN(c)) {\r\n        const n = Number(c);\r\n        options.cropTop = n;\r\n        options.cropBottom = n;\r\n        options.cropLeft = n;\r\n        options.cropRight = n;\r\n      }\r\n    }\r\n\r\n    // Individual crop values (override the above if present)\r\n    // Each can be a number or 'auto'\r\n    const parseCropValue = (val) => val === 'auto' ? 'auto' : Number(val);\r\n    if ('crop-top' in rawOptions) {\r\n      options.cropTop = parseCropValue(rawOptions['crop-top']);\r\n    }\r\n    if ('crop-bottom' in rawOptions) {\r\n      options.cropBottom = parseCropValue(rawOptions['crop-bottom']);\r\n    }\r\n    if ('crop-left' in rawOptions) {\r\n      options.cropLeft = parseCropValue(rawOptions['crop-left']);\r\n    }\r\n    if ('crop-right' in rawOptions) {\r\n      options.cropRight = parseCropValue(rawOptions['crop-right']);\r\n    }\r\n\r\n    // Other string options\r\n    if ('color' in rawOptions) {\r\n      options.color = escapeHtml(rawOptions.color);\r\n    }\r\n    if ('background' in rawOptions) {\r\n      options.background = escapeHtml(rawOptions.background); // empty string => transparent background\r\n    }\r\n    if ('background-top' in rawOptions) {\r\n      options.backgroundTop = escapeHtml(rawOptions['background-top']);\r\n    }\r\n    if ('background-mid' in rawOptions) {\r\n      options.backgroundMid = escapeHtml(rawOptions['background-mid']);\r\n    }\r\n    if ('background-bottom' in rawOptions) {\r\n      options.backgroundBottom = escapeHtml(rawOptions['background-bottom']);\r\n    }\r\n    if ('text' in rawOptions) {\r\n      options.text = escapeHtml(rawOptions.text);\r\n    }\r\n    if ('svg-desc' in rawOptions) {\r\n      options.svgDesc = escapeHtml(rawOptions['svg-desc']);\r\n    }\r\n    if ('svg-title' in rawOptions) {\r\n      options.svgTitle = escapeHtml(rawOptions['svg-title']);\r\n    }\r\n\r\n    // SVG element height (presentation size, not viewBox)\r\n    if ('svg-height' in rawOptions && !isNaN(rawOptions['svg-height'])) {\r\n      options.svgHeight = Number(rawOptions['svg-height']);\r\n    }\r\n\r\n    // Preserve any options that weren't explicitly processed (like fill, opacity, stroke-dasharray, etc.)\r\n    // Only skip options that are in KNOWN_OPTION_KEYS (already processed above)\r\n    // String values are escaped here at the input boundary so downstream code can use them safely.\r\n    // Numeric values pass through as-is — they're used for calculations, not SVG markup.\r\n    for (const [key, value] of Object.entries(rawOptions)) {\r\n      if (!KNOWN_OPTION_KEYS.has(key)) {\r\n        options[key] = typeof value === 'string' ? escapeHtml(value) : value;\r\n      }\r\n    }\r\n\r\n    return options;\r\n  }\r\n\r\n  // Recursively process options at all levels (groups, glyphs, parts)\r\n  #processAllOptions(obj, isTopLevel = false) {\r\n    if (obj.options) {\r\n      // Extract key from options (key is element identity, not an SVG option)\r\n      if (obj.options.key !== undefined) {\r\n        obj.key = obj.options.key;\r\n        delete obj.options.key;\r\n      }\r\n      obj.options = this.#processOptions(obj.options, isTopLevel);\r\n    }\r\n    if (obj.groups) {\r\n      for (const group of obj.groups) {\r\n        this.#processAllOptions(group, false);\r\n      }\r\n    }\r\n    if (obj.glyphs) {\r\n      for (const glyph of obj.glyphs) {\r\n        this.#processAllOptions(glyph, false);\r\n      }\r\n    }\r\n    if (obj.parts) {\r\n      for (const part of obj.parts) {\r\n        this.#processAllOptions(part, false);\r\n      }\r\n    }\r\n  }\r\n\r\n  #rawBlissObj; // Stored for toJSON() round-trip\r\n\r\n  constructor(input, options = {}) {\r\n    const { defaults, overrides } = BlissSVGBuilder.#resolveOpts(options);\r\n\r\n    // Allow empty constructor for building from scratch\r\n    if (input === undefined || input === '') {\r\n      input = '';\r\n    } else if (typeof input !== 'string' && (typeof input !== 'object' || input === null || Array.isArray(input))) {\r\n      throw new Error('Input must be a DSL string or a plain object from toJSON()');\r\n    }\r\n\r\n    // Accept both string (DSL) and object (from toJSON()) input\r\n    const blissObj = (typeof input === 'string')\r\n      ? BlissParser.parse(input)\r\n      : structuredClone(input);\r\n\r\n    // For object input (from toJSON), re-expand any parts that were stripped\r\n    if (typeof input !== 'string') {\r\n      BlissParser.expandParts(blissObj);\r\n    }\r\n\r\n    // Reverse toJSON() normalization: codeName → internal field names\r\n    if (typeof input !== 'string' && blissObj.groups) {\r\n      BlissSVGBuilder.#normalizeGlyphCodes(blissObj.groups);\r\n    }\r\n\r\n    // Merge: defaults (lowest) < string options (middle) < overrides (highest)\r\n    if (defaults || overrides) {\r\n      const rawDefaults = defaults ? BlissSVGBuilder.#toRaw(defaults) : {};\r\n      const rawOverrides = overrides ? BlissSVGBuilder.#toRaw(overrides) : {};\r\n      blissObj.options = { ...rawDefaults, ...(blissObj.options ?? {}), ...rawOverrides };\r\n    }\r\n\r\n    // Flag word-as-part references (e.g. H;TW where TW = B291/B291) with\r\n    // error so BlissElement emits a WORD_AS_PART warning instead of rendering.\r\n    BlissSVGBuilder.#flagWordParts(blissObj);\r\n\r\n    // Store a clean copy after option merging but before processing mutates it\r\n    this.#rawBlissObj = structuredClone(blissObj);\r\n\r\n    this.#rebuild();\r\n\r\n    this.#mutationCtx = {\r\n      getRaw: () => this.#rawBlissObj,\r\n      rebuild: () => this.#rebuild(),\r\n      parse: (code) => {\r\n        const parsed = BlissParser.parse(code);\r\n        BlissSVGBuilder.#flagWordParts(parsed);\r\n        return parsed;\r\n      },\r\n      toRaw: (obj) => BlissSVGBuilder.#toRaw(obj),\r\n      isRawSpaceGroup: (g) => BlissSVGBuilder.#isRawSpaceGroup(g),\r\n      makeSpaceGroup: () => BlissSVGBuilder.#makeSpaceGroup(),\r\n      removeGlyphGroup: (obj, gi) => this.#removeGlyphGroup(obj, gi),\r\n      getSnapshot: () => this.snapshot(),\r\n      getGeneration: () => this.#generation,\r\n      getDefinitions: () => blissElementDefinitions,\r\n      // Build a temporary element tree for layout computation (e.g. addGlyph word expansion)\r\n      computeLayout: (code) => {\r\n        const parsed = BlissParser.parse(code);\r\n        const tempElement = new BlissElement(parsed, { sharedOptions: this.#sharedOptions });\r\n        return tempElement.snapshot();\r\n      },\r\n    };\r\n  }\r\n\r\n  // Resolve opts: accepts { defaults, overrides } or flat options (treated as overrides).\r\n  static #resolveOpts(opts) {\r\n    if (!opts) return { defaults: undefined, overrides: undefined };\r\n    if ('defaults' in opts || 'overrides' in opts) {\r\n      return { defaults: opts.defaults, overrides: opts.overrides };\r\n    }\r\n    return { defaults: undefined, overrides: opts };\r\n  }\r\n\r\n  static #toRaw(obj) {\r\n    const raw = {};\r\n    for (const [key, value] of Object.entries(obj)) {\r\n      if (value === null || value === undefined) continue;\r\n      if (typeof value === 'object') continue;\r\n      const kebabKey = camelToKebab(key);\r\n      if (typeof value === 'boolean') {\r\n        raw[kebabKey] = value;\r\n      } else {\r\n        raw[kebabKey] = String(value);\r\n      }\r\n    }\r\n    return raw;\r\n  }\r\n\r\n  // Assigns stable keys to the three DSL-visible levels in #rawBlissObj:\r\n  // groups (//), glyphs (/), and immediate parts (;).\r\n  // Called before structuredClone so keys persist across rebuilds.\r\n  // Deeper nested parts (definition expansions) are intentionally skipped —\r\n  // they are not user-addressable and receive ephemeral keys from BlissElement.\r\n  static #assignKeys(rawObj) {\r\n    if (!rawObj.key) rawObj.key = generateKey();\r\n    if (rawObj.groups) {\r\n      for (const group of rawObj.groups) {\r\n        if (!group.key) group.key = generateKey();\r\n        if (group.glyphs) {\r\n          for (const glyph of group.glyphs) {\r\n            if (!glyph.key) glyph.key = generateKey();\r\n            if (glyph.parts) {\r\n              for (const part of glyph.parts) {\r\n                if (!part.key) part.key = generateKey();\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  #rebuild() {\r\n    this.#generation++;\r\n    this.#elementsCache = undefined;\r\n    this.#groupsCache = undefined;\r\n    this.#warnings = [];\r\n\r\n    BlissSVGBuilder.#assignKeys(this.#rawBlissObj);\r\n    const blissObj = structuredClone(this.#rawBlissObj);\r\n    this.#processAllOptions(blissObj, true);\r\n\r\n    const { charSpace, wordSpace, externalGlyphSpace, errorPlaceholder, ...remainingOptions } = blissObj.options ?? {};\r\n    this.#sharedOptions = {\r\n      charSpace: charSpace ?? 2,\r\n      wordSpace: wordSpace ?? 8,\r\n      externalGlyphSpace: externalGlyphSpace ?? 0.8,\r\n      warnings: this.#warnings,\r\n      errorPlaceholder: errorPlaceholder === true,\r\n      errorPlaceholderParts: ERROR_PLACEHOLDER_PARTS,\r\n      keys: new Set(),\r\n    };\r\n    if (blissObj._parseWarnings) {\r\n      this.#warnings.push(...blissObj._parseWarnings);\r\n      delete blissObj._parseWarnings;\r\n    }\r\n    blissObj.options = remainingOptions;\r\n    this.#processedOptions = blissObj.options;\r\n\r\n    const attrMap = { 'color': 'stroke' };\r\n    this.globalSvgAttributes = {};\r\n    for (const [key, value] of Object.entries(blissObj.options ?? {})) {\r\n      if (!INTERNAL_OPTIONS.has(key) && isSafeAttributeName(key)) {\r\n        this.globalSvgAttributes[attrMap[key] || camelToKebab(key)] = value;\r\n      }\r\n    }\r\n\r\n    this.composition = new BlissElement(blissObj, { sharedOptions: this.#sharedOptions });\r\n  }\r\n\r\n  /**\r\n   * Returns warnings generated during parsing/rendering.\r\n   * Each warning has { code, message, source } describing the issue.\r\n   * @returns {Array<{ code: string, message: string, source: string }>}\r\n   */\r\n  get warnings() {\r\n    return this.#warnings;\r\n  }\r\n\r\n  #elementsCache;\r\n\r\n  /**\r\n   * Returns the root element snapshot — a frozen tree of all element data.\r\n   * Cached on first access (builder instances are immutable).\r\n   *\r\n   * @returns {ElementSnapshot} Frozen root snapshot with nested children\r\n   */\r\n  get elements() {\r\n    if (!this.#elementsCache) {\r\n      this.#elementsCache = this.composition.snapshot();\r\n    }\r\n    return this.#elementsCache;\r\n  }\r\n\r\n  /**\r\n   * Depth-first traversal of all element snapshots.\r\n   * Return false from the callback to stop traversal early.\r\n   *\r\n   * @param {function(ElementSnapshot): boolean|void} callback\r\n   */\r\n  traverse(callback) {\r\n    function walk(el) {\r\n      if (callback(el) === false) return false;\r\n      for (const child of el.children) {\r\n        if (walk(child) === false) return false;\r\n      }\r\n    }\r\n    walk(this.elements);\r\n  }\r\n\r\n  /**\r\n   * Find all element snapshots matching a predicate.\r\n   *\r\n   * @param {function(ElementSnapshot): boolean} predicate\r\n   * @returns {ElementSnapshot[]}\r\n   */\r\n  query(predicate) {\r\n    const results = [];\r\n    this.traverse(el => { if (predicate(el)) results.push(el); });\r\n    return results;\r\n  }\r\n\r\n  /**\r\n   * Look up an element by its snapshot key, returning a live ElementHandle.\r\n   *\r\n   * @param {string} key\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  getElementByKey(key) {\r\n    const snap = this.snapshot();\r\n    const groups = snap.children;\r\n    const rawGroups = this.#rawBlissObj.groups;\r\n\r\n    // Walk snapshot tree in parallel with raw groups\r\n    for (let rawGi = 0; rawGi < groups.length; rawGi++) {\r\n      const groupSnap = groups[rawGi];\r\n      const rawGroup = rawGroups[rawGi];\r\n\r\n      if (groupSnap.key === key) {\r\n        return new ElementHandle(this.#mutationCtx, 1, rawGroup);\r\n      }\r\n\r\n      const glyphs = groupSnap.children.filter(c => c.isGlyph);\r\n      for (let gi = 0; gi < glyphs.length; gi++) {\r\n        const rawGlyph = rawGroup.glyphs[gi];\r\n        if (glyphs[gi].key === key) {\r\n          return new ElementHandle(this.#mutationCtx, 2, rawGlyph, rawGroup);\r\n        }\r\n        const parts = glyphs[gi].children;\r\n        for (let pi = 0; pi < parts.length; pi++) {\r\n          if (parts[pi].key === key) {\r\n            return new ElementHandle(this.#mutationCtx, 3, rawGlyph.parts[pi], { group: rawGroup, glyph: rawGlyph });\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // --- Live Navigation ---\r\n\r\n  #getNonSpaceGroupIndices() {\r\n    const indices = [];\r\n    const groups = this.#rawBlissObj.groups || [];\r\n    for (let i = 0; i < groups.length; i++) {\r\n      if (!BlissSVGBuilder.#isRawSpaceGroup(groups[i])) {\r\n        indices.push(i);\r\n      }\r\n    }\r\n    return indices;\r\n  }\r\n\r\n  /**\r\n   * Returns a live ElementHandle for the non-space group at the given index.\r\n   * @param {number} index\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  group(index) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (index < 0) index = indices.length + index;\r\n    if (index < 0 || index >= indices.length) return null;\r\n    const rawGroup = this.#rawBlissObj.groups[indices[index]];\r\n    return new ElementHandle(this.#mutationCtx, 1, rawGroup);\r\n  }\r\n\r\n  /**\r\n   * Returns a live ElementHandle for any group (including spaces) at the given raw index.\r\n   * @param {number} index - Raw index (supports negative: -1 = last)\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  element(index) {\r\n    const groups = this.#rawBlissObj.groups;\r\n    if (index < 0) index = groups.length + index;\r\n    if (index < 0 || index >= groups.length) return null;\r\n    return new ElementHandle(this.#mutationCtx, 1, groups[index]);\r\n  }\r\n\r\n  /**\r\n   * Total number of raw groups (including space groups).\r\n   * @returns {number}\r\n   */\r\n  get elementCount() {\r\n    return this.#rawBlissObj.groups.length;\r\n  }\r\n\r\n  /**\r\n   * Returns a live ElementHandle for the glyph at the given flat index across all groups.\r\n   * @param {number} flatIndex\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  glyph(flatIndex) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (flatIndex < 0) {\r\n      let total = 0;\r\n      for (const gi of indices) {\r\n        total += (this.#rawBlissObj.groups[gi].glyphs || []).length;\r\n      }\r\n      flatIndex = total + flatIndex;\r\n    }\r\n    if (flatIndex < 0) return null;\r\n    let count = 0;\r\n    for (const gi of indices) {\r\n      const group = this.#rawBlissObj.groups[gi];\r\n      const glyphs = group.glyphs || [];\r\n      if (flatIndex < count + glyphs.length) {\r\n        return new ElementHandle(this.#mutationCtx, 2, glyphs[flatIndex - count], group);\r\n      }\r\n      count += glyphs.length;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Returns a live ElementHandle for the part at the given flat index across all glyphs.\r\n   * @param {number} flatIndex\r\n   * @returns {ElementHandle|null}\r\n   */\r\n  part(flatIndex) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (flatIndex < 0) {\r\n      let total = 0;\r\n      for (const gi of indices) {\r\n        for (const glyph of (this.#rawBlissObj.groups[gi].glyphs || [])) {\r\n          total += (glyph.parts || []).length;\r\n        }\r\n      }\r\n      flatIndex = total + flatIndex;\r\n    }\r\n    if (flatIndex < 0) return null;\r\n    let count = 0;\r\n    for (const gi of indices) {\r\n      const group = this.#rawBlissObj.groups[gi];\r\n      const glyphs = group.glyphs || [];\r\n      for (const glyph of glyphs) {\r\n        const parts = glyph.parts || [];\r\n        if (flatIndex < count + parts.length) {\r\n          return new ElementHandle(this.#mutationCtx, 3, parts[flatIndex - count], { group, glyph });\r\n        }\r\n        count += parts.length;\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Returns a frozen snapshot of the element tree.\r\n   * @returns {ElementSnapshot}\r\n   */\r\n  snapshot() {\r\n    return this.elements;\r\n  }\r\n\r\n  // --- Builder Convenience Methods ---\r\n\r\n  /**\r\n   * Appends a new glyph group with automatic space management.\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  addGroup(code, opts) {\r\n    const nonSpaceCount = this.#getNonSpaceGroupIndices().length;\r\n    return this.insertGroup(nonSpaceCount, code, opts);\r\n  }\r\n\r\n  /**\r\n   * Inserts a new glyph group at the given semantic (non-space) index\r\n   * with automatic space management.\r\n   * @param {number} index - Semantic non-space group index\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  insertGroup(index, code, opts) {\r\n    const newGroup = BlissSVGBuilder.#parseGroupWithOpts(code, opts);\r\n    if (!newGroup) return this;\r\n    const groups = this.#rawBlissObj.groups;\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n\r\n    if (groups.length === 0 || indices.length === 0) {\r\n      // Empty — just push, no spaces needed\r\n      groups.push(newGroup);\r\n    } else if (index <= 0) {\r\n      // Insert at start: [newGroup, space, ...existing]\r\n      groups.splice(0, 0, newGroup, BlissSVGBuilder.#makeSpaceGroup());\r\n    } else if (index >= indices.length) {\r\n      // Insert at end: [...existing, space, newGroup]\r\n      groups.push(BlissSVGBuilder.#makeSpaceGroup());\r\n      groups.push(newGroup);\r\n    } else {\r\n      // Insert in middle: before the target raw index, add [space, newGroup]\r\n      const rawIndex = indices[index];\r\n      groups.splice(rawIndex, 0, newGroup, BlissSVGBuilder.#makeSpaceGroup());\r\n    }\r\n\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Appends a glyph to the last non-space group (creates one if empty).\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  addGlyph(code, opts) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (indices.length === 0) {\r\n      // Empty builder — create a new group with this glyph\r\n      return this.addGroup(code, opts);\r\n    }\r\n    const lastGi = indices[indices.length - 1];\r\n    const rawGroup = this.#rawBlissObj.groups[lastGi];\r\n    const handle = new ElementHandle(this.#mutationCtx, 1, rawGroup);\r\n    handle.addGlyph(code, opts);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Appends a part to the last non-space group's last glyph (creates group if empty).\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  addPart(code, opts) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (indices.length === 0) {\r\n      return this.addGroup(code, opts);\r\n    }\r\n    const lastGi = indices[indices.length - 1];\r\n    const rawGroup = this.#rawBlissObj.groups[lastGi];\r\n    const handle = new ElementHandle(this.#mutationCtx, 1, rawGroup);\r\n    handle.addPart(code, opts);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Removes the non-space group at the given semantic index.\r\n   * @param {number} index - Semantic index (supports negative)\r\n   * @returns {this}\r\n   */\r\n  removeGroup(index) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (index < 0) index = indices.length + index;\r\n    if (index < 0 || index >= indices.length) return this;\r\n    const rawIndex = indices[index];\r\n    this.#removeGlyphGroup(this.#rawBlissObj, rawIndex);\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Replaces the non-space group at the given semantic index.\r\n   * @param {number} index - Semantic index (supports negative)\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  replaceGroup(index, code, opts) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (index < 0) index = indices.length + index;\r\n    if (index < 0 || index >= indices.length) return this;\r\n    const newGroup = BlissSVGBuilder.#parseGroupWithOpts(code, opts);\r\n    if (!newGroup) return this;\r\n    const rawIndex = indices[index];\r\n    this.#rawBlissObj.groups[rawIndex] = newGroup;\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Merges another builder's content into this one. Appends the other\r\n   * builder's word groups (with a space group between) and discards\r\n   * its global options. The other builder is not modified.\r\n   *\r\n   * @param {BlissSVGBuilder} other\r\n   * @returns {this}\r\n   */\r\n  merge(other) {\r\n    if (!other || typeof other.toJSON !== 'function') {\r\n      throw new Error('merge() requires a BlissSVGBuilder instance');\r\n    }\r\n\r\n    const otherRaw = other.toJSON({ deep: true });\r\n    const otherGroups = otherRaw.groups;\r\n    if (!otherGroups || otherGroups.length === 0) return this;\r\n\r\n    // Filter out groups that are only spaces (no real content)\r\n    const hasContent = otherGroups.some(\r\n      g => !BlissSVGBuilder.#isRawSpaceGroup(g)\r\n    );\r\n    if (!hasContent) return this;\r\n\r\n    // Re-ingest toJSON output into internal format (same order as constructor)\r\n    BlissParser.expandParts({ groups: otherGroups });\r\n    BlissSVGBuilder.#normalizeGlyphCodes(otherGroups);\r\n    BlissSVGBuilder.#flagWordParts({ groups: otherGroups });\r\n\r\n    const groups = this.#rawBlissObj.groups;\r\n\r\n    // Insert space before appended content if this builder has content\r\n    const hasExisting = groups.some(\r\n      g => !BlissSVGBuilder.#isRawSpaceGroup(g)\r\n    );\r\n    if (hasExisting) {\r\n      groups.push(BlissSVGBuilder.#makeSpaceGroup());\r\n    }\r\n\r\n    groups.push(...otherGroups);\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Splits this builder into two at the given non-space group boundary.\r\n   * This builder keeps groups 0 through groupIndex-1. A new builder is\r\n   * returned with groups from groupIndex onward. Both builders share the\r\n   * same global options. Space groups at the split boundary are consumed.\r\n   *\r\n   * @param {number} groupIndex - Non-space group index (1 to groupCount-1)\r\n   * @returns {BlissSVGBuilder} New builder with the right-half groups\r\n   */\r\n  splitAt(groupIndex) {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    if (indices.length < 2) {\r\n      throw new Error('splitAt() requires at least 2 groups');\r\n    }\r\n    if (groupIndex <= 0 || groupIndex >= indices.length) {\r\n      throw new Error(\r\n        `splitAt(${groupIndex}) is out of range: must be between 1 and ${indices.length - 1} (inclusive) for a builder with ${indices.length} groups`\r\n      );\r\n    }\r\n\r\n    // Find the raw index of the split point\r\n    const rawSplitIndex = indices[groupIndex];\r\n\r\n    // Extract right-half groups (from rawSplitIndex onward)\r\n    const rightGroups = this.#rawBlissObj.groups.splice(rawSplitIndex);\r\n\r\n    // Clean up: remove trailing space groups from the left half\r\n    while (\r\n      this.#rawBlissObj.groups.length > 0 &&\r\n      BlissSVGBuilder.#isRawSpaceGroup(\r\n        this.#rawBlissObj.groups[this.#rawBlissObj.groups.length - 1]\r\n      )\r\n    ) {\r\n      this.#rawBlissObj.groups.pop();\r\n    }\r\n\r\n    // Clean up: remove leading space groups from the right half\r\n    while (\r\n      rightGroups.length > 0 &&\r\n      BlissSVGBuilder.#isRawSpaceGroup(rightGroups[0])\r\n    ) {\r\n      rightGroups.shift();\r\n    }\r\n\r\n    // Rebuild the left half (this builder)\r\n    this.#rebuild();\r\n\r\n    // Build the right half as a new builder\r\n    // Copy global options so both builders have the same styling\r\n    const rightObj = {\r\n      groups: rightGroups,\r\n    };\r\n    if (this.#rawBlissObj.options) {\r\n      rightObj.options = { ...this.#rawBlissObj.options };\r\n    }\r\n\r\n    return new BlissSVGBuilder(rightObj);\r\n  }\r\n\r\n  /**\r\n   * Parses a code string and applies option layers to the first parsed group.\r\n   * @param {string} code\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {object|null} parsed group or null\r\n   */\r\n  static #parseGroupWithOpts(code, opts) {\r\n    const parsed = BlissParser.parse(code);\r\n    const newGroup = parsed.groups?.[0];\r\n    if (!newGroup) return null;\r\n    if (opts) {\r\n      const { defaults, overrides } = BlissSVGBuilder.#resolveOpts(opts);\r\n      if (defaults || overrides) {\r\n        const rawDefaults = defaults ? BlissSVGBuilder.#toRaw(defaults) : {};\r\n        const rawOverrides = overrides ? BlissSVGBuilder.#toRaw(overrides) : {};\r\n        newGroup.options = { ...rawDefaults, ...(newGroup.options ?? {}), ...rawOverrides };\r\n      }\r\n    }\r\n    return newGroup;\r\n  }\r\n\r\n  // --- Raw Element CRUD (no automatic space management) ---\r\n\r\n  /**\r\n   * Appends a raw group with no automatic space management.\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  addElement(code, opts) {\r\n    const newGroup = BlissSVGBuilder.#parseGroupWithOpts(code, opts);\r\n    if (!newGroup) return this;\r\n    this.#rawBlissObj.groups.push(newGroup);\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Inserts a raw group at the given index with no automatic space management.\r\n   * @param {number} index - Raw index (supports negative: -1 = before last)\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  insertElement(index, code, opts) {\r\n    const newGroup = BlissSVGBuilder.#parseGroupWithOpts(code, opts);\r\n    if (!newGroup) return this;\r\n    const groups = this.#rawBlissObj.groups;\r\n    if (index < 0) index = groups.length + index;\r\n    if (index < 0) index = 0;\r\n    if (index >= groups.length) {\r\n      groups.push(newGroup);\r\n    } else {\r\n      groups.splice(index, 0, newGroup);\r\n    }\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Removes the raw group at the given index (plain splice, no space cleanup).\r\n   * @param {number} index - Raw index (supports negative: -1 = last)\r\n   * @returns {this}\r\n   */\r\n  removeElement(index) {\r\n    const groups = this.#rawBlissObj.groups;\r\n    if (index < 0) index = groups.length + index;\r\n    if (index < 0 || index >= groups.length) return this;\r\n    groups.splice(index, 1);\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Replaces the raw group at the given index with new content.\r\n   * @param {number} index - Raw index (supports negative: -1 = last)\r\n   * @param {string} code - DSL code string\r\n   * @param {Object | { defaults?: Object, overrides?: Object }} [opts]\r\n   * @returns {this}\r\n   */\r\n  replaceElement(index, code, opts) {\r\n    const groups = this.#rawBlissObj.groups;\r\n    if (index < 0) index = groups.length + index;\r\n    if (index < 0 || index >= groups.length) return this;\r\n    const newGroup = BlissSVGBuilder.#parseGroupWithOpts(code, opts);\r\n    if (!newGroup) return this;\r\n    groups[index] = newGroup;\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Removes all content from the builder.\r\n   * @returns {this}\r\n   */\r\n  clear() {\r\n    this.#rawBlissObj.groups = [];\r\n    this.#rebuild();\r\n    return this;\r\n  }\r\n\r\n  #groupsCache;\r\n\r\n  /**\r\n   * Returns non-space group snapshots.\r\n   * Cached and frozen.\r\n   *\r\n   * @returns {ElementSnapshot[]}\r\n   */\r\n  get groups() {\r\n    if (!this.#groupsCache) {\r\n      const groups = this.elements.children.filter(g =>\r\n        g.isGroup && !g.isSpaceGroup\r\n      );\r\n      this.#groupsCache = Object.freeze(groups);\r\n    }\r\n    return this.#groupsCache;\r\n  }\r\n\r\n  /**\r\n   * Returns group and glyph counts.\r\n   *\r\n   * @returns {{ groupCount: number, glyphCount: number }}\r\n   */\r\n  get stats() {\r\n    const indices = this.#getNonSpaceGroupIndices();\r\n    let glyphCount = 0;\r\n    for (const gi of indices) {\r\n      glyphCount += (this.#rawBlissObj.groups[gi].glyphs || []).length;\r\n    }\r\n    return { groupCount: indices.length, glyphCount };\r\n  }\r\n\r\n  // --- Manipulation helpers ---\r\n\r\n  // --- Word-as-part detection ---\r\n  // When a word definition (codeString with /) appears at the part level,\r\n  // the parser keeps it as a single codeName. This post-parse step marks\r\n  // those references with an error so BlissElement can emit a warning.\r\n\r\n  /**\r\n   * Reverse toJSON() normalization for object input:\r\n   *  - Glyph level: codeName → glyphCode rename.\r\n   *  - Glyphs and parts: surface text-fallback form 'X<chars>' → internal\r\n   *    routing key 'XTXT_<chars>' so BlissElement / parser routing works.\r\n   * @param {Object[]} groups - Array of raw group objects\r\n   */\r\n  static #normalizeGlyphCodes(groups) {\r\n    for (const group of groups) {\r\n      if (!group.glyphs) continue;\r\n      for (const glyph of group.glyphs) {\r\n        if (glyph.codeName && !glyph.glyphCode) {\r\n          glyph.glyphCode = BlissSVGBuilder.#textFallbackInternalForm(glyph.codeName);\r\n          delete glyph.codeName;\r\n        }\r\n        if (glyph.parts) BlissSVGBuilder.#normalizePartCodes(glyph.parts);\r\n      }\r\n    }\r\n  }\r\n\r\n  static #normalizePartCodes(parts) {\r\n    for (const part of parts) {\r\n      if (part.codeName) {\r\n        part.codeName = BlissSVGBuilder.#textFallbackInternalForm(part.codeName);\r\n      }\r\n      if (part.parts) BlissSVGBuilder.#normalizePartCodes(part.parts);\r\n    }\r\n  }\r\n\r\n  // 'X<chars>' (public text-fallback form) → 'XTXT_<chars>' (internal\r\n  // routing key). Built-in / registered codes (Xa, XL8, B431, …) and\r\n  // already-internal forms pass through unchanged.\r\n  static #textFallbackInternalForm(code) {\r\n    if (code.startsWith('XTXT_')) return code;\r\n    if (code.length < 2 || code[0] !== 'X') return code;\r\n    if (blissElementDefinitions[code]) return code;\r\n    return 'XTXT_' + code.slice(1);\r\n  }\r\n\r\n  /**\r\n   * Walk a raw parsed structure and flag any word-as-part references.\r\n   * @param {Object} rawObj - Raw parsed blissObj with groups/glyphs/parts\r\n   */\r\n  static #flagWordParts(rawObj) {\r\n    if (!rawObj.groups) return;\r\n    for (const group of rawObj.groups) {\r\n      if (!group.glyphs) continue;\r\n      for (const glyph of group.glyphs) {\r\n        if (!glyph.parts) continue;\r\n        glyph.parts = BlissSVGBuilder.#flagWordPartsInArray(glyph.parts);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Flag word-definition parts with an error. Recurses into nested parts.\r\n   */\r\n  static #flagWordPartsInArray(parts) {\r\n    const result = [];\r\n    for (const part of parts) {\r\n      const def = blissElementDefinitions[part.codeName];\r\n      if (def?.codeString?.includes('/')) {\r\n        part.error = `\"${part.codeName}\" is a word and cannot be composed with ;`;\r\n        part.errorCode = 'WORD_AS_PART';\r\n        result.push(part);\r\n      } else {\r\n        if (part.parts) {\r\n          part.parts = BlissSVGBuilder.#flagWordPartsInArray(part.parts);\r\n        }\r\n        result.push(part);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  // Space codes used in space groups\r\n  static #SPACE_CODES = new Set(['TSP', 'QSP', 'ZSA', 'SP']);\r\n\r\n  /** Returns true if a raw group is a space group */\r\n  static #isRawSpaceGroup(group) {\r\n    if (!group.glyphs || group.glyphs.length === 0) return false;\r\n    return group.glyphs.every(g =>\r\n      g.parts?.length === 1 && BlissSVGBuilder.#SPACE_CODES.has(g.parts[0].codeName)\r\n    );\r\n  }\r\n\r\n  /** Creates a default space group for insertion between words */\r\n  static #makeSpaceGroup() {\r\n    return { glyphs: [{ parts: [{ codeName: 'TSP' }] }] };\r\n  }\r\n\r\n  /** Internal: removes a glyph group and its adjacent space from groups array */\r\n  #removeGlyphGroup(obj, groupIndex) {\r\n    const groups = obj.groups;\r\n    // Determine which space group to also remove\r\n    const prevIsSpace = groupIndex > 0 && BlissSVGBuilder.#isRawSpaceGroup(groups[groupIndex - 1]);\r\n    const nextIsSpace = groupIndex < groups.length - 1 && BlissSVGBuilder.#isRawSpaceGroup(groups[groupIndex + 1]);\r\n\r\n    if (prevIsSpace) {\r\n      // Remove space before + the word\r\n      groups.splice(groupIndex - 1, 2);\r\n    } else if (nextIsSpace) {\r\n      // Remove the word + space after\r\n      groups.splice(groupIndex, 2);\r\n    } else {\r\n      // No adjacent space, just remove the word\r\n      groups.splice(groupIndex, 1);\r\n    }\r\n    return obj;\r\n  }\r\n\r\n  /**\r\n   * Returns a portable DSL string. Typeless aliases (word-level codes) are\r\n   * always expanded. Custom glyphs and shapes are decomposed to built-in\r\n   * codes by default; pass { preserve: true } to keep their names.\r\n   *\r\n   * @param {Object} [options]\r\n   * @param {boolean} [options.preserve=false] - Keep custom glyph/shape code names\r\n   * @returns {string}\r\n   */\r\n  toString(options = {}) {\r\n    // toString always needs nested parts so serializeParts can decompose\r\n    // custom codes. The string output itself stays flat (;-delimited).\r\n    const obj = this.toJSON({ preserve: options.preserve, deep: true });\r\n\r\n    const GLYPH_INTERNAL_KEYS = new Set(['relativeKerning', 'absoluteKerning']);\r\n\r\n    // Serialize an options object to [key=val;key2=val2] DSL format.\r\n    function serializeOptions(opts, skipKeys) {\r\n      if (!opts) return '';\r\n      const entries = Object.entries(opts);\r\n      const filtered = entries.filter(([k, v]) =>\r\n        v !== false && !(skipKeys?.has(k))\r\n      );\r\n      if (filtered.length === 0) return '';\r\n      const parts = filtered.map(([k, v]) => v === true ? k : `${k}=${v}`);\r\n      return `[${parts.join(';')}]`;\r\n    }\r\n\r\n    // Serialize a part with ; delimiter and :x,y positions.\r\n    // Recursively decomposes custom shapes and glyphs unless preserve is set.\r\n    function serializeParts(parts, offsetX = 0, offsetY = 0) {\r\n      return parts.map(part => {\r\n        const x = (part.x ?? 0) + offsetX;\r\n        const y = (part.y ?? 0) + offsetY;\r\n        if (!options.preserve && part.codeName && !builtInCodes.has(part.codeName)) {\r\n          // Custom code with nested parts (e.g., positioned custom glyph)\r\n          if (part.parts) {\r\n            return serializeParts(part.parts, x, y);\r\n          }\r\n          // Custom composite shape (has codeString, no getPath)\r\n          const def = blissElementDefinitions[part.codeName];\r\n          if (def?.isShape && def.codeString && !def.getPath) {\r\n            return BlissSVGBuilder.#decomposeCodeString(def.codeString, x, y);\r\n          }\r\n        }\r\n        // Surface text-fallback routing key 'XTXT_<chars>' as 'X<chars>'.\r\n        let str = part.codeName?.startsWith('XTXT_')\r\n          ? 'X' + part.codeName.slice(5)\r\n          : part.codeName;\r\n        if (x !== 0 || y !== 0) {\r\n          str += `:${x},${y}`;\r\n        }\r\n        // Prefix part-level options with [opts]> syntax\r\n        const optPrefix = serializeOptions(part.options);\r\n        if (optPrefix) str = `${optPrefix}>${str}`;\r\n        return str;\r\n      }).join(';');\r\n    }\r\n\r\n    // Serialize a glyph: B-codes emit their code, compositions emit parts.\r\n    // Custom glyphs are decomposed to their codeString unless preserve is set.\r\n    // Returns an array (kerning codes are emitted as separate entries).\r\n    function serializeGlyph(glyph) {\r\n      const result = [];\r\n\r\n      // Emit kerning as separate RK/AK codes before the glyph\r\n      if (glyph.options?.relativeKerning !== undefined) {\r\n        result.push(`RK:${glyph.options.relativeKerning}`);\r\n      }\r\n      if (glyph.options?.absoluteKerning !== undefined) {\r\n        result.push(`AK:${glyph.options.absoluteKerning}`);\r\n      }\r\n\r\n      // Build the glyph code string\r\n      let code;\r\n      if (glyph.isBlissGlyph && glyph.codeName) {\r\n        // Decompose custom glyphs (non-built-in) to portable output\r\n        // Use the glyph's parts (which have correct positions) rather than\r\n        // re-decomposing from the definition (which would lose position offsets)\r\n        if (!options.preserve && !builtInCodes.has(glyph.codeName)) {\r\n          if (glyph.parts) {\r\n            code = serializeParts(glyph.parts);\r\n          } else {\r\n            const def = blissElementDefinitions[glyph.codeName];\r\n            if (def?.codeString) {\r\n              code = BlissSVGBuilder.#decomposeCodeString(def.codeString, 0, 0);\r\n            }\r\n          }\r\n        }\r\n        if (!code) code = glyph.codeName;\r\n      } else if (glyph.parts) {\r\n        code = serializeParts(glyph.parts);\r\n      } else {\r\n        code = glyph.codeName || '';\r\n      }\r\n\r\n      // Prefix glyph-level options (skip internal kerning keys)\r\n      const optPrefix = serializeOptions(glyph.options, GLYPH_INTERNAL_KEYS);\r\n      result.push(optPrefix + code);\r\n      return result;\r\n    }\r\n\r\n    // Check if a group is a space (TSP, QSP, etc.)\r\n    const SPACE_CODES = new Set(['TSP', 'QSP', 'ZSA']);\r\n    function isSpaceGroup(group) {\r\n      if (!group.glyphs || group.glyphs.length === 0) return false;\r\n      return group.glyphs.every(g =>\r\n        g.parts?.length === 1 && SPACE_CODES.has(g.parts[0].codeName)\r\n      );\r\n    }\r\n\r\n    const segments = [];\r\n    for (const group of obj.groups || []) {\r\n      if (!group.glyphs) continue;\r\n      if (isSpaceGroup(group)) {\r\n        const hasNonDefaultSpace = group.glyphs.some(g =>\r\n          g.parts?.some(p => p._differsFromDefault)\r\n        );\r\n        if (hasNonDefaultSpace) {\r\n          // Explicit space codes that differ from default — keep them\r\n          const codes = group.glyphs.map(g => g.parts[0].codeName);\r\n          segments.push(codes.join('/'));\r\n        } else {\r\n          // Default spaces — use // shorthand, N spaces = N+1 slashes\r\n          const slashes = '/'.repeat(group.glyphs.length + 1);\r\n          segments.push(slashes);\r\n        }\r\n        continue;\r\n      }\r\n      const glyphStrs = group.glyphs.flatMap(serializeGlyph).filter(Boolean);\r\n      let groupStr = glyphStrs.join('/');\r\n      // Prefix group-level options with [opts]| syntax\r\n      const groupOptPrefix = serializeOptions(group.options);\r\n      if (groupOptPrefix) groupStr = `${groupOptPrefix}|${groupStr}`;\r\n      segments.push(groupStr);\r\n    }\r\n    // Join: slash-only segments already include separators, others need /\r\n    let result = segments.reduce((acc, seg) => {\r\n      if (acc === '') return seg;\r\n      if (seg.startsWith('/')) return acc + seg;\r\n      if (acc.endsWith('/')) return acc + seg;\r\n      return acc + '/' + seg;\r\n    }, '');\r\n\r\n    // Prefix global options with [opts]|| syntax\r\n    const globalOptPrefix = serializeOptions(obj.options);\r\n    if (globalOptPrefix) result = `${globalOptPrefix}||${result}`;\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Returns the normalized parsed structure. Typeless aliases (word-level\r\n   * codes) are always expanded. Custom glyphs are decomposed by default:\r\n   * simple aliases resolve to their built-in code, complex compositions\r\n   * drop the custom code (parts are already expanded).\r\n   * Pass { preserve: true } to keep all custom names.\r\n   *\r\n   * @param {Object} [options]\r\n   * @param {boolean} [options.preserve=false] - Keep custom glyph/shape code names\r\n   * @returns {Object} Plain object with groups/glyphs/options structure\r\n   */\r\n  toJSON(options = {}) {\r\n    const obj = structuredClone(this.#rawBlissObj);\r\n\r\n    // Strip keys from all levels (keys are runtime identity, not composition data)\r\n    delete obj.key;\r\n    if (obj.options) delete obj.options.key;\r\n\r\n    if (obj.groups) {\r\n      // Strip keys from parts. Unless deep: true, also strip nested sub-parts\r\n      // (internal expansion detail). The constructor re-expands from codeName\r\n      // via BlissParser.expandParts().\r\n      const stripParts = (parts) => {\r\n        for (const part of parts) {\r\n          delete part.key;\r\n          if (part.options) delete part.options.key;\r\n          // Surface text-fallback routing key 'XTXT_<chars>' as 'X<chars>'.\r\n          if (part.codeName?.startsWith('XTXT_')) {\r\n            part.codeName = 'X' + part.codeName.slice(5);\r\n          }\r\n          if (options.deep && part.parts) {\r\n            stripParts(part.parts);\r\n          } else {\r\n            delete part.parts;\r\n          }\r\n        }\r\n      };\r\n\r\n      for (const group of obj.groups) {\r\n        delete group.key;\r\n        if (group.options) delete group.options.key;\r\n        if (group.glyphs) {\r\n          for (const glyph of group.glyphs) {\r\n            delete glyph.key;\r\n            if (glyph.options) delete glyph.options.key;\r\n            if (glyph.parts) stripParts(glyph.parts);\r\n\r\n            // Normalize glyphCode → codeName for public API\r\n            if (glyph.glyphCode) {\r\n              // Surface text-fallback routing key 'XTXT_<chars>' as 'X<chars>'.\r\n              const publicCode = glyph.glyphCode.startsWith('XTXT_')\r\n                ? 'X' + glyph.glyphCode.slice(5)\r\n                : glyph.glyphCode;\r\n              // Decompose custom glyphs to portable codes by default\r\n              if (!options.preserve && !builtInCodes.has(glyph.glyphCode)) {\r\n                const def = blissElementDefinitions[glyph.glyphCode];\r\n                if (def?.codeString) {\r\n                  // Resolve to the underlying built-in code (null for complex compositions)\r\n                  const resolved = BlissSVGBuilder.#resolveToBuiltInCode(glyph.glyphCode);\r\n                  if (resolved) glyph.codeName = resolved;\r\n                } else {\r\n                  glyph.codeName = publicCode;\r\n                }\r\n              } else {\r\n                glyph.codeName = publicCode;\r\n              }\r\n              delete glyph.glyphCode;\r\n            }\r\n            // Parts already use codeName internally, no rename needed\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return obj;\r\n  }\r\n\r\n\r\n\r\n  /**\r\n   * Returns the SVG content (path elements and groups) as a string.\r\n   * This is useful when you need only the primary graphical content of the SVG for manipulation or for use in complex SVG compositions.\r\n   *\r\n   * @returns {string} SVG content string\r\n   */\r\n  get svgContent() {\r\n    const content = this.composition.getSvgContent();\r\n\r\n    // If content already contains complete SVG tags (like <g> from hierarchical options), return as-is\r\n    if (content.startsWith('<')) {\r\n      return content;\r\n    }\r\n\r\n    // Otherwise, wrap raw path data in a <path> element\r\n    return `<path d=\"${content}\"/>`;\r\n  }\r\n\r\n  /**\r\n   * Returns the SVG as a DOM Element.\r\n   * This property is useful when you need to directly manipulate the SVG using the native DOM API.\r\n   * \r\n   * @returns {SVGSVGElement} SVG DOM element\r\n   */\r\n  get svgElement() {\r\n    const parser = new DOMParser();\r\n    const doc = parser.parseFromString(this.#svgCode, 'image/svg+xml');\r\n    return doc.documentElement;\r\n  }\r\n  \r\n  /**\r\n   * Returns the SVG code as a string, without the XML declaration.\r\n   * This is suitable for embedding the SVG within HTML documents or using it with virtual DOM libraries like React and Preact.\r\n   * \r\n   * @returns {string} SVG string without XML declaration\r\n   */\r\n  get svgCode() {\r\n    return this.#svgCode;\r\n  }\r\n\r\n  /**\r\n   * Returns the SVG code as a string, including the XML declaration.\r\n   * This is suitable for creating standalone SVG files.\r\n   * \r\n   * @returns {string} SVG string with XML declaration\r\n   */\r\n  get standaloneSvg() {\r\n    return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n${this.#svgCode}`;\r\n  }\r\n\r\n\r\n  // Validates a definition code string\r\n  static #validateCode(code) {\r\n    if (typeof code !== 'string' || code.length === 0) {\r\n      throw new Error('Definition code must be a non-empty string.');\r\n    }\r\n  }\r\n\r\n  // ── Define validation helpers ───────────────────────────────────\r\n\r\n  // Extract referenced codes from a codeString (strips positions, options, etc.)\r\n  static #extractReferencedCodes(codeString) {\r\n    if (!codeString) return [];\r\n    return codeString\r\n      .split(/[;/]+/)\r\n      .map(part => part.replace(/\\[.*?\\]>?/g, '').split(':')[0].replace(/\\^$/, ''))\r\n      .filter(code => code.length > 0);\r\n  }\r\n\r\n  // Recursively decompose a codeString to built-in codes, adjusting coordinates.\r\n  // Used by toString() for portable output of custom shapes and glyphs.\r\n  static #decomposeCodeString(codeString, offsetX, offsetY) {\r\n    const parts = codeString.split(';');\r\n    return parts.map(part => {\r\n      const posMatch = part.match(/^([^:]+)(?::(-?[\\d.]+),(-?[\\d.]+))?$/);\r\n      if (!posMatch) return part;\r\n\r\n      const [, code, xStr, yStr] = posMatch;\r\n      const x = (parseFloat(xStr) || 0) + offsetX;\r\n      const y = (parseFloat(yStr) || 0) + offsetY;\r\n\r\n      // Recursively decompose custom composite shapes\r\n      if (!builtInCodes.has(code)) {\r\n        const def = blissElementDefinitions[code];\r\n        if (def?.isShape && def.codeString && !def.getPath) {\r\n          return BlissSVGBuilder.#decomposeCodeString(def.codeString, x, y);\r\n        }\r\n        if (def?.isBlissGlyph && def.codeString) {\r\n          return BlissSVGBuilder.#decomposeCodeString(def.codeString, x, y);\r\n        }\r\n      }\r\n\r\n      if (x === 0 && y === 0) return code;\r\n      return `${code}:${x},${y}`;\r\n    }).join(';');\r\n  }\r\n\r\n  // Resolve a custom glyph code to its underlying built-in code (for toJSON).\r\n  // Follows the chain until a built-in code is found.\r\n  static #resolveToBuiltInCode(code, visited = new Set()) {\r\n    if (visited.has(code)) return code;\r\n    visited.add(code);\r\n    const def = blissElementDefinitions[code];\r\n    if (!def?.codeString) return code;\r\n    // If codeString is a single code reference (no ; or / or :), resolve further\r\n    if (!def.codeString.includes(';') && !def.codeString.includes('/') && !def.codeString.includes(':')) {\r\n      if (builtInCodes.has(def.codeString)) return def.codeString;\r\n      return BlissSVGBuilder.#resolveToBuiltInCode(def.codeString, visited);\r\n    }\r\n    return null; // Complex codeString — parts already expanded, no single code\r\n  }\r\n\r\n  // Determine the type of a definition entry.\r\n  // Single source of truth used by getDefinition, listDefinitions,\r\n  // patchDefinition, and #validateReferences.\r\n  static #detectType(def) {\r\n    if (def.isShape) return 'shape';\r\n    if (def.isExternalGlyph) return 'externalGlyph';\r\n    if (def.isBlissGlyph || def.glyphCode) return 'glyph';\r\n    if (def.codeString !== undefined) return 'bare';\r\n    return 'space';\r\n  }\r\n\r\n  // Check if a codeString references only allowed types\r\n  static #validateReferences(code, codeString, allowedTypes) {\r\n    const refs = BlissSVGBuilder.#extractReferencedCodes(codeString);\r\n    for (const ref of refs) {\r\n      if (ref === code) {\r\n        return `\"${code}\": circular reference (references itself)`;\r\n      }\r\n      const def = blissElementDefinitions[ref];\r\n      if (!def) continue; // Unknown codes will fail at parse time\r\n      const type = BlissSVGBuilder.#detectType(def);\r\n      if (!allowedTypes.includes(type)) {\r\n        return `\"${code}\": cannot reference ${type} \"${ref}\". Allowed types: ${allowedTypes.join(', ')}`;\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // Detect circular references via depth-first traversal\r\n  static #hasCircularReference(code, codeString) {\r\n    const visited = new Set();\r\n    const walk = (refs) => {\r\n      for (const ref of refs) {\r\n        if (ref === code) return true;\r\n        if (visited.has(ref)) continue;\r\n        visited.add(ref);\r\n        const def = blissElementDefinitions[ref];\r\n        if (def?.codeString) {\r\n          const subRefs = BlissSVGBuilder.#extractReferencedCodes(def.codeString);\r\n          if (walk(subRefs)) return true;\r\n        }\r\n      }\r\n      return false;\r\n    };\r\n    return walk(BlissSVGBuilder.#extractReferencedCodes(codeString));\r\n  }\r\n\r\n  // ── Private define helpers ──────────────────────────────────────\r\n\r\n  static #defineShape(code, definition, options = {}) {\r\n    BlissSVGBuilder.#validateCode(code);\r\n\r\n    const hasGetPath = typeof definition?.getPath === 'function';\r\n    const hasCodeString = typeof definition?.codeString === 'string' && definition.codeString.length > 0;\r\n\r\n    if (!hasGetPath && !hasCodeString) {\r\n      throw new Error(`define(\"${code}\"): shape requires either \"getPath\" (function) or \"codeString\" (non-empty string).`);\r\n    }\r\n\r\n    if (hasGetPath) {\r\n      if (typeof definition.width !== 'number' || !isFinite(definition.width)) {\r\n        throw new Error(`define(\"${code}\"): \"width\" must be a finite number.`);\r\n      }\r\n      if (typeof definition.height !== 'number' || !isFinite(definition.height)) {\r\n        throw new Error(`define(\"${code}\"): \"height\" must be a finite number.`);\r\n      }\r\n    }\r\n\r\n    // Shapes can only reference other shapes\r\n    if (hasCodeString) {\r\n      const refError = BlissSVGBuilder.#validateReferences(code, definition.codeString, ['shape']);\r\n      if (refError) throw new Error(`define(${refError})`);\r\n      if (BlissSVGBuilder.#hasCircularReference(code, definition.codeString)) {\r\n        throw new Error(`define(\"${code}\"): circular reference detected`);\r\n      }\r\n    }\r\n\r\n    if (blissElementDefinitions[code] && !options.overwrite) {\r\n      throw new Error(`define(\"${code}\"): code already exists. Use { overwrite: true } to replace.`);\r\n    }\r\n\r\n    const entry = { isShape: true };\r\n\r\n    if (hasGetPath) {\r\n      entry.getPath = definition.getPath;\r\n      entry.width = definition.width;\r\n      entry.height = definition.height;\r\n      if (definition.x !== undefined) entry.x = definition.x;\r\n      if (definition.y !== undefined) entry.y = definition.y;\r\n      if (definition.extraPathOptions) entry.extraPathOptions = definition.extraPathOptions;\r\n    } else {\r\n      entry.codeString = definition.codeString;\r\n    }\r\n\r\n    if (definition.defaultOptions && typeof definition.defaultOptions === 'object'\r\n        && Object.keys(definition.defaultOptions).length > 0) {\r\n      entry.defaultOptions = { ...definition.defaultOptions };\r\n    }\r\n\r\n    blissElementDefinitions[code] = entry;\r\n  }\r\n\r\n  static #defineGlyph(code, definition, options = {}) {\r\n    BlissSVGBuilder.#validateCode(code);\r\n\r\n    if (typeof definition?.codeString !== 'string' || definition.codeString.length === 0) {\r\n      throw new Error(`define(\"${code}\"): \"codeString\" must be a non-empty string.`);\r\n    }\r\n\r\n    // Glyphs can reference other glyphs and shapes, but not external glyphs or bare aliases\r\n    const refError = BlissSVGBuilder.#validateReferences(code, definition.codeString, ['glyph', 'shape']);\r\n    if (refError) throw new Error(`define(${refError})`);\r\n    if (BlissSVGBuilder.#hasCircularReference(code, definition.codeString)) {\r\n      throw new Error(`define(\"${code}\"): circular reference detected`);\r\n    }\r\n\r\n    if (blissElementDefinitions[code] && !options.overwrite) {\r\n      throw new Error(`define(\"${code}\"): code already exists. Use { overwrite: true } to replace.`);\r\n    }\r\n\r\n    const entry = {\r\n      codeString: definition.codeString,\r\n      glyphCode: code,\r\n      isBlissGlyph: true\r\n    };\r\n    if (definition.isIndicator === true) entry.isIndicator = true;\r\n    if (typeof definition.anchorOffsetX === 'number' && isFinite(definition.anchorOffsetX)) {\r\n      entry.anchorOffsetX = definition.anchorOffsetX;\r\n    }\r\n    if (typeof definition.anchorOffsetY === 'number' && isFinite(definition.anchorOffsetY)) {\r\n      entry.anchorOffsetY = definition.anchorOffsetY;\r\n    }\r\n    if (typeof definition.width === 'number' && isFinite(definition.width)) {\r\n      entry.width = definition.width;\r\n    }\r\n    if (definition.kerningRules && typeof definition.kerningRules === 'object') {\r\n      entry.kerningRules = { ...definition.kerningRules };\r\n    }\r\n    if (definition.shrinksPrecedingWordSpace === true) {\r\n      entry.shrinksPrecedingWordSpace = true;\r\n    }\r\n    if (definition.defaultOptions && typeof definition.defaultOptions === 'object'\r\n        && Object.keys(definition.defaultOptions).length > 0) {\r\n      entry.defaultOptions = { ...definition.defaultOptions };\r\n    }\r\n\r\n    blissElementDefinitions[code] = entry;\r\n  }\r\n\r\n  static #defineExternalGlyph(code, definition, options = {}) {\r\n    BlissSVGBuilder.#validateCode(code);\r\n\r\n    if (typeof definition?.getPath !== 'function') {\r\n      throw new Error(`define(\"${code}\"): \"getPath\" must be a function.`);\r\n    }\r\n    if (typeof definition.width !== 'number' || !isFinite(definition.width)) {\r\n      throw new Error(`define(\"${code}\"): \"width\" must be a finite number.`);\r\n    }\r\n    if (typeof definition.char !== 'string' || definition.char.length === 0) {\r\n      throw new Error(`define(\"${code}\"): \"char\" must be a non-empty string.`);\r\n    }\r\n\r\n    if (blissElementDefinitions[code] && !options.overwrite) {\r\n      throw new Error(`define(\"${code}\"): code already exists. Use { overwrite: true } to replace.`);\r\n    }\r\n\r\n    const entry = {\r\n      getPath: definition.getPath,\r\n      width: definition.width,\r\n      char: definition.char,\r\n      isExternalGlyph: true\r\n    };\r\n    if (typeof definition.y === 'number') entry.y = definition.y;\r\n    if (typeof definition.height === 'number') entry.height = definition.height;\r\n    if (definition.kerningRules && typeof definition.kerningRules === 'object') {\r\n      entry.kerningRules = { ...definition.kerningRules };\r\n    }\r\n    if (definition.defaultOptions && typeof definition.defaultOptions === 'object'\r\n        && Object.keys(definition.defaultOptions).length > 0) {\r\n      entry.defaultOptions = { ...definition.defaultOptions };\r\n    }\r\n\r\n    blissElementDefinitions[code] = entry;\r\n  }\r\n\r\n  // Resolve chained bare aliases in a codeString.\r\n  // Replaces bare alias tokens with their resolved codeString, repeating\r\n  // until no more aliases remain (up to depth 50).\r\n  static #resolveBareAliases(codeString) {\r\n    let resolved = codeString;\r\n    for (let depth = 0; depth < 50; depth++) {\r\n      let changed = false;\r\n      resolved = resolved.replace(\r\n        /(?<=^|[/;])([A-Za-z_][\\w]*)(?=$|[/;:^])/g,\r\n        (match, token) => {\r\n          const def = blissElementDefinitions[token];\r\n          if (def && def.codeString && !def.isBlissGlyph && !def.isShape && !def.isExternalGlyph && !def.glyphCode) {\r\n            changed = true;\r\n            return def.codeString;\r\n          }\r\n          return match;\r\n        }\r\n      );\r\n      if (!changed) break;\r\n    }\r\n    return resolved;\r\n  }\r\n\r\n  static #defineBare(code, definition, options = {}) {\r\n    BlissSVGBuilder.#validateCode(code);\r\n\r\n    if (typeof definition?.codeString !== 'string' || definition.codeString.length === 0) {\r\n      throw new Error(`define(\"${code}\"): \"codeString\" must be a non-empty string.`);\r\n    }\r\n\r\n    if (blissElementDefinitions[code] && !options.overwrite) {\r\n      throw new Error(`define(\"${code}\"): code already exists. Use { overwrite: true } to replace.`);\r\n    }\r\n\r\n    const resolved = BlissSVGBuilder.#resolveBareAliases(definition.codeString);\r\n\r\n    // Word definitions (containing /) must not have internal position modifiers.\r\n    // Position should be applied at the usage site, e.g. WORD:2,0\r\n    if (resolved.includes('/')) {\r\n      const segments = resolved.split(/[/;]/).filter(Boolean);\r\n      const hasCoords = segments.some(seg => /:-?[\\d.]/.test(seg));\r\n      if (hasCoords) {\r\n        throw new Error(`define(\"${code}\"): word definitions (containing /) cannot have internal coordinates. Move coordinates to the usage site.`);\r\n      }\r\n    }\r\n\r\n    const entry = { codeString: resolved };\r\n\r\n    if (definition.defaultOptions && typeof definition.defaultOptions === 'object'\r\n        && Object.keys(definition.defaultOptions).length > 0) {\r\n      entry.defaultOptions = { ...definition.defaultOptions };\r\n    }\r\n\r\n    blissElementDefinitions[code] = entry;\r\n  }\r\n\r\n  /**\r\n   * Define one or more codes. The single public entry point for all definitions.\r\n   *\r\n   * Use the optional `type` field to specify the definition type:\r\n   * - `type: 'glyph'` — Bliss character (sets isBlissGlyph, glyphCode)\r\n   * - `type: 'shape'` — shape (primitive with getPath, or composite with codeString)\r\n   * - `type: 'externalGlyph'` — external glyph (getPath + glyph)\r\n   * - No type — bare definition (word, alias, or any codeString-based code)\r\n   *\r\n   * When no `type` is specified, auto-detection applies for getPath-based definitions:\r\n   * - Has getPath + glyph → externalGlyph\r\n   * - Has getPath (no glyph) → shape\r\n   * - Has codeString (no type) → bare definition\r\n   *\r\n   * @param {Object.<string, Object>} definitions - Map of code → definition\r\n   * @param {Object} [options]\r\n   * @param {boolean} [options.overwrite=false]\r\n   * @returns {{ defined: string[], skipped: string[], errors: string[] }}\r\n   */\r\n  static define(definitions, options = {}) {\r\n    const result = { defined: [], skipped: [], errors: [] };\r\n\r\n    if (!definitions || typeof definitions !== 'object') {\r\n      return result;\r\n    }\r\n\r\n    for (const [code, definition] of Object.entries(definitions)) {\r\n      try {\r\n        const type = definition?.type;\r\n\r\n        if (type && type !== 'glyph' && type !== 'shape' && type !== 'externalGlyph') {\r\n          result.errors.push(`\"${code}\": unknown type \"${type}\". Use 'glyph', 'shape', or 'externalGlyph'.`);\r\n          continue;\r\n        }\r\n\r\n        if (type === 'glyph') {\r\n          BlissSVGBuilder.#defineGlyph(code, definition, options);\r\n        } else if (type === 'shape') {\r\n          BlissSVGBuilder.#defineShape(code, definition, options);\r\n        } else if (type === 'externalGlyph') {\r\n          BlissSVGBuilder.#defineExternalGlyph(code, definition, options);\r\n        } else if (typeof definition?.getPath === 'function' && typeof definition?.char === 'string') {\r\n          BlissSVGBuilder.#defineExternalGlyph(code, definition, options);\r\n        } else if (typeof definition?.getPath === 'function') {\r\n          BlissSVGBuilder.#defineShape(code, definition, options);\r\n        } else if (typeof definition?.codeString === 'string') {\r\n          BlissSVGBuilder.#defineBare(code, definition, options);\r\n        } else {\r\n          result.errors.push(`\"${code}\": unable to detect definition type. Provide codeString, type+getPath+width+height (shape), or type+getPath+char (externalGlyph).`);\r\n          continue;\r\n        }\r\n        result.defined.push(code);\r\n      } catch (err) {\r\n        if (err.message.includes('already exists')) {\r\n          result.skipped.push(code);\r\n        } else {\r\n          result.errors.push(`\"${code}\": ${err.message}`);\r\n        }\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Check if a code is defined.\r\n   * @param {string} code\r\n   * @returns {boolean}\r\n   */\r\n  static isDefined(code) {\r\n    return code in blissElementDefinitions;\r\n  }\r\n\r\n  /**\r\n   * Get definition metadata for a code (frozen copy, not the live object).\r\n   *\r\n   * @param {string} code\r\n   * @returns {Object|null} Frozen metadata object, or null if not found\r\n   */\r\n  static getDefinition(code) {\r\n    const def = blissElementDefinitions[code];\r\n    if (!def) return null;\r\n\r\n    const copy = {};\r\n    for (const [key, value] of Object.entries(def)) {\r\n      if (typeof value === 'object' && value !== null) {\r\n        copy[key] = Object.freeze({ ...value });\r\n      } else {\r\n        copy[key] = value;\r\n      }\r\n    }\r\n\r\n    copy.type = BlissSVGBuilder.#detectType(def);\r\n\r\n    copy.isBuiltIn = builtInCodes.has(code);\r\n\r\n    return Object.freeze(copy);\r\n  }\r\n\r\n  /**\r\n   * List all defined codes, optionally filtered by type.\r\n   *\r\n   * @param {Object} [filter]\r\n   * @param {'shape'|'glyph'|'externalGlyph'|'bare'|'space'} [filter.type]\r\n   * @returns {string[]}\r\n   */\r\n  static listDefinitions(filter = {}) {\r\n    const codes = Object.keys(blissElementDefinitions);\r\n\r\n    if (!filter.type) return codes;\r\n\r\n    return codes.filter(code => {\r\n      return BlissSVGBuilder.#detectType(blissElementDefinitions[code]) === filter.type;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Remove a custom definition. Built-in definitions cannot be removed.\r\n   *\r\n   * @param {string} code\r\n   * @returns {boolean} true if removed\r\n   * @throws {Error} If attempting to remove a built-in definition\r\n   */\r\n  static removeDefinition(code) {\r\n    if (builtInCodes.has(code)) {\r\n      throw new Error(`removeDefinition(\"${code}\"): cannot remove built-in definitions.`);\r\n    }\r\n    if (!(code in blissElementDefinitions)) {\r\n      return false;\r\n    }\r\n    delete blissElementDefinitions[code];\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Patch one or more properties on an existing custom definition.\r\n   * Only allowed keys for the definition's type are accepted.\r\n   * Built-in definitions cannot be patched.\r\n   *\r\n   * @param {string} code - The code to patch\r\n   * @param {Object} changes - Properties to update\r\n   * @returns {{ patched: true }}\r\n   * @throws {Error} If code is not defined, is built-in, or changes are invalid\r\n   */\r\n  static patchDefinition(code, changes) {\r\n    if (!(code in blissElementDefinitions)) {\r\n      throw new Error(`patchDefinition(\"${code}\"): code is not defined.`);\r\n    }\r\n    if (builtInCodes.has(code)) {\r\n      throw new Error(`patchDefinition(\"${code}\"): cannot patch built-in definitions.`);\r\n    }\r\n    if (!changes || typeof changes !== 'object') {\r\n      throw new Error(`patchDefinition(\"${code}\"): changes must be an object.`);\r\n    }\r\n\r\n    const def = blissElementDefinitions[code];\r\n\r\n    const type = BlissSVGBuilder.#detectType(def);\r\n\r\n    // Reject type changes and internal flags\r\n    const internalKeys = new Set(['type', 'isShape', 'isExternalGlyph', 'isBlissGlyph', 'glyphCode', 'isBuiltIn']);\r\n    for (const key of Object.keys(changes)) {\r\n      if (internalKeys.has(key)) {\r\n        throw new Error(`patchDefinition(\"${code}\"): cannot change \"${key}\" via patch.`);\r\n      }\r\n    }\r\n\r\n    // Allowed keys per type\r\n    const allowedByType = {\r\n      glyph: ['codeString', 'anchorOffsetX', 'anchorOffsetY', 'width', 'isIndicator', 'shrinksPrecedingWordSpace', 'kerningRules', 'defaultOptions'],\r\n      shape: ['getPath', 'codeString', 'width', 'height', 'x', 'y', 'extraPathOptions', 'defaultOptions'],\r\n      externalGlyph: ['getPath', 'width', 'char', 'y', 'height', 'kerningRules', 'defaultOptions'],\r\n      bare: ['codeString', 'defaultOptions'],\r\n      space: ['defaultOptions']\r\n    };\r\n\r\n    const allowed = new Set(allowedByType[type] || []);\r\n    for (const key of Object.keys(changes)) {\r\n      if (!allowed.has(key)) {\r\n        throw new Error(`patchDefinition(\"${code}\"): \"${key}\" is not a valid property for type \"${type}\".`);\r\n      }\r\n    }\r\n\r\n    // Validate getPath is a function if provided\r\n    if ('getPath' in changes && typeof changes.getPath !== 'function') {\r\n      throw new Error(`patchDefinition(\"${code}\"): \"getPath\" must be a function.`);\r\n    }\r\n\r\n    // If codeString is being patched, validate references and circular refs\r\n    if ('codeString' in changes) {\r\n      const newCodeString = changes.codeString;\r\n      if (typeof newCodeString !== 'string' || newCodeString.length === 0) {\r\n        throw new Error(`patchDefinition(\"${code}\"): \"codeString\" must be a non-empty string.`);\r\n      }\r\n      const allowedRefTypes = type === 'glyph' ? ['glyph', 'shape']\r\n        : type === 'shape' ? ['shape']\r\n        : ['glyph', 'shape', 'bare', 'externalGlyph'];\r\n      const refError = BlissSVGBuilder.#validateReferences(code, newCodeString, allowedRefTypes);\r\n      if (refError) throw new Error(`patchDefinition(${refError})`);\r\n      if (BlissSVGBuilder.#hasCircularReference(code, newCodeString)) {\r\n        throw new Error(`patchDefinition(\"${code}\"): circular reference detected`);\r\n      }\r\n    }\r\n\r\n    // For bare definitions, resolve chained aliases in codeString\r\n    if ('codeString' in changes && type === 'bare') {\r\n      changes = { ...changes, codeString: BlissSVGBuilder.#resolveBareAliases(changes.codeString) };\r\n    }\r\n\r\n    // Apply changes\r\n    for (const [key, value] of Object.entries(changes)) {\r\n      if (key === 'defaultOptions') {\r\n        if (value && typeof value === 'object' && Object.keys(value).length > 0) {\r\n          def.defaultOptions = { ...value };\r\n        } else {\r\n          delete def.defaultOptions;\r\n        }\r\n      } else if (key === 'kerningRules') {\r\n        if (value && typeof value === 'object') {\r\n          def.kerningRules = { ...value };\r\n        } else {\r\n          delete def.kerningRules;\r\n        }\r\n      } else {\r\n        def[key] = value;\r\n      }\r\n    }\r\n\r\n    return { patched: true };\r\n  }\r\n\r\n  get #svgCode() {\r\n    // Computed rendering dimensions\r\n    const width = Math.max(this.composition.width, this.#processedOptions.minWidth ?? 0);\r\n    const height = 20;\r\n\r\n    // User-provided options with defaults\r\n    const color = this.#processedOptions.color ?? \"#000000\";\r\n    const strokeWidth = this.#processedOptions.strokeWidth ?? 0.5;\r\n    const marginTop = this.#processedOptions.marginTop ?? 0.75;\r\n    const marginBottom = this.#processedOptions.marginBottom ?? 0.75;\r\n    const marginLeft = this.#processedOptions.marginLeft ?? 0.75;\r\n    const marginRight = this.#processedOptions.marginRight ?? 0.75;\r\n\r\n    // Compute crop values - can be numeric or 'auto' (computed from effectiveBounds)\r\n    const bounds = this.composition.effectiveBounds;\r\n    const rawCropLeft = this.#processedOptions.cropLeft ?? 0;\r\n    const rawCropRight = this.#processedOptions.cropRight ?? 0;\r\n\r\n    // Compact mode: crop up to 4 units total, preferring top then bottom,\r\n    // limited by actual empty space (never crop into ink).\r\n    // Explicit crop-top/crop-bottom override (not add to) the compact defaults.\r\n    let rawCropTop, rawCropBottom;\r\n    if (this.#processedOptions.cropCompact) {\r\n      const topRoom = bounds.minY;\r\n      const bottomRoom = height - bounds.maxY;\r\n      const compactTop = Math.min(4, topRoom);\r\n      const compactBottom = Math.min(4 - compactTop, bottomRoom);\r\n      rawCropTop = this.#processedOptions.cropTop ?? compactTop;\r\n      rawCropBottom = this.#processedOptions.cropBottom ?? compactBottom;\r\n    } else if (this.#processedOptions.autoVertical) {\r\n      rawCropTop = this.#processedOptions.cropTop ?? 'auto';\r\n      rawCropBottom = this.#processedOptions.cropBottom ?? 'auto';\r\n    } else {\r\n      rawCropTop = this.#processedOptions.cropTop ?? 0;\r\n      rawCropBottom = this.#processedOptions.cropBottom ?? 0;\r\n    }\r\n\r\n    const cropTop = rawCropTop === 'auto' ? bounds.minY : rawCropTop;\r\n    const cropBottom = rawCropBottom === 'auto' ? (height - bounds.maxY) : rawCropBottom;\r\n    let cropLeft = rawCropLeft === 'auto' ? bounds.minX : rawCropLeft;\r\n    let cropRight = rawCropRight === 'auto' ? (width - bounds.maxX) : rawCropRight;\r\n\r\n    // Ensure min-width is respected after auto horizontal cropping.\r\n    // Numeric crops are deliberate, so only limit auto-computed crops.\r\n    const minW = this.#processedOptions.minWidth ?? 0;\r\n    if (minW > 0 && (rawCropLeft === 'auto' || rawCropRight === 'auto')) {\r\n      const croppedWidth = width - cropLeft - cropRight;\r\n      if (croppedWidth < minW) {\r\n        const deficit = minW - croppedWidth;\r\n        const autoLeft = rawCropLeft === 'auto' ? cropLeft : 0;\r\n        const autoRight = rawCropRight === 'auto' ? cropRight : 0;\r\n        const autoTotal = autoLeft + autoRight;\r\n        if (autoTotal > 0) {\r\n          const reduce = Math.min(deficit, autoTotal);\r\n          if (rawCropLeft === 'auto') cropLeft -= reduce * (autoLeft / autoTotal);\r\n          if (rawCropRight === 'auto') cropRight -= reduce * (autoRight / autoTotal);\r\n        }\r\n      }\r\n    }\r\n\r\n    let viewBoxX = -marginLeft + cropLeft;\r\n    const viewBoxY = -marginTop + cropTop;\r\n    let gridOffsetX = 0;\r\n\r\n    if (this.#processedOptions.center === true && width > this.composition.width) {\r\n      const leftOverhang = -this.composition.x;\r\n      const rightOverhang = (this.composition.x + this.composition.width) - this.composition.baseWidth;\r\n      const maxOverhang = Math.max(leftOverhang, rightOverhang);\r\n      const symmetricWidth = this.composition.baseWidth + 2 * maxOverhang;\r\n      const extraSpace = width - symmetricWidth;\r\n      const offset = extraSpace / 2;\r\n      viewBoxX -= offset;\r\n      gridOffsetX = viewBoxX + marginLeft;\r\n    }\r\n    const content = this.svgContent;\r\n    const viewBoxWidth = width + marginLeft + marginRight - cropLeft - cropRight;\r\n    const viewBoxHeight = height + marginTop + marginBottom - cropTop - cropBottom;\r\n    const svgAttributeMultiplier = 6;\r\n\r\n    // Calculate SVG element dimensions (maintaining aspect ratio)\r\n    let svgWidth, svgHeight;\r\n    if (this.#processedOptions.svgHeight !== undefined) {\r\n      // Height specified: calculate width to maintain aspect ratio\r\n      svgHeight = this.#processedOptions.svgHeight;\r\n      svgWidth = (viewBoxWidth / viewBoxHeight) * svgHeight;\r\n    } else {\r\n      // Auto-calculate both dimensions\r\n      svgWidth = svgAttributeMultiplier * viewBoxWidth;\r\n      svgHeight = svgAttributeMultiplier * viewBoxHeight;\r\n    }\r\n\r\n    const round = (num) => parseFloat(num.toFixed(4));\r\n\r\n    const svgTitle = this.#processedOptions.svgTitle ?? \"\";\r\n    const svgDesc = this.#processedOptions.svgDesc ?? \"\";\r\n    const background = this.#processedOptions.background ?? \"\";\r\n    const backgroundTop = this.#processedOptions.backgroundTop;\r\n    const backgroundMid = this.#processedOptions.backgroundMid;\r\n    const backgroundBottom = this.#processedOptions.backgroundBottom;\r\n    const hasZones = backgroundTop || backgroundMid || backgroundBottom;\r\n\r\n    let title = svgTitle ? `  <title>${svgTitle}</title>` : \"\";\r\n    let desc = svgDesc ? `  <desc>${svgDesc}</desc>` : \"\";\r\n    let gridPath = \"\";\r\n    let svgText = \"\";\r\n\r\n    let backgroundContent;\r\n    if (hasZones) {\r\n      const bulkBg = background;\r\n      const topColor = backgroundTop || bulkBg;\r\n      const midColor = backgroundMid || bulkBg;\r\n      const bottomColor = backgroundBottom || bulkBg;\r\n      const zoneX = round(viewBoxX);\r\n      const zoneWidth = round(viewBoxWidth);\r\n      const topY = round(viewBoxY);\r\n      const topHeight = round(8 - viewBoxY);\r\n      const bottomHeight = round(viewBoxY + viewBoxHeight - 16);\r\n\r\n      const zoneRects = [\r\n        topColor ? `    <rect class=\"bliss-background--top\" x=\"${zoneX}\" y=\"${topY}\" width=\"${zoneWidth}\" height=\"${topHeight}\" stroke=\"none\" fill=\"${topColor}\"/>` : '',\r\n        midColor ? `    <rect class=\"bliss-background--mid\" x=\"${zoneX}\" y=\"8\" width=\"${zoneWidth}\" height=\"8\" stroke=\"none\" fill=\"${midColor}\"/>` : '',\r\n        bottomColor ? `    <rect class=\"bliss-background--bottom\" x=\"${zoneX}\" y=\"16\" width=\"${zoneWidth}\" height=\"${bottomHeight}\" stroke=\"none\" fill=\"${bottomColor}\"/>` : '',\r\n      ].filter(Boolean).join('\\n');\r\n\r\n      backgroundContent = `  <g class=\"bliss-background\">\\n${zoneRects}\\n  </g>`;\r\n    } else {\r\n      backgroundContent = background === \"\" ? \"\" : `  <rect class=\"bliss-background\" x=\"${viewBoxX}\" y=\"${viewBoxY}\" width=\"100%\" height=\"100%\" stroke=\"none\" fill=\"${background}\"/>`;\r\n    }\r\n\r\n    // Grid boundaries adjusted for cropping\r\n    const gridStartX = gridOffsetX + cropLeft;\r\n    const gridLineWidth = width - cropLeft - cropRight;\r\n    const gridMinY = cropTop;\r\n    const gridMaxY = height - cropBottom;\r\n\r\n    const hLine = (y) => `M${gridStartX},${y}h${gridLineWidth}`;\r\n    const hLines = (ys) => ys.filter(y => y >= gridMinY && y <= gridMaxY).map(hLine).join('');\r\n\r\n    let getVerticalLines = (type) => {\r\n      let pathData = \"\";\r\n      let xs = [];\r\n\r\n      switch(type) {\r\n        case \"minor\":\r\n          //odd numbers\r\n          for (let x = 1; x <= width; x += 2) xs.push(x);\r\n          break;\r\n        case \"medium\":\r\n          //even numbers not divisible with 4\r\n          for (let x = 2; x <= width; x += 4) xs.push(x);\r\n          break;\r\n        case \"major\":\r\n          //even numbers divisible with 4\r\n          for (let x = 0; x <= width; x += 4) xs.push(x);\r\n          break;\r\n      }\r\n      for (const x of xs.filter(x => x >= cropLeft && x <= width - cropRight)) {\r\n        pathData += `M${gridOffsetX + x},${gridMinY}V${gridMaxY}`;\r\n      }\r\n      return pathData;\r\n    }\r\n    if (this.#processedOptions.grid) {\r\n      const gridMinorStrokeWidth = this.#processedOptions.gridMinorStrokeWidth ?? 0.166;\r\n      const gridMinorColor = this.#processedOptions.gridMinorColor ?? \"#ebebeb\";\r\n      const gridMediumStrokeWidth = this.#processedOptions.gridMediumStrokeWidth ?? 0.166;\r\n      const gridMediumColor = this.#processedOptions.gridMediumColor ?? \"#ebebeb\";\r\n      const gridMajorStrokeWidth = this.#processedOptions.gridMajorStrokeWidth ?? 0.166;\r\n      const gridMajorColor = this.#processedOptions.gridMajorColor ?? \"#c7c7c7\";\r\n      const gridSkyStrokeWidth = this.#processedOptions.gridSkyStrokeWidth ?? 0.166;\r\n      const gridSkyColor = this.#processedOptions.gridSkyColor ?? \"#858585\";\r\n      const gridEarthStrokeWidth = this.#processedOptions.gridEarthStrokeWidth ?? 0.166;\r\n      const gridEarthColor = this.#processedOptions.gridEarthColor ?? \"#858585\";\r\n\r\n      const minorD = hLines([1,3,5,7,9,11,13,15,17,19]) + getVerticalLines(\"minor\");\r\n      const mediumD = hLines([2,6,10,14,18]) + getVerticalLines(\"medium\");\r\n      const majorD = hLines([0,4,12,20]) + getVerticalLines(\"major\");\r\n      const skyD = 8 >= gridMinY && 8 <= gridMaxY ? hLine(8) : '';\r\n      const earthD = 16 >= gridMinY && 16 <= gridMaxY ? hLine(16) : '';\r\n\r\n      const gridLines = [\r\n        minorD ? `    <path class=\"bliss-grid-line bliss-grid-line--minor\" stroke-width=\"${gridMinorStrokeWidth}\" stroke=\"${gridMinorColor}\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" d=\"${minorD}\"/>` : '',\r\n        mediumD ? `    <path class=\"bliss-grid-line bliss-grid-line--medium\" stroke-width=\"${gridMediumStrokeWidth}\" stroke=\"${gridMediumColor}\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" d=\"${mediumD}\"/>` : '',\r\n        majorD ? `    <path class=\"bliss-grid-line bliss-grid-line--major\" stroke-width=\"${gridMajorStrokeWidth}\" stroke=\"${gridMajorColor}\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" d=\"${majorD}\"/>` : '',\r\n        skyD ? `    <path class=\"bliss-grid-line bliss-grid-line--major bliss-grid-line--sky\" stroke-width=\"${gridSkyStrokeWidth}\" stroke=\"${gridSkyColor}\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" d=\"${skyD}\"/>` : '',\r\n        earthD ? `    <path class=\"bliss-grid-line bliss-grid-line--major bliss-grid-line--earth\" stroke-width=\"${gridEarthStrokeWidth}\" stroke=\"${gridEarthColor}\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" d=\"${earthD}\"/>` : '',\r\n      ].filter(Boolean).join('\\n');\r\n\r\n      gridPath = [\r\n        '  <style>',\r\n        '    @supports (-webkit-hyphens: none) {',\r\n        '      .bliss-grid-line { shape-rendering: geometricPrecision; }',\r\n        '    }',\r\n        '  </style>',\r\n        '  <g class=\"bliss-grid\" shape-rendering=\"crispEdges\">',\r\n        gridLines,\r\n        '  </g>',\r\n      ].join('\\n');\r\n    }\r\n\r\n    // Build content group attributes: defaults + all global SVG attributes\r\n    const contentDefaults = {\r\n      fill: 'none',\r\n      stroke: color,\r\n      'stroke-linejoin': 'round',\r\n      'stroke-linecap': 'round',\r\n      'stroke-width': strokeWidth,\r\n    };\r\n    const contentAttrs = { ...contentDefaults, ...this.globalSvgAttributes };\r\n    const contentAttrsStr = Object.entries(contentAttrs)\r\n      .map(([key, value]) => `${key}=\"${value}\"`)\r\n      .join(' ');\r\n\r\n    const generator = LIB_VERSION ? `bliss-svg-builder/${LIB_VERSION}` : 'bliss-svg-builder';\r\n\r\n    let svgStr = [\r\n      `<svg xmlns=\"http://www.w3.org/2000/svg\" data-generator=\"${generator}\" width=\"${round(svgWidth)}\" height=\"${round(svgHeight)}\" viewBox=\"${round(viewBoxX)} ${round(viewBoxY)} ${round(viewBoxWidth)} ${round(viewBoxHeight)}\">`,\r\n      title,\r\n      desc,\r\n      backgroundContent,\r\n      gridPath,\r\n      `  <g class=\"bliss-content\" ${contentAttrsStr}>`,\r\n      `    ${content}`,\r\n      '  </g>',\r\n      svgText,\r\n      '</svg>',\r\n    ].filter(Boolean).join('\\n');\r\n\r\n    // Clean up empty <path d=\"\"/> elements from DOT/COMMA/external glyphs\r\n    svgStr = svgStr.replace(/<path d=\"\"\\/>/g, '');\r\n\r\n    return svgStr;\r\n  }\r\n}\r\n\r\nexport { BlissSVGBuilder };\r\n","import { BlissSVGBuilder } from './lib/bliss-svg-builder.js';\nimport { LIB_VERSION } from './lib/bliss-constants.js';\n\n// Hoist LIB_VERSION onto the class so IIFE consumers, where\n// `window.BlissSVGBuilder` is the class itself, can read the\n// version as `BlissSVGBuilder.LIB_VERSION`.\nBlissSVGBuilder.LIB_VERSION = LIB_VERSION;\n\nexport { BlissSVGBuilder, LIB_VERSION };\nexport default BlissSVGBuilder;\n"],"mappings":"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,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAI,CAChC,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,IAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAG,CAC/B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,GAAA,CAC5B,EAAK,EAAuB,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FCzoBH,KACqC,EAAK,CACxC,GAAA,GAAS,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAC1C,IAAA,GAED,IAAM,GACJ,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,CAAS,EAAK,CACzC,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAC1C,IAAA,GAED,IAAM,GACJ,IAAI,OACF,OACA,IAEF,EAAI,IACF,CACA,WAAA,mBACD,0BAAA,GACD,IACE,CACA,WAAA,4BACD,0BAAA,GACD,IACE,CACA,WAAA,8BACD,0BAAA,GACD,IACE,CACA,WAAA,WACD,0BAAA,GACD,IACE,CACA,WAAA,aACD,0BAAA,GACD,IACE,CACA,WAAA,oBACD,0BAAA,GACD,CAGA,GAAI,CACF,WAAY,YACZ,0BAAc,GACf,CACD,GAAA,CAAK,WAAA,SAAA,IACH,CACA,WAAA,wCACD,aAAA,EACD,KACE,CACA,WAAA,8BACD,aAAA,EACD,KACE,CACA,WAAA,iCACD,aAAA,EACD,KACE,CACA,WAAA,wBACD,aAAA,EACD,KACE,CACA,WAAA,6BACD,aAAA,EACD,KACE,CACA,WAAA,gDACD,aAAA,EACD,KACE,CACA,WAAA,6BACD,aAAA,EACD,KACE,CACA,WAAA,uBACD,aAAA,EACD,KACE,CACA,WAAA,kBACD,aAAA,EACD,KACE,CACA,WAAA,6BACD,aAAA,EACD,KACE,CACA,WAAA,8CACD,aAAA,EACD,KACE,CACA,WAAA,iCACD,aAAA,EACD,KACE,CACA,WAAA,qCACD,aAAA,EACD,KACE,CACA,WAAA,wBACD,aAAA,EACD,KACE,CACA,WAAA,6BACD,aAAA,EACD,KACE,CACA,WAAA,oDACD,aAAA,EACD,KACE,CACA,WAAA,+BACD,aAAA,EACD,KACE,CACA,WAAA,0BACD,aAAA,EACD,KACE,CACA,WAAA,kBACD,aAAA,EACD,KACE,CACA,WAAA,iCACA,aAAA,EACA,KACD,CACD,WAAK,WACH,YAAY,GACZ,cAAa,SACb,KAAA,mBACA,KACD,CACD,WAAK,WACH,YAAY,GACZ,cAAa,SACb,KAAA,mBACA,KACA,CACD,WAAA,kCACD,YAAK,GACH,cAAY,SACZ,MAAA,EACA,KAAA,gCACA,KACA,CACA,WAAM,gBACP,YAAA,GACD,cAAK,aACH,cAAY,IACZ,MAAA,EACA,KAAA,uCACA,KACA,CACA,WAAM,oBACP,YAAA,GACD,cAAK,aACH,cAAY,GACZ,MAAA,EACA,KAAA,wCACA,KACD,CACD,WAAK,WACH,YAAY,GACZ,cAAa,aACb,KAAA,wBACA,KACA,CACD,WAAA,WACD,YAAK,GACH,cAAY,SACZ,MAAA,GACA,KAAA,mBACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,+BACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,2BACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,uCACA,KACD,CACD,WAAK,WACH,YAAY,GACZ,cAAa,SACb,KAAA,oBACA,KACA,CACD,WAAA,WACD,YAAK,GACH,cAAY,SACZ,MAAA,GACA,KAAA,iBACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,6BACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,qCACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,IACA,KAAA,yBACA,KACA,CACD,WAAA,cACD,YAAK,GACH,cAAY,SACZ,MAAA,EACA,KAAA,wCACA,KACA,CACD,WAAA,SACD,YAAK,GACH,kBAAY,QACZ,cAAa,UACb,KAAA,kBACA,KACA,CACA,WAAM,cACP,YAAA,GACD,kBAAK,QACH,cAAY,UACZ,MAAA,EACA,KAAA,yBACA,KACD,CACD,WACE,UAEF,YAAM,GACJ,cAAY,UACZ,KAAA,mBACD,CACD,KAAM,CACJ,WAAY,YACb,CACD,KAAM,CAGN,WACE,gBAEF,cACE,EAEF,CAGA,KAAM,CACJ,WAAY,YACb,CACD,KAAM,CACJ,WAAY,+BACb,CACD,KAAM,CAAA,WAAA,6BAAA,MACJ,CAAA,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"}